提前向 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);
看起来很合理:
但我有两个具有相似含义的状态变量,我想在一个轴上同时绘制。
呃哦,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');
当然,此解决方案仅适用于报告流程的最后一步(我绝对不会将其用于科学文章 - 请参阅评论 - 但用于壮观的演示文稿)。使用比 Matlab 更好地处理透明度/OpenGL 的替代软件也可能更有效。
关于matlab - 使用 "band of uncertainity"显示数据与时间的轨迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17790817/