2012-01-11 14 views
20

Sto usando matplotlib (all'interno di pylab) per visualizzare le figure. E voglio salvarli nel formato .jpg. Quando mi è sufficiente utilizzare il comando di savefig con estensione jpg restituisce:savefig matplotlib in formato jpeg

ValueError: Format "jpg" is not supported. 

Supported formats: emf, eps, pdf, png, ps, raw, rgba, svg, svgz.

C'è un modo per eseguire questa?

+0

Puoi esportare in png e convertire utilizzando imagemagick? – Yann

+1

Non direttamente correlato al problema, ma la grafica al tratto tipicamente prodotta da matplotlib non funziona bene con l'algoritmo di compressione utilizzato dal formato JPEG che è stato progettato per fotografie sfocate. Confronta per es. la nitidezza delle linee nella risposta di Yann o http://img.labnol.org/di/jpg_vs_png.png –

+0

Per le figure che mostrano punti, linee e/o curve, uso sempre un formato di grafica vettoriale come eps, ps, pdf e penso che emf piuttosto che un formato grafico raster come png o jpg. Questo produce figure che sono scalabili senza perdita di risoluzione e dimensioni di file molto più piccole. Passando da png a pdf, potresti ridurre le dimensioni dell'immagine da 400 kB a 40 kB. Otterrete risultati simili con emf e MS Office (se non siete abbastanza fortunati da usare LaTeX) gestisce bene emf. – Chad

risposta

24

È possibile salvare un'immagine come 'png' e utilizzare la libreria di imaging python (PIL) per convertire questo file per 'jpg':

import Image 
import matplotlib.pyplot as plt 

plt.plot(range(10)) 
plt.savefig('testplot.png') 
Image.open('testplot.png').save('testplot.jpg','JPEG') 

L'originale:

enter image description here

l'immagine JPEG:

enter image description here

Ci sono alcuni options per il controllo della qualità dell'immagine.

+0

python imaging library (PIL) non è così facile da installare su Mac OS con python 2.7.2 ... Si tratta di "errore gcc-4.0 ..." :-( – cedm34

4

Ho appena aggiornato matplotlib alla versione 1.1.0 sul mio sistema e ora mi consente di salvare in jpg con savefig.

per l'aggiornamento a 1.1.0 matplotlib con pip, utilizzare questo comando:

pip install -U 'http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.1.0/matplotlib-1.1.0.tar.gz/download' 

EDIT (per rispondere alle osservazioni):

pylab è semplicemente un'aggregazione del matplotlib.pyplot e gli spazi dei nomi di Numpy (così come alcuni altri) hanno creato un singolo spazio dei nomi.

Sul mio sistema, pylab è proprio questo:

from matplotlib.pylab import * 
import matplotlib.pylab 
__doc__ = matplotlib.pylab.__doc__ 

Si può vedere che pylab è solo un altro spazio dei nomi nella propria installazione matplotlib. Pertanto, non importa se lo si importa con pylab o con matplotlib.pyplot.

Se il problema persiste, suppongo che il backend di macosx non supporti il ​​salvataggio di grafici su jpg. Potresti provare a utilizzare un back-end diverso. Vedere here per ulteriori informazioni.

+0

Ho matplotlib 1.1.0. sto importando pylab su Mac quindi forse la versione di matplotlib inclusa non è la 1.1.0 ma non so come fare per assicurarmene – cedm34

1

Matplotlib può gestire direttamente e in modo trasparente jpg se è stato installato PIL. Non è necessario chiamarlo, lo farà da solo. Se Python non riesce a trovare PIL, genererà un errore.

4

Basta installare il cuscino con pip install pillow e funzionerà.

13

Per chiarire e aggiornare la risposta utile @neo e la domanda originale. Una soluzione pulita consiste nell'installazione di Pillow, che è una versione aggiornata di Python Imaging Library (PIL).Questo viene fatto usando

pip install pillow 

Una volta cuscino è installato, lo standard Matplotlib comandi

import matplotlib.pyplot as plt 

plt.plot([1, 2]) 
plt.savefig('image.jpg') 

salverà la figura in un file JPEG e sarà non generare un ValueError più.

Contrariamente alla risposta di @amillerrhodes, a partire da Matplotlib 2.0, i file JPEG non sembrano essere supportati. Se rimuovo il pacchetto Pillow, ricevo comunque un errore ValueError relativo a un tipo di file non supportato.

+0

Ho cuscino e png funziona bene.Vengo visualizzato l'errore "IOError: errore encoder -2 durante la scrittura del file di immagine "quando si esegue esattamente il codice in Enthought Canopy. – Keith

+0

@Keith il formato PNG è supportato immediatamente da matplotlib, senza necessità di cuscino. Ciò suggerisce che il messaggio di errore è dovuto a un problema con l'installazione del cuscino – divenex

+0

Per completezza: ho provato i suddetti comandi per lavorare sia con Ubuntu Linux che con Windows, con la distribuzione [Anaconda] (https://store.continuum.io/cshop/anaconda/) – divenex

Problemi correlati