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

39

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

Изображение 546

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

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

Теги:
plot
fill
area

4 ответа

50

Создавая ответ @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

Изображение 6345

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

  • 0
    Еще один совет, касающийся fliplr: если ваши векторы nx1, но вам нужно представить их как 1xn (по любой причине), возьмите простое число внутри . то есть yb = [y1',fliplr(y2')] . Не yb = [y1',fliplr(y2)'] .
  • 0
    Можем ли мы сделать область затенения заполненной "+" или другим другим маркером?
Показать ещё 3 комментария
13

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

fill_between_lines = @(X,Y1,Y2,C) fill( [X fliplr(X)],  [Y1 fliplr(Y2)], C );
  • 0
    ничего не сделал для строк
  • 0
    @MelB, вы можете быть более явным?
11

Вы можете выполнить это, используя функцию 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

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

Изображение 6346

Вы также можете изменить порядок укладки объектов на рисунке после того, как вы построили их, изменив порядок дескрипторов в '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);
  • 0
    Это также выглядит очень многообещающе. Я не думал, что попытаться такой метод, как этот. Я сообщу вам, когда у меня будет попытка.
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, чтобы включить только те точки, которые вам нужны.

  • 0
    Спасибо, я посмотрю на эту функцию патча сегодня!
  • 0
    patch () - это низкоуровневая версия fill (), поэтому ответ this или gnovice должен делать то, что вы хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню