matplotlib的pcolor中的白线

时间:2014-11-23 19:00:32

标签: python matplotlib

在一些pdf查看器中,例如在OSX上预览,使用matplotlib的pcolor制作的图表有白线(见下图)。我该怎样摆脱它们?

源代码非常简单(选择xyz的所有数据):

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")

enter image description here

4 个答案:

答案 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解决了这个问题(在ma​​tplotlib版本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)


See plot here

答案 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)

enter image description here