Matlab:如何避免填充等高线图中的人工制品

时间:2015-02-04 16:03:38

标签: matlab pdf vector-graphics

我正在尝试从Matlab导出填充的等高线图作为矢量图形以包含在Latex文件中。我目前的方法是:

contourf(x,y,v_mag,20), axis([0,width,0,height]),daspect('manual') ;
grid off
colormap jet
h = colorbar;
caxis([0 v_lid])
h.Label.String = 'Velocity Magnitude (m/s)';
set(gcf,'renderer','painters')
export_fig('-painters', '-transparent', 'pdf', 'filename.pdf');

这种方法的问题在于它产生的伪像(白线)如下所示: Artefacts in PDFs produces from Matlab

我知道这些白线是定义阴影区域的多边形,它们具有不可见的边缘,并且不会重叠(according to here)。问题是由pdf查看器本身引起的,它试图平滑屏幕(according to here)上显示的线条。我的问题是,查看文档的大多数人都不会知道这一点,也不会知道如何阻止查看者这样做。所以我的问题是:

是否可以在没有这些人工制品的情况下从Matlab创建填充轮廓图的矢量图形?

Eps产生同样的问题。我曾尝试使用SVG function,但没有任何运气。我试图避免使用光栅图形,因为放大会导致像素化。任何建议都会非常感激。

编辑 - 其他信息 - 使用Matlab v.2014b和Ghostscript v.9.15

2 个答案:

答案 0 :(得分:1)

这是一个非常令人沮丧的问题,似乎没有解决方案(甚至很少尝试解决方案),现在已经很多年了。总之,Matlab无法处理输出无伪影轮廓或曲面图(任何具有复杂网格或透明度的图形)。

我可以建议一个简单的解决方法,在大多数情况下都可以使用,其中底层轮廓图的颜色或细节不需要完美保留。

  1. 以png格式输出图形版本,且分辨率足够高。

  2. 以pdf格式输出没有颜色的图形版本。这应该没有任何文物。如果您的数字很复杂并且有很多透明度,您可能需要输出多个版本来构建“级别”。

  3. 使用Adobe Illustrator(或某些等效工具)执行光栅图像的矢量化跟踪。您可能会在这里丢失一些细节,但对于细节有限的简单等高线图,它将很容易转换为矢量化形式。

  4. 在Illustrator中叠加两个图像。以矢量格式输出。

  5. 这也允许您使用Illustrator压缩pdf的功能。

    如果您不想玩矢量化光栅输出,您也可以简单地替换步骤3-4并将光栅颜色图像与矢量化线图像组合。这适用于复杂的等高线图,为您提供清晰的线条,但能够压缩底层颜色。

答案 1 :(得分:1)

最终,MatLab 2013b没有这个问题。此外,它生成的文件的体积要小得多。这是因为MatLab 2013b构成了大重叠图形的矢量化图像,而MatLab 2014b则进行了可怕的网格划分。

enter image description here

这里第一个文件是用2013b获得的,第二个是用MatLab 2014b获得的(我突出显示了一个带有红色笔划的多边形来显示差异)。体积大约相差22倍(38 Kb vs. 844 Kb)。

所以这不是观众的问题,而是图像从MatLab导出的方式。

这里也讨论了这个问题Triangular split patches with painters renderer in MATLAB 2014b and above,但仍然没有直接的解决方案。