matlab - 使用 "band of uncertainity"显示数据与时间的轨迹

标签 matlab matlab-figure kalman-filter

提前向 SO 提出非编程问题表示歉意,但是 the powers-that-be have determined that all MATLAB-related questions belong here .

我一直在做一些卡尔曼滤波器并绘制状态变量估计值以查看它们如何随时间收敛。现在,我想直观地表示协方差矩阵,它表示估计中的不确定性。所以我写了一个小函数,为估计值周围的带着色。

(编辑说明:之前的版本错误地使用了 2*cov 作为每个半带的宽度,当它需要是 2 个标准差时)

function [ls, regions] = plotuncertain( t, y, cov )
    t = t(:);
    y = y(:);
    stdev = cov(:).^(1/2);
    a = ones(size(t));
    regions(1) = patch('XData', [t; t(end:-1:1)], ...
                       'YData', [y + 2*stdev; y(end:-1:1)], ...
                       'FaceVertexAlphaData', [0*a; a], ...
                       'FaceAlpha', 'interp', 'EdgeColor', 'none');
    regions(2) = patch('XData', [t; t(end:-1:1)], ...
                       'YData', [y - 2*stdev; y(end:-1:1)], ...
                       'FaceVertexAlphaData', [0*a; a], ...
                       'FaceAlpha', 'interp', 'EdgeColor', 'none');
    ls = line('XData', t, 'YData', y);

看起来很合理:

One cone of uncertainty

但我有两个具有相似含义的状态变量,我想在一个轴上同时绘制。

Two cones of uncertainty

呃哦,k_1 的初始数据被 k_2 波段(上半部分)遮挡了。 MATLAB 没有按照我提交的顺序绘制线条和面片。即使我设法控制他们绘制的顺序,alpha 混合仍然不如基于概率混合颜色最佳。

有什么想法可以同时渲染两者吗?我能否以某种方式利用我为两个变量使用两个不同颜色平面这一事实?

最佳答案

当绘图太复杂时,matlab 开始表现不稳定,就像这里一样。我经常尝试应用描述的解决方案 here .

对于您的特定(非常好的)情节,我会通过声明一个轴来修改函数:

function [ax, ls, regions] = plotuncertain( t, y, cov )

    ax = axes;

    t = t(:);
    y = y(:);
    cov = cov(:);
    a = ones(size(t));
    regions(1) = patch('XData', [t; t(end:-1:1)], ...
                       'YData', [y + 2*cov; y(end:-1:1)], ...
                       'FaceVertexAlphaData', [0*a; a], ...
                       'FaceAlpha', 'interp', 'EdgeColor', 'none');
    regions(2) = patch('XData', [t; t(end:-1:1)], ...
                       'YData', [y - 2*cov; y(end:-1:1)], ...
                       'FaceVertexAlphaData', [0*a; a], ...
                       'FaceAlpha', 'interp', 'EdgeColor', 'none');
    ls = line('XData', t, 'YData', y);

然后调用函数:

[ax1, ls, regions] = plotuncertain( t, y, cov );
[ax2, ls, regions] = plotuncertain( t, y, cov );
set(ax2,'Visible','off');
linkaxes([ax1 ax2],'xy'); %or any (XLim,YLim) settings

这样一来,一个轴的透明度就独立于另一个。

编辑

更好地控制颜色混合的一种方法是将在专用图形中创建的每个轴转换为图像,然后融合它们。可以使用例如 imfuse(im1,im2,'blend')(图像处理工具箱)或混合 2 个图像的任何函数。

从图中提取图像的方法是

F = getframe(gcf);
imwrite(F.cdata, 'image.png');

enter image description here

当然,此解决方案仅适用于报告流程的最后一步(我绝对不会将其用于科学文章 - 请参阅评论 - 但用于壮观的演示文稿)。使用比 Matlab 更好地处理透明度/OpenGL 的替代软件也可能更有效。

关于matlab - 使用 "band of uncertainity"显示数据与时间的轨迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17790817/

相关文章:

matlab - 将图形保存为 eps 文件时,Matlab 会切断颜色图标签

matlab - 更改图形图例中的符号大小

c# - 过滤流数据以降低噪声,卡尔曼滤波器c#

matlab - 将给定矩阵的每个整数转移到另一个数字系统并计算其长度

matlab - 是否可以绘制混淆矩阵的子图?

c - 提高 Matlab 中卡尔曼滤波器的计算速度

使用 Matlab 的 html 标签的正则表达式

matlab - 在 Matlab 中查找顶点并绘制三角形

r - R-Cran 中使用卡尔曼滤波器进行时间序列预测

java - SensorEvent.timestamp 和 Location.getElapsedRealtimeNanos() 时间戳延迟偏移