boxchart and ylim auto

조회 수: 32 (최근 30일)
Guillaume Le Goc
Guillaume Le Goc 2020년 4월 8일
편집: Scott MacKenzie 2021년 5월 6일
Hello,
I'm struggling with a weird effect of the new (R2020a) boxchart function. The latter is essentially the same thing as boxplot, but much nicer.
I used to produce boxplots, and adding significance stars from pvalue using the sigstar function from Rob Campbell. The stars and bars were nicely displayed (not too high, not too low, not interfering with data...).
To get the good positions for the stars and bars, the strategy emploed is quite simple : make the axis tight, and zoom in the xaxis around the data. Since axis are set to tight, the y axis is automatically rescaled to match the min and max values of the displayed data. Extract the max value, add some offset, and everything is fine.
Now, when creating the boxplot with the boxchart function, and adding stars and bars with sigstar, the stars and bars are way too high.
After investigation, this is because after adjusting the x axis on a plot made with boxchart, the y axis is not automatically adjusted, even though the ax.YAxis.LimitsMode is set to 'auto', as if the internal algorithm used for adjusting axis still take into account the whole plot.
Any idea of why such behavior ? And any idea of a workaround ?
I would like to keep things simple. What I like with this method is that it is "graphic" exploiting the automatic features from Matlab, without the need to play around with the actual YData.
Cheers,
Guillaume
[Update] Here some code to reproduce the bug.
x = [1, 1, 2, 2, 3, 3];
y = [0.1, 0.15, 0.15, 0.2, 0.5, 0.8];
figure; boxplot(y, x);
xlim([0.9, 2.1]);
ylim auto
Produces :
While
figure; boxchart(x, y);
xlim([0.9, 2.1]);
ylim auto
Produces :
  댓글 수: 2
Guillaume Le Goc
Guillaume Le Goc 2020년 4월 9일
A temporary fix to achieve my needs is to get the YData from the zoomed x range to get the max value. It's kinda dirty.
x = [minrange, maxrange];
children = get(gca, 'Children');
prevmax = 0;
for idc = 1:numel(children)
S = children(idc);
if isa(S, 'matlab.graphics.primitive.Text')
continue;
end
% Most of graphics objects should have XData and YData. I hope...
ydatarange = S.YData(S.XData >= x(1) & S.XData <= x(2));
if ~isempty(ydatarange)
prevmax = max(prevmax, max(ydatarange));
end
end
Ymax = prevmax;
Scott MacKenzie
Scott MacKenzie 2021년 5월 6일
편집: Scott MacKenzie 2021년 5월 6일
I don't think what you are observing is a bug. It has more to do with how you are using boxchart. For basic use, only one data variable (let's call it y) is provided as input to boxchart. Each box in the chart shows the data spread for one column of data in y
y = rand(10,3);
boxchart(y);
When you provide two data arguments as input, the first is treated as a grouping variable. In your first example, you provided y (equal to 0.1, 0.15, 0.15, 0.2, 0.5, 0.8) as the grouping variable. I don't think that's what you intended.

댓글을 달려면 로그인하십시오.

답변 (0개)

카테고리

Help CenterFile Exchange에서 Graphics Object Properties에 대해 자세히 알아보기

제품


릴리스

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by