2009-11-12 3 views
28

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

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

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

ответ

22

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

addaxis example http://www.mathworks.com/matlabcentral/fx_files/9016/1/addaxis_screenshot.jpg

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

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

+0

Есть ли что-нибудь подобное для оси х? – smihael

2

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

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

+0

Нет. Это не то. Мне нужны они на одной фигуре, на одном графике. – Rook

+0

О, похоже, у нас была та же идея плоской и масштабирования! – Amro

+0

@Amro - вид, моя идея масштабирования должна была быть чем-то вроде линий деления всех векторов на их макс. Ваш пример довольно сложный! – mtrw

6

Я знаю plotyy, что позволяет вам иметь две оси y, но не «сюжетьи»!

Возможно, вы можете нормализовать значения 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') 

plotyy normalization

10

Одним из возможных вариантов вы можете попробовать это создать 3 оси сложенных один на другой с 'Color' свойств верхней два набора для 'none' так что все графики видны. Вам нужно будет отрегулировать ширину оси, положение и пределы оси x, чтобы оси 3 y были бок о бок, а не друг над другом. Вы также хотели бы удалить метки и метки меток оси 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'); 

и вот результирующий показатель:

enter image description here

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

Смежные вопросы