2013-07-18 23 views
8

Bu yüzden, ilgili raster dosyasından (PNG) daha büyük bir vektör dosyasına (PDF) neden olan bir dalga formu (ve diğer şeyler) çiziyorum. Bunun nedeni, çizilen veri kümesinin çok büyük olması ve vektör dosyasında milyonlarca komut bulunmasıdır. PDF okuyucu, daha büyük olmak yerine, PDF okuyucu için de oldukça zor. Bazılarında, yüklenmesi birkaç saniye sürer; diğerleri üzerinde, hiç yüklenmez.matplotlib bitmap vektörlü metinle arsa

Plotta, vektör eksenleri, etiketleri ve diğer tüm metinlerle bitmap çizimine sahip olmak mümkün mü?

Şu anki (çok kötü) bir çözüm, PDF oluşturmak, PNG'yi oluşturmak, PDF'yi inkscape ile açmak ve grafiği PNG ile değiştirmek. Tabii ki bu arsa yeniden yapmak zorunda olduğunuzu fark ederseniz çok manuel ve çok zaman alıcıdır.

+0

, bir başka kişi bu aynı istekte bulundu. https://docs.google.com/spreadsheet/ccc?key=0AjrPjlTMRTwTdHpQS25pcTZIRWdqX0pNckNSU01sMHc&usp=sharing – esmit

cevap

10

rasterized=True içinde plot komutuna geçmek kadar basit olmalıdır.

E.g. Benim için

import matplotlib.pyplot as plt 

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

, bu rasterleştirilmiş hattıyla bir pdf sonuçlanır - ve vektör metin (çözünürlük sen savefig ile belirtilen dpi tarafından kontrol edilir, varsayılan olarak bu 100 var).

+0

Sadece bunu doğru yanıt olarak işaretlemediğimi fark ettim, ancak o zamandan beri kullanıyorum. Tam olarak aradığım şey, dokümanlardaki cevaplarımı bilmiyorum. Çok teşekkürler! – gozzilli

1

Bu sorun için kirli bir "düzeltme" kullanıyorum. Ben sadece komployu iki kere üretiyorum. Tüm çerçeveler, başlıklar, vb. Kaldırıldıktan sonra png olarak kaydedilir ve diğer durumda, gerçek verileri çıkarırım ve vektör verileri olarak istediğim tüm bileşenleri bir pdf'ye kaydediyorum. Sonra png'yi bitmap verileri içeren pdf'ye dönüştürmek ve pdftk'yi kullanarak vektör verilerini pdf'den görüntülemek için ImageMagick'i kullanıyorum. Burada, tarif ettiğim şekilde uyarlanmış matplotlib sayfasından pcolor örneği var.

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') 

Temelde bir son (devam ediyor?) Matplotlib anketin detaylı açıklamalar okumak, zaten ne yaptığını sadece otomatize bir versiyonu ...

+1

Güzel hile, ama @Joe Kington tarafından cevap kolay ve temiz. Bu seçeneği denemenizi tavsiye ederim! – gozzilli

+0

Doğru, gerçekten. İşleri kolaylaştırır. Bu rasterize seçeneğinin ne yaptığına dair yanlış bir fikrim olduğunun farkındayım. –