Построение 4 кривых на одном графике с 3 осями Y

27

У меня есть 4 набора значений: y1, y2, y3, y4 и один набор x. Значения y имеют разные диапазоны, и мне нужно нарисовать их как отдельные кривые с отдельными наборами значений по оси y.

Проще говоря, мне нужно 3 оси y с разными значениями (шкалами) для построения на одном рисунке.

Любая помощь оценивается, или подсказки о том, где искать.

Теги:
plot

5 ответов

21
Лучший ответ

Это отличный шанс познакомить вас с файловым обменом. Хотя организация в последнее время страдает от некоторых очень неудачных вариантов дизайна интерфейса, это по-прежнему большой ресурс для предварительно упакованных решений общих проблем. Хотя многие здесь дали вам подробные сведения о том, как достичь этого (@prm!), У меня была аналогичная потребность несколько лет назад, и я обнаружил, что addaxis работал очень хорошо. (Это был File Exchange выбор недели в один момент!) Он вдохновил позже, вероятно, лучшие моды. Вот пример вывода:

пример addaxis http://www.mathworks.com/matlabcentral/fx_files/9016/1/addaxis_screenshot.jpg

Я просто искал "plotyy" в File Exchange.

Хотя вы понимаете, что происходит в важных, иногда вам просто нужно что-то сделать, а не делать сами. Matlab Central отлично подходит для этого.

  • 0
    Есть ли что-нибудь подобное для оси X?
  • 0
    Мне не нравятся какие-либо решения по обмену файлами (которые я смог найти). Они не позволяют вам поставить все оси Y на одну сторону или другую. Я считаю, что чередующиеся стороны выглядят довольно некрасиво. Единственный, который позволяет всем одной стороне, имеет сложную реализацию для начинающих пользователей.
10

Одна из возможностей, которую вы можете попробовать, состоит в том, чтобы создать 3 оси, уложенные один поверх другого, с атрибутами 'Color' двух верхних наборов на 'none', чтобы все графики были видны. Вам нужно будет отрегулировать ширину оси, положение и пределы оси x, чтобы оси 3 y были бок о бок, а не друг над другом. Вы также хотели бы удалить метки и метки меток оси x из двух осей, поскольку они будут лежать друг над другом.

Здесь общая реализация, которая вычисляет правильные положения для осей и смещений для границ оси x, чтобы поддерживать правильно выстроенные графики:

%# Some sample data:
x = 0:20;
N = numel(x);
y1 = rand(1,N);
y2 = 5.*rand(1,N)+5;
y3 = 50.*rand(1,N)-50;

%# Some initial computations:
axesPosition = [110 40 200 200];  %# Axes position, in pixels
yWidth = 30;                      %# y axes spacing, in pixels
xLimit = [min(x) max(x)];         %# Range of x values
xOffset = -yWidth*diff(xLimit)/axesPosition(3);

%# Create the figure and axes:
figure('Units','pixels','Position',[200 200 330 260]);
h1 = axes('Units','pixels','Position',axesPosition,...
          'Color','w','XColor','k','YColor','r',...
          'XLim',xLimit,'YLim',[0 1],'NextPlot','add');
h2 = axes('Units','pixels','Position',axesPosition+yWidth.*[-1 0 1 0],...
          'Color','none','XColor','k','YColor','m',...
          'XLim',xLimit+[xOffset 0],'YLim',[0 10],...
          'XTick',[],'XTickLabel',[],'NextPlot','add');
h3 = axes('Units','pixels','Position',axesPosition+yWidth.*[-2 0 2 0],...
          'Color','none','XColor','k','YColor','b',...
          'XLim',xLimit+[2*xOffset 0],'YLim',[-50 50],...
          'XTick',[],'XTickLabel',[],'NextPlot','add');
xlabel(h1,'time');
ylabel(h3,'values');

%# Plot the data:
plot(h1,x,y1,'r');
plot(h2,x,y2,'m');
plot(h3,x,y3,'b');

и здесь получившийся рисунок:

Изображение 6394

6

Я знаю plotyy, который позволяет вам иметь две оси y, но не "plotyyy"!

Возможно, вы можете нормализовать значения y для того же масштаба (минимальная нормализация, стандартная zscore и т.д.), тогда вы можете просто построить их с помощью обычной последовательности plot, hold.

Вот пример:

%# random data
x=1:20;
y = [randn(20,1)*1 + 0 , randn(20,1)*5 + 10 , randn(20,1)*0.3 + 50];

%# plotyy
plotyy(x,y(:,1), x,y(:,3))

%# orginial
figure
subplot(221), plot(x,y(:,1), x,y(:,2), x,y(:,3))
title('original'), legend({'y1' 'y2' 'y3'})

%# normalize: (y-min)/(max-min) ==> [0,1]
yy = bsxfun(@times, bsxfun(@minus,y,min(y)), 1./range(y));
subplot(222), plot(x,yy(:,1), x,yy(:,2), x,yy(:,3))
title('minmax')

%# standarize: (y - mean) / std ==> N(0,1)
yy = zscore(y);
subplot(223), plot(x,yy(:,1), x,yy(:,2), x,yy(:,3))
title('zscore')

%# softmax normalization with logistic sigmoid ==> [0,1]
yy = 1 ./ ( 1 + exp( -zscore(y) ) );
subplot(224), plot(x,yy(:,1), x,yy(:,2), x,yy(:,3))
title('softmax')

Изображение 6395Изображение 6396

4

Многомасштабные сюжеты редко встречаются за пределами двух осей... К счастью, в Matlab это возможно, но вы должны полностью перекрывать оси и играть с тиками, чтобы не скрывать информацию.

Ниже приведен хороший рабочий образец. Надеюсь, это то, что вы ищете (хотя цвета могут быть намного приятнее).

close all
clear all 

display('Generating data');

x = 0:10;
y1 = rand(1,11);
y2 = 10.*rand(1,11);
y3 = 100.*rand(1,11);
y4 = 100.*rand(1,11);

display('Plotting');

figure;
ax1 = gca;
get(ax1,'Position')
set(ax1,'XColor','k',...
    'YColor','b',...
    'YLim',[0,1],...
    'YTick',[0, 0.2, 0.4, 0.6, 0.8, 1.0]);
line(x, y1, 'Color', 'b', 'LineStyle', '-', 'Marker', '.', 'Parent', ax1)

ax2 = axes('Position',get(ax1,'Position'),...
           'XAxisLocation','bottom',...
           'YAxisLocation','left',...
           'Color','none',...
           'XColor','k',...
           'YColor','r',...
           'YLim',[0,10],...
           'YTick',[1, 3, 5, 7, 9],...
           'XTick',[],'XTickLabel',[]);
line(x, y2, 'Color', 'r', 'LineStyle', '-', 'Marker', '.', 'Parent', ax2)

ax3 = axes('Position',get(ax1,'Position'),...
           'XAxisLocation','bottom',...
           'YAxisLocation','right',...
           'Color','none',...
           'XColor','k',...
           'YColor','g',...
           'YLim',[0,100],...
           'YTick',[0, 20, 40, 60, 80, 100],...
           'XTick',[],'XTickLabel',[]);
line(x, y3, 'Color', 'g', 'LineStyle', '-', 'Marker', '.', 'Parent', ax3)

ax4 = axes('Position',get(ax1,'Position'),...
           'XAxisLocation','bottom',...
           'YAxisLocation','right',...
           'Color','none',...
           'XColor','k',...
           'YColor','c',...
           'YLim',[0,100],...
           'YTick',[10, 30, 50, 70, 90],...
           'XTick',[],'XTickLabel',[]);
line(x, y4, 'Color', 'c', 'LineStyle', '-', 'Marker', '.', 'Parent', ax4)

alt text http://www.pablorodriguez.info/wp-content/Multiaxes.png

2

PLOTYY позволяет использовать две разные оси y. Или вы можете заглянуть в LayerPlot из Файлового Exchange. Я предполагаю, что я должен спросить, считали ли вы использование HOLD или просто перемасштабирование данных и использование обычного старого графика?

OLD, а не то, что искали OP: SUBPLOT позволяет разбить окно фигуры на несколько осей. Затем, если вы хотите показывать только одну ось x или какую-либо другую настройку, вы можете самостоятельно управлять каждой осью.

  • 0
    Нет, это не так. Они нужны мне на одной фигуре, на одном графике.
  • 0
    о, кажется, у нас было одинаковое представление о plotyy и масштабировании!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню