MATLAB之间的填充区域

时间:2013-11-11 16:17:22

标签: matlab plot fill area

我正在尝试做类似于这篇文章中概述的内容: MATLAB, Filling in the area between two sets of data, lines in one figure 但遇到了障碍。我试图遮蔽图表中表示平均值+/-标准差的区域。变量定义有点复杂,但归结为此代码,并且在没有着色的情况下绘制时,我得到下面的截图:

x = linspace(0, 100, 101)';    
mean = torqueRnormMean(:,1);
meanPlusSTD = torqueRnormMean(:,1) + torqueRnormStd(:,1);
meanMinusSTD = torqueRnormMean(:,1) - torqueRnormStd(:,1);
plot(x, mean, 'k', 'LineWidth', 2)
plot(x, meanPlusSTD, 'k--')
plot(x, meanMinusSTD, 'k--')

mean and std

但是当我尝试通过添加下面的代码在图的下半部分(在mean和meanMinusSTD之间)实现着色时,我得到一个如下图:

fill( [x fliplr(x)],  [mean fliplr(meanMinusSTD)], 'y', 'LineStyle','--');

shaded

显然没有遮挡图形的正确区域,并且正在创建接近0的新近水平线,这些线条正在弄乱阴影。

有什么想法?我很难过。

4 个答案:

答案 0 :(得分:7)

使用mean作为变量可能会遇到问题,因为它也是一个保留的MATLAB命令。尝试清除变量空间,然后使用唯一的变量名称。

关于第二个问题,你想要

fill( [x fliplr(x)],  [meanUniqueName fliplr(meanMinusSTD)], 'y', 'LineStyle','--');

您也不需要分两步完成,但可以一次完成所有操作。我正在处理的脚本中的代码片段完全相同,并包含以下行:

    avar = allan(DATA, tau);
    xFill = [avar.tau1 fliplr(avar.tau1)];
    yFill = [avar.sig2+avar.sig2err fliplr(avar.sig2-avar.sig2err)];

    figure(2);
    fill(xFill,yFill,'y','LineStyle','--')
    line(avar.tau1,avar.sig2);

所以我填充两条错误线之间的区域,然后在顶部绘制数据线。

答案 1 :(得分:4)

结果是列与行向量问题。出于某种原因,使用上面的填充方法和flipud一起使用原始列向量并不起作用,但是使用fliplr转置原始变量就可以了。去搞清楚。这是代码,以防它帮助其他人:

x = linspace(0,100, 101);
mean = torqueRnormMean(:,DOF)';
meanPlusSTD = torqueRnormMean(:,DOF)' + torqueRnormStd(:,DOF)';
meanMinusSTD = torqueRnormMean(:,DOF)' - torqueRnormStd(:,DOF)';
fill( [x fliplr(x)],  [meanPlusSTD fliplr(meanMinusSTD)], 'k');
alpha(.25);
plot(x, mean, 'k', 'LineWidth', 2)
plot(x, meanPlusSTD, 'k')
plot(x, meanMinusSTD, 'k')

请注意,我删除了虚线,只使用了细线和粗线来表示标准偏差和平均值。我这样做是因为线条样式不一致。此代码位于DOF以1:9运行的循环中,并且在某些子图中,两个标准曲线都将是虚线,而某些曲线将是顶部或底部。让它们破灭对我来说并不重要,所以我保持简单。现在这是我得到的图表的一个例子:

enter image description here

答案 2 :(得分:3)

您似乎做错了一件事就是将fliplr应用于列向量。那将没有任何效果。您引用的示例使用行向量。您还可以将它们连接成矩阵,而不是像示例那样连接到单个向量中。我认为与列向量的等价物是:

fill( [x;flipud(x)],  [mean;flipud(meanMinusSTD)], 'y');

答案 3 :(得分:3)

另一种可能性:

x = 1:1000; % example x values
y_upper = 5+sin(2*pi/200*x); % example upper curve
y_lower = 2+sin(2*pi/230*x); % example lower curve
bar(x, y_upper, 1, 'b', 'edgecolor', 'b');
hold on
bar(x, y_lower, 1, 'w', 'edgecolor', 'w');
axis([0 1000 0 7])

它使用bar(单位宽度和相同颜色边缘)填充上面的曲线,然后使用第二个bar来“删除”(白色绘图)下半部分。

enter image description here