13 views (last 30 days)
Show older comments
Mark on 4 Oct 2011
Accepted Answer: Fangjun Jiang
Open in MATLAB Online
Hello,
I'm trying to create a boxplot for two groups. Each group's label is multi line. I have tried the approach below, but the first line of each label is drawn on top of the x axis, while the second is drawn below the x axis (please try the code below)
Does anyone know how to make the two lines be drawn below the x axis in a boxplot?
Thanks
%%%%%%%%%%%
Dist1 = rand(10, 1);
Dist2 = rand(10, 1);
group = [repmat(cellstr(sprintf('First Line G1\nSecond Line G1')), length(Dist1), 1); ...
repmat(cellstr(sprintf('First Line G2\nSecond Line G2')), length(Dist2), 1)];
figurePlot = figure('visible', 'on');
boxplot([Dist1;Dist2], group)
ylabel('Y Label');
0 Comments Show -2 older commentsHide -2 older comments
Show -2 older commentsHide -2 older comments
Sign in to comment.
Sign in to answer this question.
Accepted Answer
Fangjun Jiang on 4 Oct 2011
Open in MATLAB Online
After your plot, use findobj() to find the handles of the two labels and then change the position.
h=findobj(gca,'type','text');
char(get(h,'String'))
get(h,'Position')
ans =
First Line G2
Second Line G2
First Line G1
Second Line G1
ans =
[1x3 double]
[1x3 double]
6 Comments Show 4 older commentsHide 4 older comments
Show 4 older commentsHide 4 older comments
Mark on 4 Oct 2011
Direct link to this comment
https://support.mathworks.com/matlabcentral/answers/17440-boxplot-with-multiline-x-axis-labels#comment_38647
⋮
Thanks but then how do you set the new position? I tried the following but it does not work:
Dist1 = rand(10, 1);
Dist2 = rand(10, 1);
group = [repmat(cellstr(sprintf('First Line G1\nSecond Line G1')), length(Dist1), 1); ...
repmat(cellstr(sprintf('First Line G2\nSecond Line G2')), length(Dist2), 1)];
figurePlot = figure('visible', 'on');
boxplot([Dist1;Dist2], group)
ylabel('Y Label');
h=findobj(gca,'type','text');
posText = get(h,'Position')
offset = [0 10 0];
set(h,'Position', [posText{1, :} - offset;posText{2, :} - offset]);
Fangjun Jiang on 4 Oct 2011
Direct link to this comment
https://support.mathworks.com/matlabcentral/answers/17440-boxplot-with-multiline-x-axis-labels#comment_38650
You can't use set() like that. It has to be done one by one.
h=findobj(gca,'type','text');
set(h(1),'Position',get(h(1),'Position')-10);
set(h(2),'Position',get(h(2),'Position')-10);
Mark on 4 Oct 2011
Direct link to this comment
https://support.mathworks.com/matlabcentral/answers/17440-boxplot-with-multiline-x-axis-labels#comment_38657
Thanks so much Fangjun. That worked as I wanted. I owe you a beer :-)
Unfortunately, when I try to either print or save the figure, the axis labels go back to their original position. For instance, you can try this and see:
strFName = 'c:\someFig.png';
saveas(figurePlot, strFName);
The image is saved with the labels in the original place.
Any clue as to how to avoid this?
Thanks in advance.
Walter Roberson on 4 Oct 2011
Direct link to this comment
https://support.mathworks.com/matlabcentral/answers/17440-boxplot-with-multiline-x-axis-labels#comment_38662
The print() operation involves a resize callback on the figure to size it to the paper size. Setting the figure PaperPositionMode to manual can help that, as can providing your own figure resize function. What you are doing, though, is inherently a bit weak in the face of resizes.
What I would suggest is that instead of working with \n, that you instead pass in a LaTex or Tex command for each group that encodes the linebreak within it. Then, right after the boxplot(),
set(findobj(gca,'-depth',1,'Type','text'),'Interpreter','latex')
(or tex if you prefer that.)
Fangjun Jiang on 4 Oct 2011
Direct link to this comment
https://support.mathworks.com/matlabcentral/answers/17440-boxplot-with-multiline-x-axis-labels#comment_38665
I had the same problem using saveas() or print(). Walter's suggestion is probably the best option. However, I can't test it at this moment.
Fangjun Jiang on 5 Oct 2011
Direct link to this comment
https://support.mathworks.com/matlabcentral/answers/17440-boxplot-with-multiline-x-axis-labels#comment_38755
I used Tex formatting but it still shows the first line label above the x-axis. So it still requires changing the position to move it down. Then when using saveas(), the label still moves up. Please post another question using the following code, there might be experts on graphics who can help you.
Dist1 = rand(10, 1);
Dist2 = rand(10, 1);
group = [repmat({'First Line G1\newlineSecond Line G1'}, length(Dist1), 1); ...
repmat({'First Line G2\newlineSecond Line G2'}, length(Dist2), 1)];
figurePlot = figure('visible', 'on');
boxplot([Dist1;Dist2], group)
ylabel('Y Label'); grid;
h=findobj(gca,'type','text');
set(h,'Interpreter','tex')
set(h(1),'Position',get(h(1),'Position')-10);
set(h(2),'Position',get(h(2),'Position')-10);
saveas(figurePlot,'test.png');
Sign in to comment.
More Answers (1)
Walter Roberson on 4 Oct 2011
Using string with newlines in them is not promised to work for any of the MATLAB graphical text operations that I can think of at the moment.
Some graphical operations permit character arrays with multiple rows; some graphical operations permit strings with the lines separated by '|'; some graphical operations permit cell arrays of strings; some permit TeX or LaTeX that include coded indications of line breaks. And some graphical text operations just plain only permit single lines. Sometimes the easiest way to work around the matter is to go in to the object (e.g., axes) properties and bash the usual text object handle to be an annotation object handle.
4 Comments Show 2 older commentsHide 2 older comments
Show 2 older commentsHide 2 older comments
Fangjun Jiang on 4 Oct 2011
Direct link to this comment
https://support.mathworks.com/matlabcentral/answers/17440-boxplot-with-multiline-x-axis-labels#comment_38630
In this case, the OP is not using newline. cellstr() is used. However, I found that in R2007b, it is displayed in one line. In R2010b, it is displayed in two lines.
Walter Roberson on 4 Oct 2011
Direct link to this comment
https://support.mathworks.com/matlabcentral/answers/17440-boxplot-with-multiline-x-axis-labels#comment_38633
cellstr() does not break the strings at newline characters. A "row" for cellstr purposes is the same thing as a MATLAB array row.
Walter Roberson on 4 Oct 2011
Direct link to this comment
https://support.mathworks.com/matlabcentral/answers/17440-boxplot-with-multiline-x-axis-labels#comment_38634
Did you perhaps miss the sprintf('....\n...') ? That creates a character vector with the \n replaced by char(10) and does *not* create two rows of characters.
Fangjun Jiang on 4 Oct 2011
Direct link to this comment
https://support.mathworks.com/matlabcentral/answers/17440-boxplot-with-multiline-x-axis-labels#comment_38639
Yep. I see you point.
>> a=['abc';'efg'];
A=cellstr(a)
b=sprintf('abc\nefg');
B=cellstr(b)
A =
'abc'
'efg'
B =
[1x7 char]
Sign in to comment.
Sign in to answer this question.
See Also
Categories
MATLABGraphicsFormatting and AnnotationLabels and Annotations
Find more on Labels and Annotations in Help Center and File Exchange
Tags
- boxplot
- multiline x axis labels
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- Deutsch
- English
- Français
- United Kingdom(English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)
Contact your local office