我正在使用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表明问题更加清晰。我的目标是最终获得生产质量。我可以将其附在乳胶文件上,作为科学论文发表。如果我能找到一种能产生令人满意的效果的方法,我会很乐意在一种格式下保存,然后转换它。
最佳,
·阿尔
答案 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”,我就不会看到这些问题 - 也许这是第三种选择。
希望这可以帮助您让论文准确地了解您的需求。