Speichern von Bildern in Python in sehr hoher Qualität

109

Wie kann ich Python-Plots in sehr hoher Qualität speichern?

Das heißt, wenn ich das in einer PDF-Datei gespeicherte Objekt weiter vergrößere, gibt es keine Unschärfe?

In welchem ​​Modus kann es am besten gespeichert werden?

png, eps? Oder irgendein anderes? Ich kann es nicht tun, pdfweil es eine versteckte Zahl gibt, die mit der LatexmkKompilierung zu tun hat .

Dustin
quelle

Antworten:

153

Wenn Sie matplotlibein Latexdokument verwenden und versuchen, gute Zahlen zu erhalten, speichern Sie es als EPS. Versuchen Sie Folgendes, nachdem Sie die Befehle ausgeführt haben, um das Bild zu zeichnen:

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

Ich habe festgestellt, dass EPS-Dateien am besten funktionieren und der dpiParameter dafür sorgt, dass sie in einem Dokument wirklich gut aussehen.

AKTUALISIEREN:

Um die Ausrichtung der Figur vor dem Speichern festzulegen, rufen Sie vor dem plt.savefigAufruf, jedoch nach dem Erstellen des Diagramms, Folgendes auf (vorausgesetzt, Sie haben mit einer Achse mit dem Namen gezeichnet ax):

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

Wobei elevation_angleeine Zahl (in Grad) den Polarwinkel (von der vertikalen z-Achse nach unten) und die azimuthal_angleden Azimutwinkel (um die z-Achse) angibt.

Ich finde, dass es am einfachsten ist, diese Werte zu bestimmen, indem man zuerst das Bild zeichnet und dann dreht und die aktuellen Werte der Winkel am unteren Rand des Fensters direkt unter dem tatsächlichen Diagramm anzeigt. Beachten Sie, dass die Positionen x, y, z standardmäßig angezeigt werden, jedoch durch die beiden Winkel ersetzt werden, wenn Sie mit dem Klicken + Ziehen + Drehen des Bildes beginnen.

spencerlyon2
quelle
@ spencerlon2 Was ist, wenn ich die Ausrichtung der Figur vor dem Speichern ändern möchte?
Dustin
13
Warum brauchen wir den DPI-Parameter? Ist das EPS nicht ein Vektorformat?
mkvoya
1
Guter Punkt - DPI wird nicht für Vektorformate wie svg, pdf, eps
spencerlyon2
Sie können weglassen, format='eps'wenn Sie möchten. In diesem Fall wird das Format aus dem Dateinamen abgeleitet.
Timgeb
72

Nur um meine Ergebnisse hinzuzufügen, auch mit matplotlib.

.eps machte meinen gesamten Text fett und entfernte die Transparenz. .svg gab mir hochauflösende Bilder, die tatsächlich wie meine Grafik aussahen.

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

Ich habe 1200 dpi verwendet, weil viele wissenschaftliche Zeitschriften Bilder mit 1200/600/300 dpi benötigen, je nachdem, von was das Bild ist. In die gewünschte dpi konvertieren und in GiMP oder Inkscape formatieren.

EDIT: Offensichtlich spielt die dpi keine Rolle, da .svg Vektorgrafiken sind und eine "unendliche Auflösung" haben.

grofte
quelle
2
Die DPI ist sehr wichtig, wenn wir sie imshow(..)irgendwo in der Figur verwenden. Diese Bitmaps werden gerastert, wenn sie in die SVG eingebettet werden. Mit der Standard-DPI sind die Ergebnisse sogar noch schlechter als auf dem Bildschirm, was für Veröffentlichungen definitiv ungeeignet ist.
Evgeni Sergeev
Ich empfehle außerdem Scour ( github.com/scour-project/scour ), um die Dateigröße Ihres SVG zu reduzieren. Bei der aggressivsten Einstellung kann ich meine Dateigröße auf 50% des Originals reduzieren - 5%, wenn ich das komprimierte .svgz-Format verwende.
Grofte
8

Okay, ich fand die Antwort von spencerlyon2 funktionierend, aber falls jemand nicht wusste, was er mit dieser einen Zeile anfangen sollte, musste ich es so machen:

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)
Jonatán Iván
quelle
6

Wenn Sie mit seegeborenen Plots anstelle von matplotlib arbeiten, können Sie ein PNG-Bild wie folgt speichern:

Angenommen, Sie haben ein matrixObjekt (entweder Pandas oder Numpy) und möchten eine Heatmap erstellen:

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

Dieser Code ist mit der neuesten Version von seaborn kompatibel. Andere Codes rund um den Stapelüberlauf funktionierten nur für frühere Versionen.

Ein anderer Weg, den ich mag, ist dieser. Ich stelle die Größe des nächsten Bildes wie folgt ein:

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

Und später zeichne ich die Ausgabe in der Konsole, von der ich sie kopieren und einfügen kann, wo ich will. (Da Seaborn auf Matplotlib gebaut ist, gibt es kein Problem.)

Leevo
quelle
5

Sie können in einer Größe von 1920 x 1080 (oder 1080p) speichern, indem Sie Folgendes verwenden:

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

Sie können auch viel höher oder niedriger gehen. Die oben genannten Lösungen eignen sich gut zum Drucken. Heutzutage möchten Sie jedoch, dass das erstellte Bild in ein PNG / JPG-Format umgewandelt oder in einem Breitbildformat angezeigt wird.

Eamonn Kenny
quelle