2017-12-07 53 views
1

私は輪郭プロットがあり、.svgまたは.pdfファイルとして保存したいと思います。以下は簡単な例です。私は等高線図そのもの(カラフルな部分!)をラスタライズし、他のもの(すべての軸、ラベルなど)をベクトル図形として保持したいと考えています。私はfig.svgを検査またはInkscapeの(私は、ベクトルシェイプに充填された輪郭のグループ化を解除することができています)での編集用に開くと塗りつぶし輪郭プロットの輪郭のラスタライズ

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

しかし、ラスタライズが働いていないことは明らかです!

このような単純なプロットでは問題ありませんが、私のプロットの輪郭レベルが高いほど(下)、ベクター画像には多くの曲線が多く必要になり、ファイルサイズがはるかに大きくなります。

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

enter image description here

誰かが解決策を提案し、このrasterized=Trueフラグは、私が必要とするものに行われていない理由を説明していただけますか?

+0

'contourf()'は['QuadContourSet'](https://matplotlib.org/api/contour_api.html#matplotlib.contour.QuadContourSet)オブジェクトを返します。このオブジェクトは、 'Artist'クラスから降下するオブジェクトと異なり、*ラスタライズされた*プロパティを持ちません。 –

答えて

1

私はこれがthis questionの複製であることが判明しました。 contourまたはcontourfの引数としてrasterized=Trueを使用して

等高線図をラスタライズするために

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) 
+0

上記のUserWarningが表示されません。私はconda 4.3.30の中でpython 2.7.13とmatplotlib 2.0.2を使用しています。 – feedMe

+0

実際、あなたの提案(cs.collectionsのループ)は私にとってはうまくいきませんでした。あなたはそれを試しましたか?私はhttps://stackoverflow.com/questions/37020842/reducing-size-of-vectorized-contourplotのzorderメソッドにもっと幸運を祈ることができましたが、軸とラベル自体がラスタライズされるのを防ぐために調整が必要です。 – feedMe

+0

はいここの方法は私のために働いています。私はmatplotlibバージョン2.1でテストしましたが、重複していても動作すると報告されているので、バージョン1.5ではすでに有効であるはずです。どのくらいそれは働いていないのですか? – ImportanceOfBeingErnest