2016-05-04 27 views
0

pdfドキュメント(例えば、TeXドキュメント)に塗りつぶした等高線図を含めたいと思います。 現在、私はpyplotcontourfを使用しており、にはpyplotsと保存しています。この問題は、高解像度のpngと比較して、プロットのサイズがかなり大きくなることです。ベクトル化された等高線のサイズを小さくする

サイズを小さくする方法の1つは、もちろんプロットのレベル数を減らすことですが、レベルが小さすぎるとプロットが悪くなります。私は、たとえば、プロットの色をベクトル化して保存する軸、ティックなどを使って、pngとして保存する簡単な方法を探しています。

+0

典型的なプロットはありますか?あなたはnchunkパラメータで遊んだのですか? –

+0

@tomで与えられた例は、典型的なプロットです。私はnchunckパラメータで遊んでいませんでしたが、私の目的のために選択された答えで十分でした。最高の –

答えて

5

Axesオプションset_rasterization_zorderを使用してこれを行うことができます。

pdfのようなベクターフォーマットに保存しても、設定した値より小さいzorderのものは、ラスタライズされたグラフィックスとして保存されます。例えば

import matplotlib.pyplot as plt 
import numpy as np 

data = np.random.rand(500,500) 

# fig1 will save the contourf as a vector 
fig1,ax1 = plt.subplots(1) 
ax1.contourf(data) 
fig1.savefig('vector.pdf') 

# fig2 will save the contourf as a raster 
fig2,ax2 = plt.subplots(1) 
ax2.contourf(data,zorder=-20) 
ax2.set_rasterization_zorder(-10) 
fig2.savefig('raster.pdf') 

# Show the difference in file size. "os.stat().st_size" gives the file size in bytes. 
print os.stat('vector.pdf').st_size 
# 15998481 
print os.stat('raster.pdf').st_size 
# 1186334 

あなたはより多くの背景情報についてはthis matplotlib exampleを見ることができます。


としては、あなたが.set_rasterizedを使用することができ、そのzorderに影響を与えることなく、ただ一人のアーティストをラスタライズし、@tcaswellによって指摘。しかし、これはcontourfのオプションではないようですので、それぞれcontourfset_rasterizedで作成されたPathCollectionsをループする必要があります。このようなもの:

contours = ax.contourf(data) 
for pathcoll in contours.collections: 
    pathcoll.set_rasterized(True) 
+0

すばらしい答え、ありがとう:D。疑問のある人には:zorderの低いアーティストが最初に描画され、set_rasterization_zorderで与えられたものよりも低い値のアーティストがラスタライズされます。 –

+0

アーティストに 'set_rasterized'を使用して、zorderとは無関係にラスタライズすることもできます。 – tacaswell

+1

@tcaswell:はい、すべてのアーティストがそのオプションを持っているわけではありません。 'contourf'は' set_rasterized'オプションを持たない 'matplotlib.contour.QuadContourSet'インスタンスを返します。 'ax.collections'で作成した' PathCollections'をループして、それぞれに 'set_rasterized'を使用することができますが、' set_rasterization_zorder'を使って見つけた方が簡単なオプションになります – tom

関連する問題