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

时间:2013-04-04 21:34:45

标签: pdf matplotlib eps

我正在使用matplotlib.pyplot.contourf()函数生成一个字段轮廓图。调用函数的参数是:

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

,其中

xvec = numpy.linspace(-3.,3.,50)
levels = numpy.linspace(-0.01,0.25,100)

而w是我的数据。

结果图在屏幕上看起来相当不错,但是当我使用对matplotlib.pyplot.savefig()的调用保存为pdf时,生成的pdf有很多别名(我认为就是这样)。对savefig的调用只是savefig('filename.pdf')。我尝试过使用dpi参数,但没有运气。致电matplotlib.get_backend()会吐出'TkAgg'。

我将附加一个保存为pdf的图形,与保存为png的图形(类似于屏幕上的图像)相比较,以证明问题:

没有别名:https://dl.dropbox.com/u/6042643/wigner_g0.17.png

pdf with aliasing:https://dl.dropbox.com/u/6042643/wigner_g0.17.pdf

如果我有任何其他细节可以帮助您给出答案,请告诉我。我应该提一下,保存为.eps会产生与保存到pdf类似的糟糕结果。但pdf表明问题更加清晰。我的目标是最终获得生产质量。我可以将其附在乳胶文件上,作为科学论文发表。如果我能找到一种能产生令人满意的效果的方法,我会很乐意在一种格式下保存,然后转换它。

最佳,

·阿尔

2 个答案:

答案 0 :(得分:7)

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

我参考原始答案here以获得更广泛的解释和示例。

总之,解决方案包括以下几行:

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

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

plt.savefig('test.pdf')

答案 1 :(得分:6)

我不知道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')

这产生了一个轮廓图,没有表现出你所展示的问题。

另一种可能更好的替代方法是通过在轮廓f下面放置彩色线来欺骗抗锯齿。

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”,我就不会看到这些问题 - 也许这是第三种选择。

希望这可以帮助您让论文准确地了解您的需求。