Как вставить две оси X в Matlab график

Я хотел бы создать фигуру Matlab с двойной осью X (м /с и км /ч) с тем же графиком.

Я нашел plotyy и - в Matlab reposity - plotyyy, но я ищу:

  1. Двойная ось X.
  2. Вместе под сюжетом.

Мой код очень прост:

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

grid on

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

M(:, 1) - это скорость (в м /с), а M(:, 3) это данные.

Мне нужна только вторая строка внизу со скоростями в м /с.

12 голосов | спросил Giacomo Alessandroni 23 J0000006Europe/Moscow 2015, 20:20:06

3 ответа


0

Вы можете сделать что-то вроде следующего. По сравнению с решением @ Benoit_11 я использую обычные метки Matlab и обращаюсь к обеим осям с ручками, поэтому назначения являются явными.

Пример графика

Следующий код создает пустую ось X b с единицами измерения m /s с незначительным рост. После этого фактический график рисуется во второй оси a, расположенной чуть выше других осей, и с единицами измерения км /ч. . Чтобы построить график на определенных осях, вставьте дескриптор оси в качестве первого аргумента stem. Преобразование из м /с в км /ч напрямую записывается в вызове stem

% 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');
ответил Matt 23 J0000006Europe/Moscow 2015, 21:03:35
0

В качестве очень простой альтернативы вы также можете создать вторую ось (прозрачную) и расположить ее под первой так, чтобы вы видели только ось х.

Пример:

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 для каждого устройства, например, другого цвета.

ответил Benoit_11 23 J0000006Europe/Moscow 2015, 20:50:15
0

Лучший способ сделать это - использовать 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

Это не проверено, вам, возможно, придется немного повозиться, но, надеюсь, это поставит вас на правильный путь.

ответил Fantastic Mr Fox 23 J0000006Europe/Moscow 2015, 20:44:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132