Matlab:如何避免填充等高线图中的伪影

Matlab: How to avoid artefacts in filled contour plots

我正在尝试从 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');

此方法的问题在于它会产生如下所示的人工制品(白线):

我知道这些白线是定义阴影区域的多边形,它们有不可见的边缘,并且没有完全重叠 (according to here). The problem is caused by the pdf viewer itself which tries to smooth the lines displayed on the screen (according to here)。我的问题是大多数查看文档的人都不知道这一点,也不知道如何防止查看者这样做。所以我的问题是:

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

Eps 产生同样的问题。我曾尝试使用 SVG function 但没有任何运气。由于放大引起的像素化,我试图避免使用光栅图形。任何建议将不胜感激。

编辑 - 附加信息 - 使用 Matlab v.2014b 和 Ghostscript v.9.15

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

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

  1. 输出具有足够高分辨率的 png 格式的没有线条的图形版本。

  2. 以pdf格式输出一个没有颜色的图形版本。这应该没有任何人工制品。如果你的图形很复杂并且有很多透明胶片,你可能需要输出多个版本来构建 'levels'.

  3. 使用 Adob​​e Illustrator(或类似软件)对光栅图像进行矢量化描摹。您可能会在这里丢失一些细节,但是对于细节有限的简单等高线图,它可以很容易地转换为矢量化形式。

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

这还允许您使用 Illustrator 压缩 pdf 等功能。

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

MatLab 2013b 终于没有这个问题了。此外,它生成的文件体积要小得多。这是因为 MatLab 2013b 合成了大重叠图形的矢量化图像,而 MatLab 2014b 制作了糟糕的网格。

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

所以这不是查看器的问题,而是从 MatLab 导出图像的方式。

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