Подтвердить что ты не робот

MATLAB, заполнение области между двумя наборами данных, строк на одном рисунке

У меня вопрос об использовании функции area; или, возможно, другая функция в порядке... Я создал этот сюжет из большого текстового файла:

http://img818.imageshack.us/img818/9519/iwantthisareafilledin.jpg

Зеленый и синий представляют два разных файла. То, что я хочу сделать, - это заполнить область между красной линией и каждым прогоном, соответственно. Я могу создать участок с аналогичной идеей, но когда я рисую их на одном рисунке, они не перекрываются правильно. По существу, 4 сюжета были бы на одной фигуре.

Надеюсь, это имеет смысл.

4b9b3361

Ответ 1

Создавая ответ @gnovice, вы можете фактически создавать заполненные графики с затенением только в области между двумя кривыми. Просто используйте fill в сочетании с fliplr.

Пример:

x=0:0.01:2*pi;                  %#initialize x array
y1=sin(x);                      %#create first curve
y2=sin(x)+.5;                   %#create second curve
X=[x,fliplr(x)];                %#create continuous x value array for plotting
Y=[y1,fliplr(y2)];              %#create y values for out and then back
fill(X,Y,'b');                  %#plot filled area

enter image description here

Перевернув массив x и объединив его с оригиналом, вы выходите, вниз, назад, а затем вверх, чтобы закрыть оба массива в многогранном многогранном многоугольнике.

Ответ 2

Лично я считаю, что это элегантно и удобно обернуть функцию заполнения. Чтобы заполнить два одинаковых вектора строк Y1 и Y2, которые совместно используют поддержку X (и цвет C):

fill_between_lines = @(X,Y1,Y2,C) fill( [X fliplr(X)],  [Y1 fliplr(Y2)], C );

Ответ 3

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

x = 1:100;             %# X range
y1 = rand(1,100)+1.5;  %# One set of data ranging from 1.5 to 2.5
y2 = rand(1,100)+0.5;  %# Another set of data ranging from 0.5 to 1.5
baseLine = 0.2;        %# Baseline value for filling under the curves
index = 30:70;         %# Indices of points to fill under

plot(x,y1,'b');                              %# Plot the first line
hold on;                                     %# Add to the plot
h1 = fill(x(index([1 1:end end])),...        %# Plot the first filled polygon
          [baseLine y1(index) baseLine],...
          'b','EdgeColor','none');
plot(x,y2,'g');                              %# Plot the second line
h2 = fill(x(index([1 1:end end])),...        %# Plot the second filled polygon
          [baseLine y2(index) baseLine],...
          'g','EdgeColor','none');
plot(x(index),baseLine.*ones(size(index)),'r');  %# Plot the red line

И вот результат:

enter image description here

Вы также можете изменить порядок укладки объектов на рисунке после того, как вы построили их, изменив порядок дескрипторов в 'Children' property объекта осей. Например, этот код меняет порядок укладки, скрывая зеленый полигон за синим полигоном:

kids = get(gca,'Children');        %# Get the child object handles
set(gca,'Children',flipud(kids));  %# Set them to the reverse order

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

set(h2,'FaceAlpha',0.5);

Ответ 4

Вы хотите посмотреть функцию patch() и прокрасться в точки для начала и конца горизонтальной линии:

x = 0:.1:2*pi;
y = sin(x)+rand(size(x))/2;

x2 = [0 x 2*pi];
y2 = [.1 y .1];
patch(x2, y2, [.8 .8 .1]);

Если вы хотите только заполнить область для части данных, вам нужно усечь векторы x и y, чтобы включить только те точки, которые вам нужны.