仅在一侧的每个绘图的带有轴的matlab图

时间:2012-02-11 11:49:41

标签: matlab plot

以下代码显示了我的问题。如果蜱不在两侧的相同位置(这是正常情况......),则情节完全失败。

我需要一个带有两个y轴但仅在一侧有刻度的图。我被建议使用addaxis,但我不知道这对我有什么帮助,因为我不想要分离轴。

clf;
clc;
xaxis = 0:0.1:25;
ydata1 = linspace(12.1712,12.7679, length(xaxis));
ydata2 = linspace(0.3597,-28.7745, length(xaxis));

[AX,H1,H2] = plotyy(xaxis, ydata1, xaxis, ydata2);

% axis limits - x axis (min to max)
xlimits(1) = min(xaxis); xlimits(2) = max(xaxis);
set(AX, 'XLim', xlimits);
set(AX(2),'XTick',[]);

% y1 axis limits 
ylimits(1) = min(ydata1); ylimits(2) = max(ydata1);
ylimits(2) = ylimits(2) + (ylimits(2)-ylimits(1))*0.05;
set(AX(1), 'YLim', ylimits);

% y2 axis limits 
ylimits(1) = min(ydata2); ylimits(2) = max(ydata2);
ylimits(2) = ylimits(2) + (ylimits(2)-ylimits(1))*0.05;
set(AX(2), 'YLim', ylimits);

% y1 ticks 
set(AX(1),'YTick',[12.0:0.1:12.8]);
% y2 ticks 
set(AX(2),'YTick',[-25:5:0]);

print(gcf, ['-r' num2str(400)], ['test' '.png' ], ['-d' 'png']);

enter image description here

4 个答案:

答案 0 :(得分:2)

到Matthias,

将XAxisLocation设置为top,并禁用XTickLabel。上面的线现在回来了:)

set(AX(2),'XAxisLocation','top', 'XTickLabel',[])

答案 1 :(得分:0)

尝试将刻度设置为空集:

 set(AX(2),'YTick',[]);

 set(AX(1),'YTick',[]);

修改(1):您可以手动为左侧创建标签,并将右侧设置为[]

clf;
clc;
xaxis = 0:0.1:25;
ydata1 = linspace(12.1712,12.7679, length(xaxis));
ydata2 = linspace(0.3597,-28.7745, length(xaxis));

[AX,H1,H2] = plotyy(xaxis, ydata1, xaxis, ydata2);

% axis limits - x axis (min to max)
xlimits(1) = min(xaxis); xlimits(2) = max(xaxis);
set(AX, 'XLim', xlimits);
set(AX(2),'XTick',[]);

% y1 axis limits 
ylimits(1) = min(ydata1); ylimits(2) = max(ydata1);
ylimits(2) = ylimits(2) + (ylimits(2)-ylimits(1))*0.05;
set(AX(1), 'YLim', ylimits);

x  = linspace(ylimits(1),ylimits(2),10);
ticks1 =  arrayfun(@(t){sprintf('%2.2f',t)},x);


% y2 axis limits 
ylimits(1) = min(ydata2); ylimits(2) = max(ydata2);
ylimits(2) = ylimits(2) + (ylimits(2)-ylimits(1))*0.05;
x  = linspace(ylimits(1),ylimits(2),10);
ticks2 =  arrayfun(@(t){sprintf('%2.2f',t)},x);
set(AX(2), 'YLim', ylimits);

ticks = cell(size(ticks1));
for i=1:numel(ticks1)
    ticks{i} = sprintf('%s / %s',ticks1{i},ticks2{i});
end
% y1 ticks 
set(AX(1),'YTickLabel',ticks);
% % y2 ticks 
set(AX(2),'YTick',[]);

答案 2 :(得分:0)

这是我从mathworks forum获得的方法。我们的想法是删除box属性,在另一侧创建抽搐。

set(AX(1),'Box','off') % Turn off box of axis 1, which removes its right-hand ticks
set(AX(2),'Box','off') % Turn off box of axis 2, which removes its left-hand ticks

缺点是,上线消失了。如果有人知道怎么回来那会很棒。 Mybe在当前情节上有一个空图,具有相同的尺寸?

enter image description here

答案 3 :(得分:0)

这是一个解决方案 使用 第三个轴。对于此解决方案,首先转动建议的框

set(ax(1),'Box','off') % Turn off box of axis 1, which removes its right-hand ticks
set(ax(2),'Box','off') % Turn off box of axis 2, which removes its left-hand ticks

现在,另外在同一位置添加第三个轴。

    ax3 = axes( 'Position',         get(ax(1), 'Position'),...
                'XAxisLocation',    'top',...
                'XTickLabel',       my_XTickLabels_on_top,...
                'YColor',           'none',...
                'YTick',            [],...
                'YTickLabel',       [],...
                'Color',            'none', ...
                cell_with_further_pValPairs{:});

还可以链接所有轴对象的'x'轴。然后,限制和刻度将相应更新。

    linkaxes([ax ax3], 'x')

然而,这将不能正确更新第三轴的刻度,除非您编写了一个正确的回调,这在MATLAB 2014b及更高版本中变得更加棘手 制作真实的'轴是当前轴,可以使用

    axes(ax)

实施例

enter image description here