在一个有两个y轴的图表中,一个用于线图(左),一个用于条形图(右),我希望条形图位于折线图下方以获得更好的可见度而不是uper它
正如你在这张照片上看到的那样(我希望你能看到它),条形图显示了降水的演变和叶绿素指数演变的不同线,我的问题是条形图覆盖了线条我想让这条线变得更好。
这是我的剧本:
figure
yyaxis right
bar (meteo(:,1),meteo(:,14));
ylabel('Precipitation (mm)');
hold on
for i=1:6;
a = [];
b = [];
color = ['r' 'm' 'b' 'c' 'g' 'y'];
for j=0:6
a(i,j+1)=matrice_5(j*6+i,1);%jour
b(i,j+1)=matrice_5(j*6+i,3);%moyenne
end
hold on
yyaxis left
plot(a(i,:),b(i,:),color(i),'LineWidth',1.5);
end
title('Evolution of the mean of the chlorophyll index (HNT) - Charlotte variety');
xlabel('Day (2013)')
ylabel('Chlorophyll index (HNT)')
axis([735390 735442 32 50]);
set(gcf,'Position',[645 206 701 477]);
datetick('x','dd mmm','keepticks')
h=legend('0','50','100','150','200','250','precipitation','Location','best');
v = get(h,'title');
set(v,'string','Nitrogen rate in kg/ha');
set(h,'Position', [0.1793 0.1494 0.1127 0.2446]);
hold on
plot([735422 735422],[32 49],'Color',[.3 .3 .3]);
hold off
到目前为止,我只获得了一半的结果。我想将条形图放在左轴(左轴为y轴),将线图放在右轴上。我想保留左边的叶绿素指数。
感谢您的帮助
答案 0 :(得分:4)
这实际上是一个非常好的问题,因为实际上没有明确记录这样做的方法,并且在所有示例中,右轴上的任何内容都显示在顶部。即使在他们自己网站上的这个example中,也要注意他们在左轴上绘制bar
是多么小心。
因此,作为前言,yyaxis
不会创建单独的轴(如yyplot
所用),而是rather just applies an additional NumericRuler
to the same axes。如果它只是不同axes
,我们可以使用uistack
以我们想要的任何方式重新排序轴,但因为它们是相同的 axes
,我们需要仔细查看控制内容z顺序的axes
属性。
当我们查看这些属性时,yyaxis
会自动将SortMethod
轴更改为children
,其默认值为depth
。这使得出现在左轴上的任何对象都低于添加到右轴的任何对象。所以我们需要做的就是将SortMethod
更改回默认值(depth
),然后排序将依赖于z位置,就像它通常在{{1}内一样}}
作为演示,让我们创建一些数据
axes
创建与你一样的图(一条线和一条带右侧栏的栏)
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);
,它会将行对象置于最顶层。
SortMethod
答案 1 :(得分:0)
这非常有帮助。仅提供更多示例,在有两个折线图的情况下,您需要显式指定ZData
属性以控制堆栈顺序。
days = 0:5:35;
conc = [515 420 370 250 135 120 60 20];
figure
yyaxis left
p1 = plot(days, conc, 'LineWidth', 4);
yyaxis right
p2 = plot(days, fliplr(conc), 'LineWidth', 4);
% orange is on top
get(gca,'SortMethod')
set(gca, 'SortMethod', 'depth')
% orange is still on top
p1.ZData = ones(size(p1.XData));
p2.ZData = zeros(size(p2.XData));
% blue is on top
答案 2 :(得分:0)
在方便的函数中将@Kouichi C. Nakamura包裹起来,将其应用于轴的所有行,得到:
function ax = setZData(ax,val)
ax = arrayfun(@(x)setZData_ax(x,val),ax);
function ax = setZData_ax(ax,val)
ax.ZData = val*ones(size(ax.XData));
end
end
或完整的包装器
function varargout = plotLeftOverRitht(LR,varargin)
% wrapper to plot the left axis of dual-axis plot over the right axis
%% process input
% input string
if strcmpi(LR,'left')
LR = 'left';
val = 1;
elseif strcmpi(LR,'right')
LR = 'right';
val = 0;
else
error('plotLeftOverRitht:Input:LR',"The first input must be either 'left' or 'right'.")
end
% input: axis handle?
if isa(varargin{1},'matlab.graphics.axis.Axes')
ax = varargin{1};
varargin = varargin(2:end);
else
ax = gca;
end
%% main function
% activate left axis
yyaxis( ax, LR);
% call plot
lines = plot( ax, varargin{:});
% set height
setZData(lines,val);
% set sorting order
set(ax, 'SortMethod', 'depth')
%% output
if nargout > 0
varargout = ax;
end
end
将上面的示例更改为
days = 0:5:35;
conc = [515 420 370 250 135 120 60 20];
figure
plotLeftOverRitht('left', days,conc, 'LineWidth',4)
plotLeftOverRitht('right', days,fliplr(conc), 'LineWidth',4)