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

Posted

技术标签:

【中文标题】MATLAB,填充两组数据之间的区域,一个图中的线条【英文标题】:MATLAB, Filling in the area between two sets of data, lines in one figure 【发布时间】:2011-09-08 21:25:00 【问题描述】:

我有一个关于使用area 函数的问题;或者也许另一个功能是为了...... 我从一个大文本文件创建了这个图:

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

我希望这是有道理的。

【问题讨论】:

【参考方案1】:

你想看看 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 向量以仅包含您需要的点。

【讨论】:

谢谢,我今天研究一下这个补丁功能! patch() 是 fill() 的低级版本,所以这个或 gnovice 的答案应该做你想要的。【参考方案2】:

您可以使用函数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' property 中的句柄顺序来更改图中对象的堆叠顺序。例如,这段代码颠倒了堆叠顺序,将绿色多边形隐藏在蓝色多边形后面:

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

最后,如果你不知道你想要提前堆叠多边形的确切顺序(即任何一个都可能是较小的多边形,你可能想要在上面),那么你可以调整'FaceAlpha' property 所以一个或两个多边形将显示为部分透明并在其下方显示另一个。例如,以下将使绿色多边形部分透明:

set(h2,'FaceAlpha',0.5);

【讨论】:

这看起来也很有希望。我不认为尝试这样的方法。当我有我的尝试时,我会更新你。【参考方案3】:

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

例子:

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 数组并将其与原始数组连接,您将向外、向下、向后、然后向上关闭两个数组以形成一个完整的多对多多边多边形。

【讨论】:

关于 Fliplr 的另一个提示:如果您的向量是 nx1,但您需要将它们绘制为 1xn(无论出于何种原因),请在 inside 中取素数。即yb = [y1',fliplr(y2')]。不是yb = [y1',fliplr(y2)'] 我们可以让阴影区域用“+”或其他不同的标记填充吗? @ftxx 当然,如果你想用矩阵填充两条曲线之间的区域,然后用“+”作为点标记来绘制它。 @MelB 得到了无效的代码?它应该适用于任何正确构造的点。【参考方案4】:

我个人觉得封装填充函数既优雅又方便。 要在共享支持 X(和颜色 C)的两个相同大小的行向量 Y1Y2 之间填充:

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

【讨论】:

对行什么也没做 @MelB,你能再明确一点吗?

以上是关于MATLAB,填充两组数据之间的区域,一个图中的线条的主要内容,如果未能解决你的问题,请参考以下文章

怎样在matlab中画矩形并填充颜色?

matlab中如何对一条曲线和X轴之间的区域进行颜色的填充,比如一个高斯曲线下对应不同X段范围填充不同的颜

matlab中怎样让3d图中的线刚好在整数坐标上,比如10,20,30..100这些点上

Matlab:删除第一个和最后一个点之间的线

如何比较两组数据的差异性?

如何去除 MatLab 中绘制区域之间的分界线?