2

我正在尝试做一些类似于这篇文章中概述的事情: MATLAB,填充两组数据之间的区域,一个图中的线条, 但遇到了障碍。我试图遮蔽表示平均值 +/- 标准偏差的图形区域。变量定义有点复杂,但归结为这段代码,当绘制没有阴影时,我得到下面的屏幕截图:

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 和 meanMinusSTD 之间)实现阴影时,我得到一个如下所示的图:

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

阴影

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

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

4

4 回答 4

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

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

于 2013-11-11T16:26:02.520 回答
5

原来是列向量与行向量的问题。出于某种原因,使用带有原始列向量的 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 运行的循环中,并且在某些子图中,两条标准曲线都将是虚线,而在某些子图中只有顶部或底部。让它们破灭对我来说并不重要,所以我保持简单。现在这是我得到的图表示例:

在此处输入图像描述

于 2013-11-11T18:33:18.263 回答
3

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

fill( [x;flipud(x)],  [mean;flipud(meanMinusSTD)], 'y');
于 2013-11-11T16:34:04.950 回答
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“移除”(白色绘图)下部。

在此处输入图像描述

于 2013-11-11T16:34:50.043 回答