填充等高线图中轮廓的光栅化

时间:2017-12-07 15:51:06

标签: python matplotlib

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

Output

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

这对于这样一个简单的情节来说很好,但是如果我的情节具有更高的轮廓水平数(下图),那么矢量图像将需要许多曲线并且文件大小会更大。

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

enter image description here

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

1 个答案:

答案 0 :(得分:2)

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

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

UserWarning: The following kwargs were not used by contour: '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)