在一些pdf查看器中,例如在OSX上预览,使用matplotlib
的pcolor制作的图表有白线(见下图)。我该怎样摆脱它们?
源代码非常简单(选择x
,y
,z
的所有数据):
import matplotlib
matplotlib.use("pdf")
import matplotlib.pyplot as pl
pl.figure()
pl.pcolormesh(x,y,z,cmap="Blues",linewidth=0)
pl.savefig("heatmap.pdf")
答案 0 :(得分:16)
评论有一个很好的解决方案,利用imshow
。当imshow
不适合输入数据时(例如,它不是均匀间隔),这通常可以解决这个问题,
pcol = pl.pcolormesh(x,y,z,cmap="Blues",linewidth=0,)
pcol.set_edgecolor('face')
如果这种方法不能充分减少线条,你也可以试试这个:
pl.pcolormesh(x,y,z,cmap="Blues",linewidth=0,rasterized=True)
除了减少方块之间的线条之外,这种方法还倾向于稍微减小文件大小,这有时是有用的。在这种情况下,您可能希望在保存时调整dpi
设置(例如pl.savefig("heatmap.pdf", dpi=300)
),直到您获得满意的效果。
答案 1 :(得分:3)
我遇到了这个问题,使用rasterized=True
解决了这个问题(在matplotlib版本3.1.0
上)。
答案 2 :(得分:1)
基于@eqzx 的回答: 如果您设置 alpha=1,就网格线而言,您将获得更好的结果。但是,您的应用程序/用例可能会有所不同。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
xx, yy = np.meshgrid(x, y)
zz = xx**2 + yy*2
fig, axes = plt.subplots(2,3, figsize=(15,5))
axes[0,0].pcolormesh(XX, YY, ZZ_r, zorder=-1, cmap='magma', alpha=0.5, antialiased=True)
axes[0,1].pcolormesh(XX, YY, ZZ_r, zorder=-1, cmap='magma', alpha=0.5, antialiased=True, linewidth=0.0)
axes[0,2].pcolormesh(XX, YY, ZZ_r, zorder=-1, cmap='magma', alpha=0.5, antialiased=False, linewidth=0.0)
axes[1,0].pcolormesh(XX, YY, ZZ_r, zorder=-1, cmap='magma', alpha=1, antialiased=True)
axes[1,1].pcolormesh(XX, YY, ZZ_r, zorder=-1, cmap='magma', alpha=1, antialiased=True, linewidth=0.0)
axes[1,2].pcolormesh(XX, YY, ZZ_r, zorder=-1, cmap='magma', alpha=1, antialiased=False, linewidth=0.0)
答案 3 :(得分:0)
被接受的答案对我来说不是很好。除antialiased=True
外,我似乎还通过使用linewidth=0
越来越近了。这是与matplotlib版本3.0.2
一起使用的。请注意,中间的图对应于最佳版本。
fig, axes = plt.subplots(1,3, figsize=(15,5))
axes[0].pcolormesh(XX, YY, ZZ_r, zorder=-1, norm=norm, cmap='magma', alpha=0.5, antialiased=True)
axes[1].pcolormesh(XX, YY, ZZ_r, zorder=-1, norm=norm, cmap='magma', alpha=0.5, antialiased=True, linewidth=0.0)
axes[2].pcolormesh(XX, YY, ZZ_r, zorder=-1, norm=norm, cmap='magma', alpha=0.5, antialiased=False, linewidth=0.0)