Разместите несколько похожих данных на одном графике - PullRequest
0 голосов
/ 07 июня 2018

Я хотел сгенерировать график (X против Y), и значения Z зависят от Y. Пример показан на рисунке ниже.Размер матрицы X совпадает с Z, но не с Y. Я могу построить Z против X, но я хотел объединить весь график в один график и стать Y против X. Я могу построить несколько графиков на одном графике, но графикперекрывает друг друга.

У меня есть вопрос, есть ли способ объединить несколько графиков в один график, не перекрывая каждый график, так как разница между каждым графиком очень мала (например, Z1 = 1,2,3,4, 5 и Z2 = 1,0001,2,0002,3,0001,4,0002,5,0001).Итак, я хотел установить каждый график Z ​​на разные оси Y.(например, Z1 при Y = 0, Z2 при Y = 2 ...)

enter image description here enter image description here

Есть ли у кого-нибудькакие-либо предложения или идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Я поясню идеи, которые я написал в комментарии.Во-первых, давайте получим некоторые данные:

x = 470:0.1:484;
z1 = cos(x)/2;
z2 = sin(x)/3;
z3 = cos(x+0.2)/2.3;

Я нанесу на карту только три набора данных, все это тривиально, чтобы распространиться на любое количество наборов данных.

Идея 1: несколько осей

Идея здесь заключается в том, чтобы просто использовать subplot для создания графика с несколькими кратными типами:

ytick = [-0.5,0.0,0.5];
ylim = [-0.9,0.9]);
figure

h1 = subplot(3,1,1);
plot(x,z1);
set(h1,'ylim',ylim,'ytick',ytick);
title('z1')

h2 = subplot(3,1,2);
plot(x,z2);
set(h2,'ylim',ylim,'ytick',ytick);
title('z2')

h3 = subplot(3,1,3);
plot(x,z3);
set(h3,'ylim',ylim,'ytick',ytick);
title('z3')

enter image description here

Примечаниечто возможно, например, удалить метки галочек с двух верхних графиков, оставив только метки на нижних.Затем вы также можете переместить оси так, чтобы они были ближе друг к другу (что может потребоваться, если на одном графике много линий):

set(h1,'xticklabel',[],'box','off')
set(h2,'xticklabel',[],'box','off')
set(h3,'box','off')
set(h1,'position',[0.13,0.71,0.8,0.24])
set(h2,'position',[0.13,0.41,0.8,0.24])
set(h3,'position',[0.13,0.11,0.8,0.24])
axes(h1)
title('')
ylabel('z1')
axes(h2)
title('')
ylabel('z2')
axes(h3)
title('')
ylabel('z3')

enter image description here

Идея 2: те же оси, график со смещением

Это более простой подход, поскольку вы имеете дело только с одной осью.@Zizy Archer уже показал, как легко перемещать данные, если они все в одной 2D матрице Z.Здесь я просто нанесу z1, z2+2 и z3+4.Настройте смещения по своему вкусу.Затем я установил свойство 'ytick', чтобы создать иллюзию отдельных графиков, и установил свойство 'yticklabel', чтобы числа вдоль оси y соответствовали фактическим нанесенным данным.Конечный результат аналогичен графику с несколькими осями выше, но все они в одной оси:

figure
plot(x,z1);
hold on
plot(x,z2+2);
plot(x,z3+4);
ytick = [-0.5,0.0,0.5];
set(gca,'ytick',[ytick,ytick+2,ytick+4]);
set(gca,'yticklabel',[ytick,ytick,ytick]);
text(484.5,0,'z1')
text(484.5,2,'z2')
text(484.5,4,'z3')

enter image description here

0 голосов
/ 08 июня 2018

Самое простое было бы сдвинуть данные Z.Но обратите внимание, что Z2 будет выглядеть как колеблющийся вокруг 1 - так что это аккуратное визуальное представление, но может ввести в заблуждение.

% Simple version - shift Z curves by 0, 1, ... (as recommended by @Cris Luengo)
shiftMat = repmat(0 : size(Z, 2)-1, size(Z,1), 1);
Z = Z + shiftMat;

%Min shift up to have non-overlapping - curves touching
for i = 2 : size(Z, 2)
   Zdif = (Z(:, i-1) - Z(:, i));
   Z(:, i) = Z(:, i) + max(Zdif); % + 0.01 to separate them a little bit.
end

%Bigger shift up, to have all points of Z(2) equal or above all points of z1.
for i = 2 : numZ
    Zdif = max(Z(:, i-1))-min(Z(:, i));
    Z(:, i) = Z(:, i) + Zdif;
end

Другая возможность состоит в том, чтобы иметь множественную ось Y и каждую кривую Z, построенную относительно ее собственнойОсь YЭто, вероятно, причудливее и не должно вводить в заблуждение, но это намного больше работы, даже после того, как вы захватите функцию, поскольку вам все еще нужно расположить все эти оси.MATLAB по умолчанию позволяет вам использовать только 2 оси, поэтому возьмите функцию из fileexchange, чтобы добавить больше: https://www.mathworks.com/matlabcentral/fileexchange/9016-addaxis

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...