Matplotlib中Poly3DCollection的光栅化

时间:2017-12-14 16:39:04

标签: python matplotlib plot

当尝试在Matplotlib中强制执行Poly3DCollection对象的光栅化时,我收到以下错误消息(我可以确认没有应用光栅化):

/usr/lib/python3/dist-packages/matplotlib/artist.py:788: UserWarning: Rasterization of '<mpl_toolkits.mplot3d.art3d.Poly3DCollection object at 0x2b49e8faeba8>' will be ignored
  warnings.warn("Rasterization of '%s' will be ignored" % self)

可以对整个图形进行栅格化,但显然最好只栅格化某些对象,同时将轴,标签,键,文本等项目保存为矢量图形。

我在我的代码中尝试使用以下语法:

  • ax.add_collection3d(Poly3DCollection(polygons, rasterized=True), zs='z')
  • c = Poly3DCollection(polygons)然后c.set_rasterized(True)

根据this post,可以栅格化PolyCollection(没有3D位)对象。

有什么建议吗?

这是一个MWE:

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection, Line3DCollection

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.set_xlim([0, 4])
ax.set_ylim([0, 4])
ax.set_zlim([0, 4])

polygons = [[(3, 1, 1), (1, 3, 1), (1, 1, 3)]]

ax.add_collection3d(Poly3DCollection(polygons, facecolors='r', rasterized=True), zs='z')

plt.show()

1 个答案:

答案 0 :(得分:3)

首先请注意,光栅化仅适用于导出矢量图形,如pdf。我假设这是你在这里谈论的,所以我想你最后会打plt.savefig("some.pdf")之类的东西。

我认为有人忘了允许3D对象进行光栅化。

修复将进入matplotlib源代码,找到

python\lib\site-packages\mpl_toolkits\mplot3d\art3d.py

在导入部分添加

from matplotlib.artist import allow_rasterization

并进一步向下Poly3DCollection内找到draw方法(在我的情况下,它在第709行)并添加@allow_rasterization。它应该看起来像

@allow_rasterization
def draw(self, renderer):
    return Collection.draw(self, renderer)

如果然后运行上面的代码,再加上保存为pdf,则三角形被栅格化。 pdf:

的屏幕截图

enter image description here