Matlab, график двух рядов данных на одном графике

Можно ли в MATLAB создать единый график из двух связанных источников данных, при этом первый источник будет отложен вдоль нижней части оси x, а второй источник — сверху вниз по оси x?

Я не могу найти нигде в документации MATLAB, где это делается.

Окончательный график, который мне нужен, имеет такую ​​форму:

http://www.epa.gov/ncer/progress/images/R827933C033_02_003.gif


person AaronThomson    schedule 14.07.2010    source источник


Ответы (2)


Я постарался максимально точно воспроизвести ваш график. Вот что у меня получилось:

t = linspace(datenum('01-19-2002'), datenum('06-27-2002'), 12);
x1 = randi(40, [12 1]);
x2 = randi(40, [12 1]);
z = 100-x1-x2;

hAxR = axes();
hAxL = axes();

h = bar(t, [x1 z x2], 'stacked');

set(h(1),'facecolor','y')
set(h(2),'facecolor',[.8 .8 .8])
set(h(3),'facecolor','r')
legend(h, {'s1' 's2' 's3'}, ...
   'orientation','horizontal', 'location','northoutside')

set(hAxL, 'xtick',t, 'xlim',[datenum('01-01-2002') datenum('07-15-2002')])
datetick(hAxL, 'x',2,'keepticks','keeplimits')
xticklabel_rotate

ylabel(hAxL, 'label1')
ylabel(hAxR, 'label2')

set(hAxR, 'position',get(hAxL,'position'), 'color','none', 'xtick',[], ...
    'ydir','reverse', 'yaxislocation','right', 'ylim',get(hAxL,'ylim'))
set(hAxL, 'YGrid','on')

график

Я использую XTICKLABEL_ROTATE для поворота меток по оси x.

person Amro    schedule 14.07.2010
comment
Гах! Опереди меня на 5 минут! Обратите внимание, что с mathworks.com/matlabcentral/fileexchange/, вы можете получить заштрихованную штриховку для баров. Кроме того, вы можете заменить label1 и label2 на настоящие. +1 за идеальное решение. - person Jonas; 14.07.2010
comment
@Jonas: спасибо, я как раз просматривал заявку на FEX для штриховки в качестве цвета - person Amro; 14.07.2010
comment
Я только что заметил, что вы построили только одну серию баров. Учитывая название вопроса, я подумал, что ОП хочет одну серию столбцов с накоплением с двумя цветами и одну серию столбцов с рисунком штриховки. Таким образом, вам нужно запустить hBL=bar(hAxL,data1);hBR=bar(hAxR,data2). - person Jonas; 14.07.2010
comment
@Jonas: дело в том, что если вы посмотрите на легенду на исходном графике, вы увидите три отдельных ряда данных ... поэтому в приведенном выше примере графика я просто сгенерировал данные, чтобы средний заполнялся между ними, чтобы сделать сумма 100. Я думаю, ОП должен дать описание того, как на самом деле выглядят данные (это была просто попытка визуально воспроизвести сюжет [за исключением меток, мне лень все это печатать!]) - person Amro; 14.07.2010
comment
Фантастический. к вашему сведению. Мой пример графика был изображением, которое я нашел с помощью Google, это не мои данные. Я просто хотел найти что-то близкое к тому, что мне было нужно, потому что мою проблему было трудно объяснить иначе. Я не ожидал, что кто-то так тщательно воспроизведет пример. Если бы я только мог дважды проголосовать за этот ответ. :) - person AaronThomson; 15.07.2010

Ознакомьтесь с документацией по функции bar. Вы можете использовать его для создания графиков, подобных следующим:

bar2.gif

bar_ex2.gif

person Jacob    schedule 14.07.2010
comment
Почему -1? Это не полное решение, но оно должно поставить OP на правильный путь. - person Doresoom; 14.07.2010