MATLAB, заполнение области между двумя наборами данных, строки на одной фигуре - PullRequest
40 голосов
/ 06 июня 2011

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

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

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

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

Ответы [ 4 ]

53 голосов
/ 27 сентября 2011

Основываясь на ответе @ 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 и объединив его с оригиналом, вы уйдете вниз, назад, а затем вверх, чтобы закрыть оба массива в полном многоугольнике многоугольника.

13 голосов
/ 17 мая 2013

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

fill_between_lines = @(X,Y1,Y2,C) fill( [X fliplr(X)],  [Y1 fliplr(Y2)], C );
11 голосов
/ 06 июня 2011

Вы можете сделать это, используя функцию 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' объекта axes.Например, этот код меняет порядок наложения, скрывая зеленый многоугольник за синим многоугольником:

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 голосов
/ 06 июня 2011

Вы хотите взглянуть на функцию 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, чтобы включить только те точки, которые вам нужны.

...