【问题标题】:White lines in matplotlib's pcolormatplotlib 的 pcolor 中的白线
【发布时间】:2015-01-21 11:11:02
【问题描述】:

在某些 pdf 查看器(例如 OSX 上的 Preview)中,使用 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")

【问题讨论】:

  • 这是因为pcolormesh 实际上绘制了单独的矩形,并且一些 pdf 查看器呈现它们的方式与其他查看器不同。作为一种解决方法,并且因为它更有效,在这种情况下最好使用imshow。例如,在您的情况下:plt.imshow(z, interpolation='nearest', cmap='Blues', extent=[x.min(), x.max(), y.min(), y.max()]).
  • 谢谢!这正是我锁定的目的。
  • 您可以通过将rasterized=True 传递给colorbar 来解决此问题。
  • 我在调用 pl.colorbar(rasterized=True) 时收到“意外的关键字参数 'rasterized'”错误。使用 MPL 版本 1.3.1 和 1.4.x。 this question 上的最佳答案对我有用。
  • 试试cb.solids.set_rasterized(True)

标签: python matplotlib


【解决方案1】:

cmets 有一个很好的解决方案,它利用了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)),直到获得满意的结果。

【讨论】:

  • 对于evince,只需set_edgecolor 就足够了(请注意,对于彩条,它是cbar.solids.set_edgecolor("face"))。
【解决方案2】:

接受的答案对我来说效果不佳。除了linewidth=0 之外,我似乎通过使用antialiased=True 更接近了。这是 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)

【讨论】:

    【解决方案3】:

    我遇到了这个问题,使用 rasterized=True 解决了它(在 matplotlib 版本上 3.1.0)。

    【讨论】:

      【解决方案4】:

      基于@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

      【讨论】:

        猜你喜欢
        • 2019-04-28
        • 1970-01-01
        • 2012-11-16
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 2015-01-20
        • 2012-08-18
        相关资源
        最近更新 更多