salvare le immagini in Python con una qualità molto alta


109

Come posso salvare i grafici Python ad altissima qualità?

Cioè, quando continuo a ingrandire l'oggetto salvato in un file pdf, non c'è sfocatura?

Inoltre, quale sarebbe la modalità migliore per salvarlo?

png, eps? O qualcun altro? Non posso farlo pdfperché c'è un numero nascosto che succede con la Latexmkcompilazione.

Risposte:


153

Se stai usando matplotlibe stai cercando di ottenere buone figure in un documento in lattice, salva come eps. In particolare, prova qualcosa di simile dopo aver eseguito i comandi per tracciare l'immagine:

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

Ho scoperto che i file eps funzionano meglio e il dpiparametro è ciò che li rende davvero belli in un documento.

AGGIORNARE:

Per specificare l'orientamento della figura prima di salvare è sufficiente chiamare quanto segue prima della plt.savefigchiamata, ma dopo aver creato il grafico (assumendo che tu abbia tracciato utilizzando un asse con il nome ax):

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

Dove elevation_angleè un numero (in gradi) che specifica l'angolo polare (in basso rispetto all'asse z verticale) e azimuthal_anglespecifica l'angolo azimutale (attorno all'asse z).

Trovo che sia più semplice determinare questi valori tracciando prima l'immagine e poi ruotandola e osservando i valori correnti degli angoli apparire verso la parte inferiore della finestra appena sotto il grafico effettivo. Tieni presente che le posizioni x, y, z vengono visualizzate per impostazione predefinita, ma vengono sostituite con i due angoli quando inizi a fare clic + trascinare + ruotare l'immagine.


@ spencerlon2 e se volessi cambiare l'orientamento della figura prima di salvare?
dustin

13
Perché abbiamo bisogno del parametro DPI? L'EPS non è un formato vettoriale?
mkvoya

1
Buon punto: DPI non è necessario per i formati vettoriali come svg, pdf, eps
spencerlyon2

Puoi omettere format='eps'se vuoi. In questo caso il formato viene dedotto dal nome del file.
timgeb

72

Solo per aggiungere i miei risultati, anche usando matplotlib.

.eps ha reso tutto il mio testo in grassetto e rimosso la trasparenza. .svg mi ha fornito immagini ad alta risoluzione che in realtà somigliavano al mio grafico.

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

Ho usato 1200 dpi perché molte riviste scientifiche richiedono immagini a 1200/600/300 dpi a seconda di cosa è l'immagine. Converti in dpi e formato desiderati in GiMP o Inkscape.

EDIT: Ovviamente il dpi non ha importanza poiché .svg sono grafici vettoriali e hanno "risoluzione infinita".


2
Il DPI è molto importante quando lo usiamo imshow(..)da qualche parte sulla figura. Queste bitmap vengono rasterizzate non appena vengono incorporate nell'SVG. Con il DPI di default i risultati sono anche peggiori di quello che vediamo a schermo, decisamente inadatto alle pubblicazioni.
Evgeni Sergeev

Consiglio vivamente anche Scour ( github.com/scour-project/scour ) per ridurre la dimensione del file del tuo svg. Con l'impostazione più aggressiva posso ridurre la dimensione del mio file al 50% dell'originale - 5% se utilizzo il formato compresso .svgz.
grofte

8

Ok, ho trovato la risposta di spencerlyon2 funzionante, tuttavia nel caso qualcuno si trovasse a non sapere cosa fare con quella riga, ho dovuto farlo in questo modo:

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)

7

Nel caso in cui tu stia lavorando con Seaborn Plots , invece di matplotlib, puoi salvare un'immagine .png come questa:

Supponiamo che tu abbia un matrixoggetto (panda o numpy) e desideri prendere una mappa di calore:

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

Questo codice è compatibile con l'ultima versione di Seaborn. Altri codici attorno a stackoverflow funzionavano solo per le versioni precedenti.

Un altro modo che mi piace è questo. Ho impostato la dimensione dell'immagine successiva come segue:

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

E poi in seguito traccio l'output nella console, da cui posso copiarlo e incollarlo dove voglio. (Poiché seaborn è costruito sopra matplotlib, non ci saranno problemi.)


5

Puoi salvare in una cifra che è 1920x1080 (o 1080p) usando:

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

Puoi anche andare molto più in alto o più in basso. Le soluzioni di cui sopra funzionano bene per la stampa, ma in questi giorni vuoi che l'immagine creata vada in PNG / JPG o appaia in un formato widescreen.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.