2013-07-18 12 views
8

Tak więc, wykreślam przebieg (i inne rzeczy), które skutkują większym plikiem wektorowym (PDF) niż odpowiadający mu plik rastrowy (PNG). Wyobrażam sobie, że dzieje się tak dlatego, że zestaw danych jest bardzo duży, aw pliku wektorowym znajdują się miliony instrukcji. Poza tym, że jest większy, PDF jest dość trudny do wyświetlenia. Na niektórych załadowanie trwa kilka sekund; na innych nie ładuje się wcale.Matplotlib bitmap plot z tekstem wektorowym

Czy w pyplot możliwy jest wykres bitmapowy z osiami wektorowymi, etykietami i wszystkimi innymi tekstami?

Moje (bardzo złe) rozwiązanie polega na wygenerowaniu pliku PDF, wygenerowaniu pliku PNG, otwarciu pliku PDF za pomocą programu inkscape i zamianie wykresu na plik PNG. Oczywiście jest to zbyt ręczne i bardzo czasochłonne, jeśli zdasz sobie sprawę, że musisz zregenerować fabułę.

+0

Czytając szczegółowych uwag ostatniej (trwającego?) Badaniu matplotlib, inna osoba popełnił ten sam wniosek. https://docs.google.com/spreadsheet/ccc?key=0AjrPjlTMRTwTdHpQS25pcTZIRWdqX0pNckNSU01sMHc&usp=Sharing – esmit

Odpowiedz

10

Powinno być tak proste, jak przekazanie w rasterized=True komendy plot.

E.g.

import matplotlib.pyplot as plt 

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

Dla mnie to skutkuje pdf z linii rastrowych (rozdzielczość jest kontrolowana przez DPI określonym z savefig - domyślnie jest to 100) i tekst wektorowy.

+0

Po prostu zdałem sobie sprawę, że nigdy nie zaznaczyłem, że jest to poprawna odpowiedź, mimo że używam jej od tamtej pory. Dokładnie to, czego szukałem, nie wiem, jak to przegapiłem w dokumentach. Wielkie dzięki! – gozzilli

1

Używam brudnej "poprawki" dla tego problemu. Po prostu produkuję fabułę dwa razy. Po usunięciu wszystkich ramek, tytułów itp. I zapisaniu jako png, usuwam aktualne dane i zapisuję wszystkie komponenty, które chcę, jako dane wektorowe w pliku PDF. Następnie używam ImageMagick do konwersji png do pliku PDF zawierającego dane bitmap i nakładania danych wektorowych z pliku pdf za pomocą pdftk. Oto przykład pcolor ze strony matplotlib zaadaptowany w opisany właśnie sposób.

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

Zasadniczo jest to tylko zautomatyzowana wersja tego, co już robisz ...

+1

Dobra sztuczka, ale odpowiedź @Joe Kington jest łatwa i czysta. Naprawdę polecam wypróbowanie tej opcji! – gozzilli

+0

To prawda. Ułatwia sprawy. Zdaję sobie sprawę, że nie miałem pojęcia, co robi ta opcja rasteryzacji ... –