我试图在一个轴上绘制两个(或更多个系列),每个轴都有几个置信区间。这些置信区间可以重叠,在这种情况下,期望的行为是重叠区域显示为两种颜色的混合。使用fill
函数创建patch
个对象可以实现此目的,因为可以设置FaceAlpha
属性。 (使用area
命令会导致波段相互叠加并隐藏下面的内容。)然后,我想将结果数字保存为高质量的eps文件。
以下是完成此操作的工作代码示例:
datevec = 0:9;
myMean = 1+rand(1,10)*0.2;
myBounds = [myMean - 0.5;
myMean - 0.4;
myMean - 0.3;
myMean + 0.3;
myMean + 0.4;
myMean + 0.5];
myMean1 = linspace(0,2,10)+rand(1,10)*0.2;
myBounds1 = [myMean1 - 0.5;
myMean1 - 0.4;
myMean1 - 0.3;
myMean1 + 0.3;
myMean1 + 0.4;
myMean1 + 0.5];
figure();
hold on;
plot(datevec,myMean);
plot(datevec,myMean1);
nBands = size(myBounds,1)/2;
for iBand = 1:nBands
fill([datevec, fliplr(datevec)],...
[myBounds(iBand,:), fliplr(myBounds(nBands*2+1-iBand,:))],...
'r', 'FaceAlpha', 0.1*iBand);
fill([datevec, fliplr(datevec)],...
[myBounds1(iBand,:), fliplr(myBounds1(nBands*2+1-iBand,:))],...
'b', 'FaceAlpha', 0.1*iBand);
end
hold off;
问题在于保存这个数字。默认行为似乎是使用OpenGL位图渲染器,它不仅渲染低质量图像,而且需要相对较长的时间。 (我得出结论,OpenGL渲染器是默认的,注意通过指定或省略下面的'-opengl'
标志产生完全相同的时序。)
tic;
print(gcf(),'-opengl', '-depsc2', 'figure_opengl.eps');
fprintf(1,'Figure saved (opengl) in %f\n', toc); % 6.162832 seconds
强制画家渲染器(对于矢量图像看起来是正确的)要快得多,但生成的eps文件不能正确显示条带的透明度 - 就好像FaceAlpha
被设置为{ {1}}。
1
因此,性能差异是20倍。此外,如果我通过添加tic;
print(gcf(),'-painters', '-depsc2', 'figure_painters.eps');
fprintf(1,'Figure saved (painters) in %f\n', toc); % 0.301429 seconds
标志来增加位图图像的分辨率,则此示例的时间大约为24秒。我希望保存高质量的数字,但我不能让每个数字只需25秒即可打印到磁盘。
如何改善上面代码的性能?是否有-r500
的替代方案仍允许频段重叠? fill
对象被设想为更好的位图或矢量图像吗?我应该更改用于打印这些文件的设置吗?任何帮助表示赞赏。
GNU / Linux上的Matlab 14a。如果需要,我可以附加代码生成的图像。