如何在 Matlab 绘图中插入两个 X 轴

Posted

技术标签:

【中文标题】如何在 Matlab 绘图中插入两个 X 轴【英文标题】:How to insert two X axis in a Matlab a plot 【发布时间】:2015-09-09 15:22:09 【问题描述】:

我想创建一个具有相同绘图的双 X 轴(m/s 和 km/h)的 Matlab 图形。

我找到了 plotyy 和 - 在 Matlab 存储库中 - plotyyy,但我正在寻找:

    双 X 轴。 在情节下方。

我的代码很简单:

stem(M(:, 1) .* 3.6, M(:, 3));

grid on

xlabel('Speed (km/h)');
ylabel('Samples');

M(:, 1) 是速度(单位为 m/s),M(:, 3) 是数据。

我只想要第二行,在底部,速度以 m/s 为单位。

【问题讨论】:

如果您可以使用顶部的第二个 x 轴,那么只需应用 this solution 并将所有 y 替换为 x。如果您真的希望两者都在底部,我需要让您失望,要接近可接受的时尚将是真正的痛苦。我建议,使用链接的解决方案,只需在使用 inkscape、Illustrator 等进行后期处理时向下移动顶轴即可。您可以省去很多麻烦。 【参考方案1】:

您可以执行以下操作。与 @Benoit_11 的解决方案相比,我确实使用了普通的 Matlab 标签,并使用句柄引用了两个轴,因此分配是明确的。

以下代码创建一个空的 x 轴 b,其单位为 m/s,高度可忽略不计。在此之后,实际绘图将在第二个轴a 中绘制,该轴位于其他轴上方一点,单位为 km/h。要在特定轴上绘图,请将轴句柄作为stem 的第一个参数插入。从 m/skm/h 的转换直接写在对 stem 的调用中。最后,需要将两个轴的xlim-property 设置为相同的值。

% experimental data
M(:,1) = [ 0,  1,  2,  3,  4,  5];
M(:,3) = [12, 10, 15, 12, 11, 13];

% get bounds
xmaxa = max(M(:,1))*3.6;    % km/h
xmaxb = max(M(:,1));        % m/s


figure;

% axis for m/s
b=axes('Position',[.1 .1 .8 1e-12]);
set(b,'Units','normalized');
set(b,'Color','none');

% axis for km/h with stem-plot
a=axes('Position',[.1 .2 .8 .7]);
set(a,'Units','normalized');
stem(a,M(:,1).*3.6, M(:,3));

% set limits and labels
set(a,'xlim',[0 xmaxa]);
set(b,'xlim',[0 xmaxb]);
xlabel(a,'Speed (km/h)')
xlabel(b,'Speed (m/s)')
ylabel(a,'Samples');
title(a,'Double x-axis plot');

【讨论】:

我在您的代码中为xlim 插入了一个功能。我写:XT = [min(get(a, 'XTick')) max(get(a, 'XTick'))];,然后我用set(a, 'xlim', XT);set(b, 'xlim', XT./3.6); 设置了限制。通过此操作,我不会将 min 'xlim' 强制为零。 代码说明:这样,在用于实际绘图的轴下方绘制了第二个高度几乎为零的空 x 轴 (b, m/s) (1e-12)。请注意,两个轴的位置手动设置为具有相同的 x 位置和宽度,但不同的 y 位置(a 设置为高于 b)。在任何情况下,请注意您必须在绘图中使用上轴,即使您需要先转换 x 值。 @MakisH 没错。我只是添加了一些解释。【参考方案2】:

作为一个非常简单的替代方案,您还可以创建第二个轴(透明)并将其放在第一个轴的下方,这样您就只能看到 x 轴。

例子:

clear
clc
close all

x = 1:10;

x2 = x/3.6;

y = rand(size(x));

hP1 = plot(x,y);

a1Pos = get(gca,'Position');

%// Place axis 2 below the 1st.
ax2 = axes('Position',[a1Pos(1) a1Pos(2)-.05 a1Pos(3) a1Pos(4)],'Color','none','YTick',[],'YTickLabel',[]);

%// Adjust limits
xlim([min(x2(:)) max(x2(:))])

text(2.85,0 ,'m/s','FontSize',14,'Color','r')
text(2.85,.05 ,'km/h','FontSize',14,'Color','r')

输出:

然后您可以手动为每个单元添加 x 标签,例如以不同的颜色。

【讨论】:

【参考方案3】:

我能想到的最好方法是使用 2 个图,例如,您可以通过执行以下操作将图分成一个大的部分和一个小的部分:

subplot(100, 1, 1:99) // plot your graph as you normally would
plot(...

subplot(100, 1, 100) // Plot a really small plot to get the axis
plot(...)
b = axis()
axis([b(1:2), 0, 0]) // set the y axis to really small

这是未经测试的,您可能需要稍微摆弄一下,但希望它能让您走上正确的轨道。

【讨论】:

以上是关于如何在 Matlab 绘图中插入两个 X 轴的主要内容,如果未能解决你的问题,请参考以下文章

如何在matlab中为图形加标注以及文字说明

用matlab绘图时,如何只设定一个轴范围?

matlab里怎么画一个x轴两个y轴的图

Matlab:在不同图形的两个轴上绘图

MATLAB用作图之后如何把y轴的坐标值放到两个刻度之间?

matlab画图 如何将两个共用x轴的图画在一幅图上 使上边为一个y轴,下边为不同的y轴?