提高Matlab填充命令的性能以绘制重叠置信带

时间:2015-02-12 20:00:29

标签: matlab matlab-figure

我试图在一个轴上绘制两个(或更多个系列),每个轴都有几个置信区间。这些置信区间可以重叠,在这种情况下,期望的行为是重叠区域显示为两种颜色的混合。使用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。如果需要,我可以附加代码生成的图像。

0 个答案:

没有答案