Matplotlib - ¿Cómo trazar un gráfico de alta resolución?

81

He usado matplotlib para trazar algunos resultados experimentales (lo discutimos aquí: recorrer archivos y trazar . Sin embargo, guardar la imagen haciendo clic derecho a la imagen da imágenes de muy mala calidad / baja resolución.

from glob import glob
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# loop over all files in the current directory ending with .txt
for fname in glob("./*.txt"):
    # read file, skip header (1 line) and unpack into 3 variables
    WL, ABS, T = np.genfromtxt(fname, skip_header=1, unpack=True)

    # first plot
    plt.plot(WL, T, label='BN', color='blue')

    plt.xlabel('Wavelength (nm)')
    plt.xlim(200,1000)
    plt.ylim(0,100)
    plt.ylabel('Transmittance, %')
    mpl.rcParams.update({'font.size': 14})
    #plt.legend(loc='lower center')
    plt.title('')
    plt.show()
    plt.clf()


    # second plot
    plt.plot(WL, ABS, label='BN', color='red')
    plt.xlabel('Wavelength (nm)')
    plt.xlim(200,1000)
    plt.ylabel('Absorbance, A')
    mpl.rcParams.update({'font.size': 14})
    #plt.legend()
    plt.title('')
    plt.show()
    plt.clf()

Gráfico de ejemplo de lo que estoy buscando: gráfico de ejemplo

esilik
fuente

Respuestas:

116

Puede utilizar savefig()para exportar a un archivo de imagen:

plt.savefig('filename.png')

Además, puede especificar el dpiargumento a algún valor escalar, por ejemplo:

plt.savefig('filename.png', dpi=300)
Ohad Eytan
fuente
No puedo especificar un nombre de archivo como ese. El script pasa por archivos en 'fname in glob ("./*. Txt")'.
esilik
llame al archivo como quiera
Ohad Eytan
Sobrescribirá los datos y solo dará dos imágenes. ¿No es así? Mi objetivo es obtener dos gráficos para cada archivo de texto.
esilik
Entonces puedes hacer algo como plt.savefig(fname + 'Graph1.png')yplt.savefig(fname + 'Graph2.png')
Ohad Eytan
¡Excelente! plt.savefig (fname + 'Graph1a.png', dpi = 600) para el primer gráfico, y plt.savefig (fname + 'Graph1a.png', dpi = 600) para el segundo resolvió el problema. ¡Gracias!
esilik
33

use plt.figure(dpi=1200)antes de todo plt.plot...y al final, plt.savefig(...consulte: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figure y http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig

Ophir Carmi
fuente
@deepfriedcyanide me ayudó en mi vieja pregunta diciendo: " El argumento del nombre de archivo para savefig es solo una cadena, por lo que puedes hacer algo como: plt.savefig ('carpeta / archivo% d.png'% n) con un que cuentes después de cada trama. "Pero todavía no entiendo la idea. ¿Dónde debo poner estos códigos en mi script y cómo?
Esilik
1
¡Genial esto funcionó para mí! ahora mis parcelas están en 4K XD
Gonzalo García
21

Puede guardar su gráfico como svg para una calidad sin pérdidas:

import matplotlib.pylab as plt

x = range(10)

plt.figure()
plt.plot(x,x)
plt.savefig("graph.svg")
JMat
fuente
3
También puede guardar como PDF, plt.savefig("graph.pdf")que también no tiene pérdidas
Danny
3

Para los futuros lectores que encontraron esta pregunta mientras intentaban guardar imágenes de alta resolución de matplotlib como yo, probé algunas de las respuestas anteriores y en otros lugares, y las resumí aquí.

Mejor resultado :plt.savefig('filename.pdf')

y luego convertir este pdf a png en la línea de comando para que pueda usarlo en powerpoint:

pdftoppm -png -r 300 filename.pdf filename

Prueba menos exitosa # 1 :plt.savefig('filename.png', dpi=300)

Esto guarda la imagen a una resolución un poco más alta que la normal, pero no es lo suficientemente alta para la publicación o algunas presentaciones. El uso de un valor de ppp de hasta 2000 aún produce imágenes borrosas cuando se ve de cerca.

Prueba menos exitosa # 2 :plt.savefig('filename.pdf')

Esto no se puede abrir en Microsoft Office Professional Plus 2016 (por lo tanto, no en PowerPoint), lo mismo con Google Slides.

Prueba menos exitosa # 3 :plt.savefig('filename.svg')

Esto tampoco se puede abrir en PowerPoint o Google Slides, con el mismo problema que el anterior.

Prueba menos exitosa # 4 :plt.savefig('filename.pdf')

y luego convertir a png en la línea de comando:

convert -density 300 filename.pdf filename.png

pero esto todavía es demasiado borroso cuando se ve de cerca.

Prueba menos exitosa # 5 :plt.savefig('filename.pdf')

y abrir en GIMP, y exportar como png de alta calidad (aumentó el tamaño del archivo de ~ 100 KB a ~ 75 MB)

Prueba menos exitosa # 6 :plt.savefig('filename.pdf')

y luego convertir a jpeg en la línea de comando:

pdfimages -j filename.pdf filename

Esto no produjo ningún error, pero no produjo una salida en Ubuntu incluso después de cambiar varios parámetros.

Christian Seitz
fuente
2

Para guardar el gráfico:

matplotlib.rcParams['savefig.dpi'] = 300

Para mostrar el gráfico cuando usa plt.show():

matplotlib.rcParams["figure.dpi"] = 100

Solo agrégalos en la parte superior

Jason
fuente
0

Al final de su ciclo for () , puede usar la savefig()función en lugar de plt.show () y establecer el nombre, dpi y formato de su figura.

Por ejemplo, el formato de 1000 dpi y eps es de buena calidad, y si desea guardar todas las imágenes en la carpeta ./ con los nombres 'Sample1.eps', 'Sample2.eps', etc., simplemente puede agregar el siguiente código:

for fname in glob("./*.txt"):
    # Your previous code goes here
    [...]

    plt.savefig("./{}.eps".format(fname), bbox_inches='tight', format='eps', dpi=1000)
Jalo
fuente