【问题标题】:Rasterization of contours in filled contour plot [duplicate]填充轮廓图中轮廓的光栅化[重复]
【发布时间】:2017-12-07 15:51:05
【问题描述】:

我有一个填充的等高线图,我希望将其保存为 .svg 或 .pdf 文件。下面是一个简化的例子。我想栅格化等高线图本身(彩色部分!),同时将其他所有内容(所有轴、标签等)保留为矢量图形。

import numpy as np
import matplotlib.pylab as plt

x = np.linspace(0, 2*np.pi, 100)
y = np.linspace(0, 2*np.pi, 100)
xi, yi = np.meshgrid(x, y)
zi = np.cos(xi)**2 + np.sin(yi)**2

plt.figure()
plt.contourf(xi, yi, zi, rasterized=True)
plt.savefig('fig.svg', dpi=100)

但是,当我检查 fig.svg 或在 Inkscape 中打开它进行编辑时(我能够将填充的轮廓取消组合为矢量形状),很明显光栅化没有奏效!

对于这样一个简单的绘图来说这很好,但是如果我的绘图有更多的等高线级别(如下),则矢量图像将需要许多曲线并且文件大小会更大。

plt.close()
plt.figure()
plt.contourf(xi, yi, zi, 100, rasterized=True)
plt.savefig('fig.svg', dpi=100)

有人可以提出一个解决方案并解释为什么这个rasterized=True 标志没有完成我的要求吗?

【问题讨论】:

  • contourf() 返回一个 QuadContourSet 对象。此对象与从 Artist 类继承的对象不同,它没有 rasterized 属性。

标签: python matplotlib


【解决方案1】:

我刚刚发现这是 this question 的副本。

使用rasterized=True 作为contour 或contourf 的参数应该显示一个

用户警告:轮廓未使用以下 kwargs:'rasterized'

为了栅格化等高线图,您需要栅格化其各个部分,即

cs = plt.contour(...) 
for c in cs.collections:
    c.set_rasterized(True)

问题中的示例因此看起来像

import numpy as np
import matplotlib.pylab as plt

x = np.linspace(0, 2*np.pi, 100)
y = np.linspace(0, 2*np.pi, 100)
xi, yi = np.meshgrid(x, y)
zi = np.cos(xi)**2 + np.sin(yi)**2

plt.figure()
cs = plt.contourf(xi, yi, zi)

for c in cs.collections:
    c.set_rasterized(True)

plt.savefig('fig.svg', dpi=100)

【讨论】:

  • 我没有看到您提到的 UserWarning。我在 conda 4.3.30 中使用 python 2.7.13 和 matplotlib 2.0.2。
  • 实际上,您的建议(通过 cs.collections 循环)对我不起作用。你测试了吗?我对stackoverflow.com/questions/37020842/… 上的 zorder 方法有更多的运气,但我需要调整它以避免轴和标签本身被光栅化。
  • 是的,这里的方法对我有用。我使用 matplotlib 2.1 版进行了测试,但由于据报道它在副本中也可以正常工作,因此 1.5 版应该已经很好了。它在多大程度上不起作用?
  • 它不起作用,因为当我在 Inkscape 中打开 SVG 文件时,我可以看到轮廓仍然是单独的矢量形状。我已经升级到 matplotlib 2.1.0 并且还是一样。我正在使用cs = plt.contourf(xi, yi, zi, 100) for c in cs.collections: c.set_rasterized(True) plt.savefig('original.svg', dpi=100)
  • 单个轮廓仍然是 svg 文件中的单个项目,但它们会被光栅化。因此,对于使用levels=100 运行的上述代码,您的文件大小已经增加了 4 倍。
猜你喜欢
  • 2013-10-21
  • 2022-01-24
  • 2013-01-01
  • 2021-05-31
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多