将Matplotlib轴的内容栅格化(但不包括框架和标签)

13

我正在生成受变形影响的有限元网格的图表,并使用matplotlib的polycollection进行可视化。这些图像保存为pdf文件。

对于密度较高的网格,采用朴素方法会导致文件过大和渲染过于密集,实用性不强。

对于这些网格来说,将每个元素都作为多边形绘制确实没有意义;可以轻松地将其光栅化,就像在保存图像为jpg或png时所做的那样。然而,对于打印,我希望保留清晰的框架、标签和注释。

有人知道是否可以在matplotlib中实现这种混合光栅化吗?

我可以考虑使用imshow并绕过polycollection的解决方案,但我更喜欢使用matplotlib内置的组件。

感谢您的建议。

1个回答

17

只需向您的集合构造函数传递 rasterized=True 关键字即可。例如:

col = collections.PolyCollection(<arguments>, rasterized=True)

这允许仅对该元素进行选择性光栅化(例如,如果您在其上面进行普通绘图,则默认情况下会将其矢量化)。大多数命令(如plotimshow)也可以使用rasterized关键字。如果想要将整个图形(包括标签和注释)进行光栅化,则可以执行以下操作:

fig = plt.figure()
a = fig.add_subplot(1,1,1, rasterized=True)

(但这并不是您所需的,正如问题所述。)


哇,这么简单。我现在开始担心我的谷歌搜索技能了。但是非常感谢您的答案,这正是我所希望的! - gertjan
太好了!不过你有没有想法如何控制光栅化的dpi呢?似乎它忽略了我传递给figuresavefig的dpi... - weronika
@weronika,如果在figuresavefig中dpi不起作用,那么我真的不知道该如何更改它。看起来collections使用了艺术家allow_rasterization装饰器,但是从代码的快速浏览中,我没有看到如何设置dpi。 - tiago
我进一步调查了一下 - 显然有一个解决dpi问题的补丁,有人正在努力将其纳入matplotlib中 - https://github.com/matplotlib/matplotlib/pull/1185 - weronika
@weronika,有趣。从那个讨论中(适用于svg后端),似乎pdf后端已经支持了这个功能。但是在我的版本中好像并不是这样。 - tiago

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接