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

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

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

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

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

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

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

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

Одна из возможностей, которую вы можете попробовать, состоит в том, чтобы создать 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'); 

и вот итоговая цифра:

введите описание изображения здесь

Я знаю о сюжете, которая позволяет вам иметь две оси 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нормализация

Многомасштабные сюжеты редко встречаются за пределами двух осей … К счастью, в 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

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

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

  • Участок внутри цикла в MATLAB
  • Оценка координат узлов узлов
  • Миллионы 3D-точек: как найти 10 из них ближе всего к данной точке?
  • Построение неявных алгебраических уравнений в MATLAB
  • Строковый график в GnuPlot, где цвет линии является третьим столбцом в моем файле данных?
  • Предел подузла MATLAB
  • Алгоритм «приятных» интервалов сетки на графике
  • Хорошая библиотека алгоритмов графа Java?
  • Как отобразить все метки x в R barplot?
  • Выровнять графики ggplot2 по вертикали
  • Как объединить 2 сюжета (ggplot) в один сюжет?
  • Давайте будем гением компьютера.