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

#matlab #plot #fill #area

#matlab #график #заполнение #область

Вопрос:

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

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

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

Я надеюсь, что это имеет смысл.

Ответ №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
  

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

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

Комментарии:

1. Еще один совет, касающийся fliplr: если ваши векторы равны nx1, но вам нужно отобразить их как 1xn (по какой-либо причине), возьмите простое число внутри . т. е. yb = [y1',fliplr(y2')] . Not yb = [y1',fliplr(y2)'] .

2. Можем ли мы сделать область тени заполненной » » или другим другим маркером?

3. @ftxx Конечно, если вы хотите заполнить область между двумя кривыми матрицей, а затем нанести на нее » » для точечного маркера.

4. @MelB Получил код, который не сработал? Это должно работать для любого набора точек, который правильно построен.

Ответ №2:

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

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

Комментарии:

1. ничего не сделал для строк

2. @MelB, ты можешь быть более четким?

Ответ №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
  

И вот результирующий рисунок:

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

Вы также можете изменить порядок расположения объектов на рисунке после их построения, изменив порядок маркеров в '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);
  

Комментарии:

1. Это также выглядит очень многообещающе. Я не думал пытаться использовать такой метод, как этот. Я сообщу вам, когда у меня будет моя попытка.

Ответ №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, чтобы включить только нужные вам точки.

Комментарии:

1. Спасибо, я рассмотрю эту функцию исправления сегодня!

2. patch () — это низкоуровневая версия fill (), поэтому либо это, либо ответ gnovice должны делать то, что вы хотите.