2012-01-11 52 views
20

Estoy usando matplotlib (dentro de pylab) para mostrar las figuras. Y quiero guardarlos en formato .jpg. Cuando simplemente uso el comando savefig con extensión jpg esto devuelve:matplotlib savefig en formato jpeg

ValueError: Format "jpg" is not supported. 

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

¿Hay una manera de realizar esto?

+0

¿Se puede exportar a png, y convertir usando imagemagick? – Yann

+1

No está directamente relacionado con su problema, pero el arte de línea típicamente producido por matplotlib no funciona bien con el algoritmo de compresión utilizado por el formato JPEG que fue diseñado para fotografías borrosas. Comparar, p. la nitidez de las líneas en la respuesta de Yann o http://img.labnol.org/di/jpg_vs_png.png –

+0

Para las figuras que muestran puntos, líneas y/o curvas, siempre uso un formato de gráficos vectoriales como eps, ps, pdf , y creo emf en lugar de un formato de gráficos de trama como png o jpg. Esto produce cifras que son escalables sin pérdida de resolución y tamaños de archivo mucho más pequeños. Al pasar de png a pdf, puede reducir el tamaño de su imagen de 400 kB a 40 kB. Obtendrá resultados similares con fem, y MS Office (si no tiene la suerte de usar LaTeX) maneja bien la fem. – Chad

Respuesta

24

Puede guardar una imagen como 'png' y utilizar la biblioteca de imágenes de Python (PIL) para convertir este archivo a 'jpg':

import Image 
import matplotlib.pyplot as plt 

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

El original:

enter image description here

la imagen JPEG:

enter image description here

Hay algunos options para controlar la calidad de la imagen.

+0

biblioteca de imágenes python (PIL) no es tan fácil de instalar en Mac OS con python 2.7.2 ... Se trata de "error gcc-4.0 ..." :-( – cedm34

4

Acabo de actualizar matplotlib a 1.1.0 en mi sistema y ahora me permite guardar en jpg con savefig.

para actualizar a 1.1.0 con matplotlib pip, utilice este comando:

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

EDIT (para responder a comentar):

pylab es simplemente una agregación de la matplotlib.pyplot y numpy namespaces (así como algunos otros) jinto en un solo espacio de nombres.

En mi sistema, pylab es sólo esto:

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

Se puede ver que pylab es sólo otro espacio de nombres en su instalación matplotlib. Por lo tanto, no importa si lo importa o no con pylab o con matplotlib.pyplot.

Si sigues teniendo problemas, entonces supongo que el backend macosx no es compatible con guardar gots en jpg. Podría intentar usar un backend diferente. Ver here para más información.

+0

Tengo matplotlib 1.1.0. Pero yo estoy importando pylab en Mac, por lo tanto, tal vez la versión de matplotlib incluida no sea 1.1.0 pero no sé cómo estar seguro de eso. – cedm34

1

Matplotlib puede manejar jpg directa y transparente si tiene instalado PIL. No necesita llamarlo, lo hará solo. Si Python no puede encontrar el PIL, generará un error.

4

Simplemente instale la almohada con pip install pillow y funcionará.

13

Para aclarar y actualizar la respuesta útil de @neo y la pregunta original. Una solución limpia consiste en instalar Pillow, que es una versión actualizada de Python Imaging Library (PIL).Esto se hace usando

pip install pillow 

Una vez instalado almohada, el estándar Matplotlib comandos

import matplotlib.pyplot as plt 

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

salvará la figura en un archivo JPEG se no generar un ValueError más.

Contrariamente a la respuesta de @amillerrhodes, a partir de Matplotlib 2.0, los archivos JPEG no parecen ser compatibles. Si elimino el paquete Pillow, sigo recibiendo un ValueError sobre un tipo de archivo no admitido.

+0

Tengo pillow y png funciona bien. Aparece el error "IOError: encoder error -2 al escribir el archivo de imagen "cuando ejecuta exactamente su código en Enthought Canopy. – Keith

+0

@Keith el formato PNG es compatible con matplotlib, sin la necesidad de Pillow. Esto sugiere que su mensaje de error se debe a un problema con la instalación de Pillow . – divenex

+0

Para completar: probé los comandos anteriores para que funcionaran tanto en Ubuntu Linux como en Windows, con la distribución [Anaconda] (https://store.continuum.io/cshop/anaconda/) – divenex

Cuestiones relacionadas