guardar imágenes en python con una calidad muy alta


109

¿Cómo puedo guardar parcelas de Python con una calidad muy alta?

Es decir, cuando sigo haciendo zoom en el objeto guardado en un archivo pdf, ¿no hay desenfoque?

Además, ¿cuál sería el mejor modo para guardarlo?

png, eps? ¿O alguna otra? No puedo hacerlo pdfporque hay un número oculto que pasa por ese lío con la Latexmkcompilación.

Respuestas:


153

Si está utilizando matplotliby tratando de obtener buenas cifras en un documento de látex, guárdelo como eps. Específicamente, intente algo como esto después de ejecutar los comandos para trazar la imagen:

plt.savefig('destination_path.eps', format='eps')

He descubierto que los archivos eps funcionan mejor y el dpiparámetro es lo que realmente los hace lucir bien en un documento.

ACTUALIZAR:

Para especificar la orientación de la figura antes de guardar, simplemente llame a lo siguiente antes de la plt.savefigllamada, pero después de crear el gráfico (asumiendo que ha trazado utilizando un eje con el nombre ax):

ax.view_init(elev=elevation_angle, azim=azimuthal_angle)

Donde elevation_anglees un número (en grados) que especifica el ángulo polar (hacia abajo desde el eje vertical z) y azimuthal_angleespecifica el ángulo azimutal (alrededor del eje z).

Encuentro que es más fácil determinar estos valores trazando primero la imagen y luego girándola y viendo los valores actuales de los ángulos aparecer hacia la parte inferior de la ventana justo debajo del gráfico real. Tenga en cuenta que las posiciones x, y, z aparecen de forma predeterminada, pero se reemplazan con los dos ángulos cuando comienza a hacer clic + arrastrar + rotar la imagen.


@ spencerlon2 ¿y si quiero cambiar la orientación de la figura antes de guardar?
dustin

13
¿Por qué necesitamos el parámetro DPI? ¿No es el eps un formato vectorial?
mkvoya

1
Buen punto: no se necesita DPI para formatos vectoriales como svg, pdf, eps
spencerlyon2

Puede omitir format='eps'si lo desea. En este caso, el formato se infiere del nombre del archivo.
timgeb

72

Solo para agregar mis resultados, también usando matplotlib.

.eps puso todo mi texto en negrita y eliminó la transparencia. .svg me dio imágenes de alta resolución que en realidad se parecían a mi gráfico.

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# Do the plot code
fig.savefig('myimage.svg', format='svg', dpi=1200)

Usé 1200 ppp porque muchas revistas científicas requieren imágenes en 1200/600/300 ppp, dependiendo de qué sea la imagen. Convierta a los dpi deseados y formatee en GiMP o Inkscape.

EDITAR: Obviamente, el ppp no ​​importa ya que .svg son gráficos vectoriales y tienen "resolución infinita".


2
El DPI importa mucho cuando lo usamos en imshow(..)algún lugar de la figura. Estos mapas de bits se rasterizan a medida que se integran en el SVG. Con el DPI predeterminado, los resultados son incluso peores de lo que vemos en pantalla, definitivamente no apto para publicaciones.
Evgeni Sergeev

También recomiendo ampliamente Scour ( github.com/scour-project/scour ) para reducir el tamaño de archivo de su svg. En la configuración más agresiva, puedo reducir el tamaño de mi archivo al 50% del original - 5% si uso el formato comprimido .svgz.
grofte

8

De acuerdo, encontré que la respuesta de spencerlyon2 funcionaba, sin embargo, en caso de que alguien se encontrara sin saber qué hacer con esa línea, tenía que hacerlo de esta manera:

beingsaved = plt.figure()

# some scatters
plt.scatter(X_1_x, X_1_y)
plt.scatter(X_2_x, X_2_y)

beingsaved.savefig('destination_path.eps', format='eps', dpi=1000)

6

En caso de que esté trabajando con parcelas nacidas en el mar , en lugar de matplotlib, puede guardar una imagen .png como esta:

Supongamos que tiene un matrixobjeto (ya sea pandas o numpy) y desea tomar un mapa de calor:

import seaborn as sb

image = sb.heatmap(matrix)   # this gets you the heatmap
image.figure.savefig("C:/Your/Path/ ... /your_image.png")   # this saves it

Este código es compatible con la última versión de seaborn. Otros códigos relacionados con stackoverflow funcionaron solo para versiones anteriores.

Otra forma que me gusta es esta. Establezco el tamaño de la siguiente imagen de la siguiente manera:

plt.subplots(figsize=(15,15))

Y luego trazo la salida en la consola, desde la cual puedo copiarla y pegarla donde quiera. (Dado que seaborn está construido sobre matplotlib, no habrá ningún problema).


5

Puede guardar en una cifra de 1920x1080 (o 1080p) usando:

fig = plt.figure(figsize=(19.20,10.80))

También puedes subir o bajar mucho más. Las soluciones anteriores funcionan bien para imprimir, pero en estos días desea que la imagen creada vaya en PNG / JPG o aparezca en un formato de pantalla ancha.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.