【问题标题】:MATLAB fill area between linesMATLAB填充线之间的区域
【发布时间】:2013-11-23 12:40:16
【问题描述】:

我正在尝试做一些类似于这篇文章中概述的事情: 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--')

但是,当我尝试通过添加下面的代码在图表的下半部分(在均值和均值减标准之间)实现阴影时,我得到的图如下所示:

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

显然没有对图形的正确区域进行着色,并且正在创建接近 0 的新近水平线,这些线与阴影混淆。

有什么想法吗?我被难住了。

【问题讨论】:

    标签: matlab plot fill area


    【解决方案1】:

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

    至于第二个问题,你想要

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

    您也不需要分两步执行此操作,而是可以一次完成所有操作。我目前正在处理的脚本中的代码 sn-p 执行完全相同的操作并包含以下行:

        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);
    

    所以我填充了两条错误线之间的区域,然后在上面画了数据线。

    【讨论】:

    • LineStyle 添加工作(谢谢!)但即使在清除变量空间并将单词 mean 更改为 meanVar 之后,我也得到了相同的结果。
    • 只看图表,您似乎正在填充torqueRnormStdtorqueRnormMean-torqueRnormStd 之间的区域。这不是你在这里写的,但这就是你的图表的样子。也许您在代码中的某个地方转置了变量名称?
    • 我检查了代码,很确定变量名没有被转置。我也知道这是另一个步骤,但我也有两个绘图选项:一个执行此着色,另一个绘制数据集的所有单独线,但在任何一种情况下,我都会显示平均值、平均值 + SD 和平均值 - SD 线,所以它们首先被定义。
    【解决方案2】:

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

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

    【讨论】:

    • 我刚刚尝试过(感谢您的捕获,它确实有道理),但不幸的是它对图表没有任何影响。
    【解决方案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“移除”(绘制为白色)下部。

    【讨论】:

    • 这很聪明!
    • @chappjc 谢谢! fill 可能更好。如果我能更慢地阅读问题...
    • 嗯,是的,fill 更好。 ;) 但这样更有趣!
    【解决方案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 运行的循环中,在某些子图中,两条标准曲线都将是虚线,而在某些子图中,只有顶部或底部。让它们破灭对我来说并不重要,所以我保持简单。现在这是我得到的图表示例:

    【讨论】:

    • 您好,我建议您发布完整的解决方案,并让您的答案成为公认的答案。这样,如果有相同问题的人看到您的帖子,他们可以轻松找到正确答案。
    • 好的,它说我需要等待 2 天才能将自己的答案标记为已接受的答案,但同时我会发布完整的代码。
    猜你喜欢
    • 2017-11-09
    • 2013-12-17
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多