用一个 y 轴和两个 x 轴绘制两组数据

Plot two sets of data with one y-axis and two x-axes

我已经阅读了几个关于为数据设置两个 x 轴的 SO 答案,以及 mathworks.com 上的一些教程,但我没有找到完全执行以下操作的方法:

正常绘制数据集一。 在图表的顶部创建第二个 x 轴,但对下一个数据集使用现有的 y 轴。 绘制第二个数据集,使其控制第二个 x 轴(缩放等)并且不会覆盖或重新缩放现有的单个 y 轴。

这样做的原因是我想根据相同的源数据集绘制两组不同的类似直方图的值,因此频率分布在幅度上相似,但是 bin 的值 sizes/edges不同。

我的后备方案是对第二个数据集的 x-data 进行点斜率缩放,但我仍然必须创建类似于 的第二个 x 轴。

您可以在第一个轴的顶部(在同一位置)创建第二个轴,它 XAxisLocation set to 'top', has no Color so it's transparent, has no yticks, and has it's YLim link 编辑到第一个轴的轴。此外,我们可以 link Position 值以确保如果我们调整其中一个轴的大小,它们会一起调整以保持其外观。

figure;

% Create the first axes
hax1 = axes();

% Plot something here
xdata = 1:10;
hplot1 = line(xdata, log(xdata));
    
% Create a transparent axes on top of the first one with it's xaxis on top
% and no ytick marks (or labels)
hax2 = axes('Position', get(hax1, 'Position'), ...  % Copy position
            'XAxisLocation', 'top', ...             % Put the x axis on top
            'YAxisLocation', 'right', ...           % Doesn't really matter
            'xlim', [2 20], ...                     % Set XLims to fit our data
            'Color', 'none', ...                    % Make it transparent
            'YTick', []);                           % Don't show markers on y axis
            
% Plot data with a different x-range here

hplot2 = line(xdata * 2, log(flip(xdata)), 'Color', 'r', 'Parent', hax2);

% Link the y limits and position together
linkprop([hax1, hax2], {'ylim', 'Position'});

% Draw some labels
xlabel(hax1, 'Blue Line')
xlabel(hax2, 'Red Line')
ylabel(hax1, 'Some Value')

% Add a legend? Why not?!
legend([hplot1, hplot2], {'Blue', 'Red'})

Carl W(OP)编辑

当刻度间距顶部和底部不同时,上面的代码将导致丑陋的 XTicks。 我在 matlab remove only top and right ticks with leaving box on 找到了解决方法。我将上面的代码稍微修改为

figure
xdata = 1:10;
plot(xdata)
% get handle to current axes
hax1 = gca;
% set box property to off 
set(hax1,'box','off','color','white')

hax2 = axes('Position', get(hax1, 'Position'),'box','off', ...  % Copy position
            'XAxisLocation', 'top', ...             % Put the x axis on top
            'YAxisLocation', 'right', ...           % Doesn't really matter           
            'Color', 'none', ...                    % Make it transparent
            'YTick', []); 

警告:这将不能plot一起工作,它将覆盖现有的轴分配。

因为没有 points 函数(愚蠢的 MathWorks)我不得不做 line(x,y,'linestyle','none','marker','x','parent',hax2) 来获得分数。

hplot2 = line(5:25, log((5:25)), 'Color', 'r', 'Parent', hax2);

linkprop([hax1,hax2],{'ylim','Position'});

这给出

这是我使用 plotyy.

的怪异方式

代码:-

%Random values for axes
BotttomXaxis = 1:10;
Yaxis =1:3:30;
TopXaxis = (11:20:200).^3;

[ax,H1,H2]= plotyy(Yaxis,BotttomXaxis,Yaxis,TopXaxis)
view([90 -90])

% Now labeling the axes, notice carefully where I have written to write y and x labels.
xlabel('Enter ylabel of the y-axis here')
ylabel(ax(1), 'Enter xlabel of the bottom x-axis here');
ylabel(ax(2), 'Enter xlabel of the top x-axis here');

我觉得没有必要在这里添加图例,因为坐标轴和绘图颜色已经表明了图例。见下图:

但是如果你还想添加图例,可以使用下面的方法:

legend(H1,'Legend of Bottom X-axis','Location','northeast');
legend(H2,'Legend of Top X-axis','Location','northeast');
%Specifying the Legend location is necessary here

输出:-