所以我需要在图中绘制一些errobar
情节.具体来说,我需要errorbar
在每个图中有4个图,问题是当绘制多个数据时,图形有点不可读.
例:
clear all close all clc x = 0:pi/10:pi; y = sin(x); y2=cos(x); y3=atan(x); e = std(y)*ones(size(x)); e2 = std(y2)*ones(size(x)); e3 = std(y3)*ones(size(x)); figure hold on errorbar(x,y,e) errorbar(x,y2,e2) errorbar(x,y3,e3)
我解决这个问题的想法是填充错误条的角用界面的相同颜色和低alpha划分的区域,这样区域的重叠是可见的.
问题是,我能想象到的唯一方法是在由错误栏角分隔的区域中创建一个网格,然后填充它们patch
.这确实是可能的,但非常烦人,因为绘图不会有凸包,因此我需要迭代地逐个创建三角形.所以问题是:有更优雅的方式吗?
此外,如果有人的话,我愿意接受更好的可视化数据的建议.
正常绘制图形,然后使用修补程序手动绘制错误栏.补丁的数据(坐标和颜色)取自绘制的图形,补丁的alpha可以设置为任何所需的值.
clear all close all clc error_alpha = .4; error_width_factor = .01; x = 0:pi/10:pi; y = sin(x); y2 = cos(x); y3 = atan(x); e = std(y)*ones(size(x)); e2 = std(y2)*ones(size(x)); e3 = std(y3)*ones(size(x)); ee = [e; e2; e3]; figure hold on hp(1) = plot(x,y); hp(2) = plot(x,y2); hp(3) = plot(x,y3); w = diff(xlim)*error_width_factor; for m = 1:numel(hp) for n = 1:numel(hp(m).XData) patch(hp(m).XData(n)+[-1 1 1 -1]*w, hp(m).YData(n)+[-1 -1 1 1]*ee(m,n), 'w',... 'FaceColor', hp(m).Color, 'FaceAlpha', error_alpha, 'EdgeColor', 'none'); end end
与之前类似,但使用较窄的补丁并使用与图形相关的水平移位绘制它们(如@Patrik所建议的那样).应用alpha值有助于保持图形更亮.
代码是方法1的修改版本.此处显示的示例包含101个数据值,并且仍然相当可见.
clear all close all clc error_alpha = .4; error_width_factor = .003; x = 0:pi/50:pi; y = sin(x); y2 = cos(x); y3 = atan(x); e = std(y)*ones(size(x)); e2 = std(y2)*ones(size(x)); e3 = std(y3)*ones(size(x)); ee = [e; e2; e3]; figure hold on hp(1) = plot(x,y); hp(2) = plot(x,y2); hp(3) = plot(x,y3); w = diff(xlim)*error_width_factor; m0 = (numel(hp)+1)/2; for m = 1:numel(hp) for n = 1:numel(hp(m).XData) patch(hp(m).XData(n)+[-1 1 1 -1]*w+w*(m-m0),... hp(m).YData(n)+[-1 -1 1 1]*ee(m,n), 'w', 'FaceColor', hp(m).Color, ... 'FaceAlpha', error_alpha, 'EdgeColor', 'none'); end end