将matplotlib填充的等高线图保存为.pdf或.eps时的别名

将matplotlib填充的等高线图保存为.pdf或.eps时的别名,pdf,matplotlib,eps,Pdf,Matplotlib,Eps,我正在使用matplotlib.pyplot.tourtf()函数生成一个已归档的等高线图。函数调用中的参数包括: contourf(xvec,xvec,w,levels,cmap=matplotlib.cm.jet) 在哪里 w是我的数据 生成的绘图在屏幕上看起来相当不错,但当我使用调用matplotlib.pyplot.savefig()保存到pdf时,生成的pdf会出现大量的别名(我想这就是它的原因)。对savefig的调用只是savefig('filename.pdf')。我曾尝试使用

我正在使用matplotlib.pyplot.tourtf()函数生成一个已归档的等高线图。函数调用中的参数包括:

contourf(xvec,xvec,w,levels,cmap=matplotlib.cm.jet)
在哪里

w是我的数据

生成的绘图在屏幕上看起来相当不错,但当我使用调用matplotlib.pyplot.savefig()保存到pdf时,生成的pdf会出现大量的别名(我想这就是它的原因)。对savefig的调用只是
savefig('filename.pdf')
。我曾尝试使用dpi论点,但运气不佳。调用
matplotlib.get_backend()
会弹出“TkAgg”

我将附加一个保存为pdf的图形,与保存为png的图形(类似于屏幕上的图形)进行比较,以演示问题:

import matplotlib.pyplot as plt
import numpy as np


xs, ys = np.mgrid[0:30, 0:40]
data = (xs - 15) ** 2 + (ys - 20) ** 2 + (np.sin(ys) + 10) ** 2

cs = plt.contourf(xs, ys, data, 60, cmap='jet')

# Rasterize the contour collections
for c in cs.collections:
    c.set_rasterized(True)

plt.savefig('test.pdf')
png不带别名:

带别名的pdf:

请让我知道,如果有任何其他细节,我可以给你一个答案。我应该提到,另存为.eps会产生与另存为pdf类似的坏结果。但pdf文件更清楚地显示了这个问题。我的目标是最终得到一个production quality.eps,我可以将它附加到一个latex文档中,作为一篇科学论文发表。如果我能找到一种能给出令人满意结果的方法,我会很乐意在一种格式中保存,然后转换

最好的


阿恩

我不知道pdf格式的轮廓画这么糟糕。你说得对,我认为轮廓正在被matplotlib之外的PDF渲染器反走样。正是出于这个原因,我认为您需要特别小心使用哪个应用程序来查看生成的PDF-我所看到的最好的行为是使用GIMP,但我相信还有很多其他查看器表现良好

为了解决这个问题(使用GIMP查看PDF时),我能够“光栅化”使用matplotlib生成的轮廓,以避免丑陋的白线问题:

import matplotlib.pyplot as plt
import numpy as np


xs, ys = np.mgrid[0:30, 0:40]
data = (xs - 15) ** 2 + (ys - 20) ** 2 + (np.sin(ys) + 10) ** 2

cs = plt.contourf(xs, ys, data, 60, cmap='jet')

# Rasterize the contour collections
for c in cs.collections:
    c.set_rasterized(True)

plt.savefig('test.pdf')
这产生了一个等高线图,它没有显示您所显示的问题

另一种可能更好的方法是通过在轮廓线下方放置彩色线来愚弄抗锯齿

import matplotlib.pyplot as plt
import numpy as np


xs, ys = np.mgrid[0:30, 0:40]
data = (xs - 15) ** 2 + (ys - 20) ** 2 + (np.sin(ys) + 10) ** 2

# contour the plot first to remove any AA artifacts
plt.contour(xs, ys, data, 60, cmap='jet', lw=0.1)
cs = plt.contourf(xs, ys, data, 60, cmap='jet')

plt.savefig('test.pdf')
我应该注意,如果我将数字保存为“.ps”而不是“.pdf”,我就看不到这些问题——也许这是第三种选择


希望这能帮助您准确地查看您想要的文件。

在使用@pelson提供的有用答案一段时间后,我终于找到了解决这个长期存在的问题的正确方法(目前在Matplotlib 2.0中),它不需要多次调用轮廓或光栅化图形

关于更广泛的解释和例子,我参考了我的原始答案

总之,解决方案由以下几行组成:

cnt = plt.contourf(x, y, z)

for c in cnt.collections:
    c.set_edgecolor("face")

plt.savefig('test.pdf')

我觉得那些很像。使用pdf时,模式会根据缩放级别进行更改。@阿恩:链接的文件不见了-有没有可能替换它们?嗨,佩尔森。我采用了你的第二种解决方案,效果非常好。非常感谢。如果我将
tourtf()
与levels一起保存在PS、EPS、PDF中,但不保存在SVG输出中,我也可以确认这种行为。同样,通过GhostScript运行此类PS/EPS/PDF并以300dpi输出PNG,显示没有问题,但在Acrobat、SumatraPDF(使用mupdf引擎,由GhostScript背后的相同人员签名)、CorelDraw、Ipe等中查看PDF,。。。所有这些都显示这一人工制品是可见的。更详细地说,不是轮廓有轮廓,而是轮廓和绘图窗口的白色背景之间有一个很小的间隙显示为轮廓轮廓。@pelson的轮廓线技巧很好,它似乎很好地填补了间隙。另一种方法是在调用
contourf()
之前使用
imshow()
绘制阵列-这样,绘制背景将显示马赫轮廓边界,间隙将不可见。当然,也可以只使用SVG并将其打印为PDF或PS…Id在SVG中也有同样的问题,您的第二个解决方案解决了它-但是我必须手动指定
zorder
,因为我有一些用
fill\u生成的阴影覆盖,轮廓位于这些覆盖之上。