8

我正在使用 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 的图相比(类似于屏幕上的样子)来演示问题:

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

带别名的pdf:https ://dl.dropbox.com/u/6042643/wigner_g0.17.pdf

请让我知道我是否可以提供任何其他详细信息来帮助您回答。我应该提到,保存为 .eps 会产生与保存为 pdf 类似的不良结果。但是pdf更清楚地显示了问题。我的目标是最终制作出高质量的 .eps 文件,我可以将其附加到乳胶文档中,以作为科学论文发表。如果我能找到一种能提供令人满意结果的方法,我会很高兴能以某种格式保存,然后转换它。

最好的,

阿恩

4

2 回答 2

15

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

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

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

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

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

plt.savefig('test.pdf')
于 2015-10-02T16:32:54.373 回答
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')

这产生了一个等高线图,它没有表现出你所展示的问题。

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

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

希望这可以帮助您使论文看起来完全符合您的要求。

于 2013-04-05T10:01:16.807 回答