Draw stack order for yyaxis

조회 수: 107 (최근 30일)
Charles Brown
Charles Brown 2016년 4월 20일
댓글: Calvin He 2022년 12월 1일
Hello, I'm trying to create an overlaid bar plot using yyaxis. I cannot figure out how to change the stacking order of the two axis objects (and their constituents). The default behavior seems to be that the right yyaxis and its children are above the left yyaxis. Due to the content of my plot, I'd prefer the opposite.
For example, the following script generates two bar plots that are overlaid. One is taller and wider and I'd like it to appear in the background but with its axis on the right side.
backgroundData = [100 75 80 150];
foregroundData = [10 30 25 64];
yyaxis left
bar(foregroundData,'FaceColor','r')
ylabel('Foreground Axis')
yyaxis right
bar(backgroundData,1.0,'FaceColor','b')
ylabel('Background Axis')
I've experimented with uistack, but can't get anything to stick. Of course swapping the left and right axes fixes the issue but I'd rather not do that. Thanks for any insight you can provide.

채택된 답변

Charles Brown
Charles Brown 2016년 4월 20일
I have created a work-around using manually-created axes:
backgroundData = [100 75 80 150];
foregroundData = [10 30 25 64];
% This works because ax1 is created AFTER ax2!
ax2 = axes('Position',[0.1300 0.1100 0.7750 0.8150]);
ax1 = axes('Position',[0.1300 0.1100 0.7750 0.8150]);
% Plotting the two bars on their axes. The order here doesn't matter.
bar(ax2,backgroundData,1.0,'FaceColor','b')
bar(ax1,foregroundData,.3,'FaceColor','r')
% Need to move the Y-axis after plotting the foreground data for some
% reason.
ax2.YAxisLocation = 'right';
ylabel(ax2,'Background Axis')
ylabel(ax1,'Foreground Axis')
% Now we have to set the background of the front axis to be transparent.
set(gca, 'Color', 'None')

추가 답변 (2개)

Kouichi C. Nakamura
Kouichi C. Nakamura 2021년 4월 23일
Just to make it more noticeable, I copy the example here:
days = 0:5:35;
conc = [515 420 370 250 135 120 60 20];
temp = [29 23 27 25 20 23 23 17];
yyaxis right
b = bar(days, temp, 'FaceColor', [0.8 0.8 0.8]);
yyaxis left
p = plot(days, conc, 'LineWidth', 2);
This is the trick!
set(gca, 'SortMethod', 'depth')
  댓글 수: 3
Kouichi C. Nakamura
Kouichi C. Nakamura 2021년 9월 13일
Thanks!
Calvin He
Calvin He 2022년 12월 1일
The problem is if you have multiple plots for the left axis, this reverses the stacking on those, and addes a white border around them.
I am trying to move the dotted gray lines to the back (plotted in yyaxis right)
set(gca,'sortmethod','depth') does this:

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


Mike Garrity
Mike Garrity 2016년 4월 20일
I'm afraid that feature didn't make it into this initial release of yyaxis. As you've noted, the contents of the right side are always on top of the contents of the left side.
I'd be interested in knowing where you first looked when you were trying to figure out how to switch it. , because we've been trying to figure out what the most natural API would be for this.
  댓글 수: 13
Joey
Joey 2018년 11월 5일
+1
please enable uistack to allow my yyaxis right curves to be in the background
DJ
DJ 2018년 11월 18일

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

카테고리

Help CenterFile Exchange에서 Annotations에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by