关于图:MATLAB,填充两组数据之间的区域,一条图中的线

MATLAB, Filling in the area between two sets of data, lines in one figure

我对使用area函数有疑问; 或可能还有其他功能...
我从一个大文本文件创建了这个图:

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

绿色和蓝色代表两个不同的文件。 我要做的是分别填写红线和每次运行之间的区域。 我可以用类似的想法创建面积图,但是当我将它们绘制在同一图形上时,它们不会正确重叠。 本质上,一个图形上将包含4个地块。

我希望这是有道理的。


基于@gnovice的答案,您实际上可以仅在两条曲线之间的区域中创建带有阴影的填充图。只需将fillfliplr结合使用。

例:

1
2
3
4
5
6
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数组并将其与原始数组连接,您可以上下,向上,然后向上,向上关闭,以在一个完整的,多面多面的多边形中封闭两个数组。


就个人而言,我觉得包装填充功能既优雅又方便。
要在两个相等大小的行向量Y1Y2之间填充,它们共享支持X(和颜色C):

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


您可以使用功能FILL在绘图的各个部分下创建填充的多边形来完成此操作。您将要按照希望它们在屏幕上堆叠的顺序绘制线条和多边形,从最底部的线条和多边形开始。这是一些示例数据的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

在绘制对象之后,还可以通过修改axes对象的'Children'属性中的手柄顺序来更改图中对象的堆叠顺序。例如,以下代码颠倒了堆叠顺序,将绿色多边形隐藏在蓝色多边形后面:

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

最后,如果您不知道要提前堆叠多边形的确切顺序(即,一个可能是较小的多边形,您可能希望在顶部放置它),则可以调整'FaceAlpha'属性,以便或两个多边形将显示为部分透明,并在其下方显示另一个。例如,以下将使绿色多边形部分透明:

1
set(h2,'FaceAlpha',0.5);


您要查看patch()函数,并潜入水平线起点和终点的点:

1
2
3
4
5
6
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向量,以仅包括所需的点。