This question already has an answer here:
Reducing size of vectorized contourplot

(1 个回答)


3年前关闭。




我有一个填充的等高线图,我希望将其保存为 .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)

python - 填充等高线图中等高线的光栅化-LMLPHP

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

对于这样一个简单的图来说这很好,但是如果我的图具有更多的轮廓级别(如下),则矢量图像将需要许多曲线并且文件大小会大得多。
plt.close()
plt.figure()
plt.contourf(xi, yi, zi, 100, rasterized=True)
plt.savefig('fig.svg', dpi=100)

python - 填充等高线图中等高线的光栅化-LMLPHP

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

最佳答案

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

使用 rasterized=True 作为 contourcontourf 的参数应该显示

UserWarning: The following kwargs were not used by contour: 'rasterized'

In order to rasterize a contour plot, you need to rasterize its individual parts, i.e.

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)

关于python - 填充等高线图中等高线的光栅化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47698830/

10-12 23:18