2013-11-11 2 views
2

Я пытаюсь сделать что-то похожее на то, что описано в этом сообщении: MATLAB, Filling in the area between two sets of data, lines in one figure но работает в блокпост. Я пытаюсь затенять область графика, представляющую среднее +/- стандартное отклонение. Определения переменных немного сложнее, но она сводится к этому коду, и при построении графика без затенения, я получаю скриншот ниже:MATLAB заполняет область между линиями

x = linspace(0, 100, 101)';  
mean = torqueRnormMean(:,1); 
meanPlusSTD = torqueRnormMean(:,1) + torqueRnormStd(:,1); 
meanMinusSTD = torqueRnormMean(:,1) - torqueRnormStd(:,1); 
plot(x, mean, 'k', 'LineWidth', 2) 
plot(x, meanPlusSTD, 'k--') 
plot(x, meanMinusSTD, 'k--') 

mean and std

Но когда я пытаюсь реализовать затенение только на нижнем половина графика (между средним и meanMinusSTD) путем добавления кода ниже, я получаю сюжет, который выглядит следующим образом:

fill([x fliplr(x)], [mean fliplr(meanMinusSTD)], 'y', 'LineStyle','--'); 

shaded

Это, очевидно, не затенение правильной области графика, а новые почти горизонтальные линии создаются рядом с 0, которые воюют с затенением.

Любые мысли? Я в тупике.

ответ

4

Оказалось, что столбец против вектора-строки вопроса. По какой-то причине использование метода заливки выше с flipud с исходными векторами столбца не работает, но переносит исходные переменные, а затем использует fliplr. Идите фигуру. Вот код, в случае, если это поможет кому-то еще:

x = linspace(0,100, 101); 
mean = torqueRnormMean(:,DOF)'; 
meanPlusSTD = torqueRnormMean(:,DOF)' + torqueRnormStd(:,DOF)'; 
meanMinusSTD = torqueRnormMean(:,DOF)' - torqueRnormStd(:,DOF)'; 
fill([x fliplr(x)], [meanPlusSTD fliplr(meanMinusSTD)], 'k'); 
alpha(.25); 
plot(x, mean, 'k', 'LineWidth', 2) 
plot(x, meanPlusSTD, 'k') 
plot(x, meanMinusSTD, 'k') 

Обратите внимание, что я удалил пунктирную линию и только что использовал толстые линии тонких vs. для обозначения стандартного отклонения и среднего. Я сделал это, потому что стиль линии был непоследовательным.Этот код находится в цикле, где DOF работает от 1: 9, и в некоторых подзаголовках кривые std будут разбиты, а в некоторых - только сверху или снизу. Для меня не имело значения, чтобы они были разбиты, поэтому я оставил ее простой. Теперь это пример графа я получаю:

enter image description here

+0

Привет, я предлагаю вам отправить свое полное решение и принять ответ на принятый ответ. Таким образом, если люди с тем же вопросом сталкиваются с вашим постом, они могут легко найти правильный ответ. –

+0

Хорошо, это говорит, что мне нужно подождать 2 дня, чтобы отметить мой собственный, как принятый ответ, но я выложу полный код в среднее время. – dustynrobots

7

Возможно, у вас возникла проблема с использованием mean в качестве переменной, так как это также зарезервированная команда MATLAB. Попробуйте очистить пространство переменных и затем использовать уникальное имя переменной.

Что касается второй проблемы, вы хотите

fill([x fliplr(x)], [meanUniqueName fliplr(meanMinusSTD)], 'y', 'LineStyle','--'); 

Вам также не нужно делать это в два этапа, но может делать все это сразу. Фрагмент код из сценария я в настоящее время работаю над делает одно и то же, и содержит следующие строки:

avar = allan(DATA, tau); 
    xFill = [avar.tau1 fliplr(avar.tau1)]; 
    yFill = [avar.sig2+avar.sig2err fliplr(avar.sig2-avar.sig2err)]; 

    figure(2); 
    fill(xFill,yFill,'y','LineStyle','--') 
    line(avar.tau1,avar.sig2); 

Так я заполняющее пространство между двумя линиями ошибки, а затем нарисуйте линию данных на вершине.

+0

Добавок LineStyle работал (спасибо!), Но даже после очистки переменного пространства и изменения слова значит meanVar я получить те же результаты. – dustynrobots

+0

Просто глядя на график, похоже, что вы заполняете область между 'torqueRnormStd' и' torqueRnormMean-torqueRnormStd'. Это не то, что вы здесь написали, но вот как выглядит ваш график. Возможно, вы где-то переносили имена переменных в свой код? – craigim

+0

Я проверил код и довольно уверен, что имена переменных не были транспонированы. Кроме того, я знаю, что это еще один шаг, но у меня также есть два варианта построения: один, который делает это затенение, а другой, который отображает все отдельные строки набора данных, но в любом случае я показываю средние, средние + SD и средние SD-линии , поэтому они определены в первую очередь. – dustynrobots

3

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

fill([x;flipud(x)], [mean;flipud(meanMinusSTD)], 'y'); 
+0

Я просто попробовал (спасибо за уловку, это имеет смысл), но, к сожалению, это не влияет на график. – dustynrobots

3

Другая возможность:

x = 1:1000; % example x values 
y_upper = 5+sin(2*pi/200*x); % example upper curve 
y_lower = 2+sin(2*pi/230*x); % example lower curve 
bar(x, y_upper, 1, 'b', 'edgecolor', 'b'); 
hold on 
bar(x, y_lower, 1, 'w', 'edgecolor', 'w'); 
axis([0 1000 0 7]) 

Он использует bar (с шириной блока и одного цвета краев), чтобы заполнить верхнюю кривую, а затем второй bar для «удаления» (участок в белом) нижней части.

enter image description here

+0

Это довольно умно! – chappjc

+0

@chappjc Спасибо! 'fill', вероятно, лучше. Если бы только я читал вопросы медленнее ... –

+1

Ну, да, «наполнить» лучше. ;) Но так весело! – chappjc