2013-07-18 12 views
8

私は、対応するラスターファイル(PNG)よりも大きなベクトルファイル(PDF)を生成する波形(およびその他のもの)をプロットしています。これは、プロットされたデータセットが非常に大きく、ベクトルファイルに数百万の命令があるためです。 PDFが大きくなることを除いて、PDFリーダーは表示するのが非常に難しいです。いくつかの場合、ロードには数秒かかります。他の人には、まったく読み込まれません。matplotlibベクトルマップのビットマッププロット

pyplotでは、ベクトル軸、ラベル、その他すべてのテキストを含むビットマッププロットを使用できますか?

私の(非常に悪い)解決策は、PDFを生成し、PNGを生成し、inkscapeでPDFを開き、プロットをPNGに置き換えることです。あなたがプロットを再生成しなければならないと分かっているのであれば、これはあまりにも手作業であり、非常に時間がかかることは明らかです。

+0

をやっているだけの自動化バージョンであり、他の人が同じ要求を行いました。 https://docs.google.com/spreadsheet/ccc?key=0AjrPjlTMRTwTdHpQS25pcTZIRWdqX0pNckNSU01sMHc&usp=sharing – esmit

答えて

10

rasterized=Trueplotコマンドに渡すのと同じくらい簡単です。

など。私にとって

import matplotlib.pyplot as plt 

plt.plot(range(10), rasterized=True) 
plt.savefig('test.pdf') 

、このラスタライズライン(解像度はあなたがsavefigで指定した解像度によって制御される - デフォルトでは、それは100だ)してPDFをもたらし、ベクトルテキスト。

+0

これまで私は正解とマークしたことはありませんでしたが、これまでずっと使用してきました。それはまさに私が探していたものです、私はどのように私がドキュメントでそれを逃したのか分かりません。どうもありがとう! – gozzilli

1

私はこの問題のために汚れた「修正」を使用します。私は単純にプロットを2回生成します。一度すべてのフレーム、タイトルなどを削除し、pngとして保存し、それ以外の場合は、実際のデータを削除し、ベクターデータとして必要なすべてのコンポーネントをpdfに保存します。次に、ImageMagickを使用して、pngをビットマップデータを含むpdfに変換し、pdftkを使用してpdfからベクターデータをオーバーレイします。ここでは、私が説明したように適合したmatplotlibページのpcolorの例を示します。

import matplotlib.pyplot as plt 
import numpy as np 
import os 

for case in ['frame','data']: 

    # make these smaller to increase the resolution                         
    dx, dy = 0.02, 0.02 

    # generate 2 2d grids for the x & y bounds                          
    y, x = np.mgrid[slice(-3, 3 + dy, dy), 
        slice(-3, 3 + dx, dx)] 
    z = (1 - x/2. + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2) 
    # x and y are bounds, so z should be the value *inside* those bounds.                    
    # Therefore, remove the last value from the z array.                        
    z = z[:-1, :-1] 
    z_min, z_max = -np.abs(z).max(), np.abs(z).max() 


    fig=plt.figure() 
    ax=fig.add_subplot(1,1,1) 
    im=plt.pcolor(x, y, z, cmap='RdBu', vmin=z_min, vmax=z_max) 
    plt.title('pcolor') 
    # set the limits of the plot to the limits of the data                       
    plt.axis([x.min(), x.max(), y.min(), y.max()]) 

    if case is 'frame': 
     im.remove() 
     plt.savefig("frame.pdf",transparent=True) 
    if case is 'data': 
     ax.axison=False 
     plt.title('') 
     plt.savefig("data.png",transparent=True) 



os.system('convert data.png data.pdf') 
os.system('pdftk frame.pdf background data.pdf output final_plot.pdf') 
os.system('rm data.png data.pdf frame.pdf') 

は基本的に、それはあなたがすでに最近の(現在進行中?)matplotlibの調査の詳細なコメントを通じて読む...

+1

素敵なトリックですが、@ジョーキングトンの答えは簡単できれいです。私は本当にそのオプションを試すことをお勧めします! – gozzilli

+0

確かに本当です。物事を楽にします。私は、このラスタライズオプションが何をするのか間違った考えを持っていたことに気付きました... –