Matplotlib - Wie zeichnet man ein hochauflösendes Diagramm?

81

Ich habe matplotlib zum Zeichnen einiger experimenteller Ergebnisse verwendet (hier besprochen: Durchlaufen von Dateien und Plotten . Das Speichern des Bildes durch Klicken auf das Bild rechts führt jedoch zu Bildern mit sehr schlechter Qualität und niedriger Auflösung.

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()

Beispieldiagramm dessen, wonach ich suche: Beispieldiagramm

esilik
quelle

Antworten:

116

Sie können verwenden savefig(), um in eine Bilddatei zu exportieren:

plt.savefig('filename.png')

Darüber hinaus können Sie das dpiArgument für einen bestimmten Skalarwert angeben , z. B.:

plt.savefig('filename.png', dpi=300)
Ohad Eytan
quelle
Ich kann so einen Dateinamen nicht angeben. Das Skript durchläuft Dateien in 'fname in glob ("./*. Txt")'.
Esilik
Rufen Sie die Datei an, wie Sie möchten
Ohad Eytan
Es überschreibt die Daten und gibt nur zwei Bilder. Nicht wahr? Mein Ziel ist es, zwei Grafiken für jede Textdatei zu erhalten.
Esilik
So können Sie etwas tun wie plt.savefig(fname + 'Graph1.png')undplt.savefig(fname + 'Graph2.png')
Ohad Eytan
Toll! plt.savefig (fname + 'Graph1a.png', dpi = 600) für das erste Diagramm und plt.savefig (fname + 'Graph1a.png', dpi = 600) für das zweite Diagramm lösten das Problem. Vielen Dank!
Esilik
33

Verwenden Sie plt.figure(dpi=1200)vor allen Ihren plt.plot...und am Ende verwenden plt.savefig(...: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figure und http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig

Ophir Carmi
quelle
@deepfriedcyanide half mir bei meiner alten Frage, indem er sagte: " Das Dateinamenargument für savefig ist nur eine Zeichenfolge, sodass Sie Folgendes tun können: plt.savefig ('Ordner / Datei% d.png'% n) mit einer, die Sie hochzählen nach jeder Verschwörung. "Aber ich habe noch keine Idee. Wo und wie soll ich diese Codes in mein Skript einfügen?
Esilik
1
Großartig, das hat bei mir funktioniert! Jetzt sind meine Handlungen in 4K XD
Gonzalo Garcia
21

Sie können Ihr Diagramm als SVG speichern, um eine verlustfreie Qualität zu erzielen:

import matplotlib.pylab as plt

x = range(10)

plt.figure()
plt.plot(x,x)
plt.savefig("graph.svg")
JMat
quelle
3
Sie können auch als PDF speichern, plt.savefig("graph.pdf")was ebenfalls verlustfrei ist
Danny
3

Für zukünftige Leser, die diese Frage beim Versuch gefunden haben, hochauflösende Bilder von matplotlib so wie ich zu speichern, habe ich einige der obigen und anderen Antworten ausprobiert und sie hier zusammengefasst.

Bestes Ergebnis :plt.savefig('filename.pdf')

und dann konvertieren Sie dieses PDF in ein PNG in der Befehlszeile, damit Sie es in Powerpoint verwenden können:

pdftoppm -png -r 300 filename.pdf filename

Weniger erfolgreicher Test Nr. 1 :plt.savefig('filename.png', dpi=300)

Dadurch wird das Bild zwar etwas höher als die normale Auflösung gespeichert, es ist jedoch nicht hoch genug für Veröffentlichungen oder Präsentationen. Bei Verwendung eines dpi-Werts von bis zu 2000 werden bei Nahaufnahme immer noch unscharfe Bilder erzeugt.

Weniger erfolgreicher Test Nr. 2 :plt.savefig('filename.pdf')

Dies kann nicht in Microsoft Office Professional Plus 2016 (also kein Powerpoint) wie bei Google Slides geöffnet werden.

Weniger erfolgreicher Test Nr. 3 :plt.savefig('filename.svg')

Dies kann auch nicht in Powerpoint oder Google Slides mit demselben Problem wie oben geöffnet werden.

Weniger erfolgreicher Test Nr. 4 :plt.savefig('filename.pdf')

und dann Konvertieren in PNG in der Befehlszeile:

convert -density 300 filename.pdf filename.png

aber aus der Nähe betrachtet ist dies immer noch zu verschwommen.

Weniger erfolgreicher Test Nr. 5 :plt.savefig('filename.pdf')

und Öffnen in GIMP und Exportieren als qualitativ hochwertiges PNG (Erhöhung der Dateigröße von ~ 100 KB auf ~ 75 MB)

Weniger erfolgreicher Test Nr. 6 :plt.savefig('filename.pdf')

und dann in der Befehlszeile in JPEG konvertieren:

pdfimages -j filename.pdf filename

Dies führte zu keinen Fehlern, aber auch nach Änderung einiger Parameter zu keiner Ausgabe unter Ubuntu.

Christian Seitz
quelle
2

Zum Speichern des Diagramms:

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

Zum Anzeigen des Diagramms bei Verwendung von plt.show():

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

Fügen Sie sie einfach oben hinzu

Jason
quelle
0

Am Ende Ihrer for () - Schleife können Sie die savefig()Funktion anstelle von plt.show () verwenden und den Namen, die Auflösung und das Format Ihrer Figur festlegen.

ZB 1000 dpi und eps Format sind eine ziemlich gute Qualität, und wenn Sie jedes Bild im Ordner ./ mit den Namen 'Sample1.eps', 'Sample2.eps' usw. speichern möchten, können Sie einfach den folgenden Code hinzufügen:

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

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