Matplotlib - Jak wykreślić wykres o wysokiej rozdzielczości?

88

Użyłem matplotlib do wykreślania niektórych wyników eksperymentów (omówione tutaj: Zapętlanie po plikach i kreślenie . Jednak zapisanie obrazu poprzez kliknięcie prawym przyciskiem myszy daje obrazy bardzo złej jakości / niskiej rozdzielczości.

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

Przykładowy wykres tego, czego szukam: przykładowy wykres

esilik
źródło

Odpowiedzi:

126

Możesz użyć savefig()do wyeksportowania do pliku obrazu:

plt.savefig('filename.png')

Dodatkowo możesz podać dpiargument do jakiejś wartości skalarnej, na przykład:

plt.savefig('filename.png', dpi=300)
Ohad Eytan
źródło
Nie mogę tak określić nazwy pliku. Skrypt przegląda pliki w 'fname in glob ("./*. Txt")'.
esilik
zadzwoń do pliku, jak chcesz
Ohad Eytan
Nadpisze dane i da tylko dwa obrazy. Prawda? Moim celem jest uzyskanie dwóch wykresów dla każdego pliku tekstowego.
esilik
Więc możesz zrobić coś takiego jak plt.savefig(fname + 'Graph1.png')iplt.savefig(fname + 'Graph2.png')
Ohad Eytan
Świetny! plt.savefig (fname + 'Graph1a.png', dpi = 600) dla pierwszego wykresu, a plt.savefig (fname + 'Graph1a.png', dpi = 600) dla drugiego rozwiązało problem. Dzięki!
esilik
35

użyj plt.figure(dpi=1200)przed każdym użyciem plt.plot...i na koniec plt.savefig(...zobacz: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figure i http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig

Ophir Carmi
źródło
@deepfriedcyanide pomogło mi w moim starym pytaniu, mówiąc: „ Argument nazwy pliku dla savefig to tylko ciąg znaków, więc możesz zrobić coś takiego: plt.savefig ('folder / plik% d.png'% n) z wartością, którą policzysz po każdym spisku. ”Ale nie mam jeszcze pomysłu. Gdzie mam umieścić te kody w moim skrypcie i jak?
esilik
1
Świetnie, to zadziałało dla mnie! teraz moje działki są w 4K XD
Gonzalo Garcia
23

Możesz zapisać swój wykres jako svg, aby uzyskać bezstratną jakość:

import matplotlib.pylab as plt

x = range(10)

plt.figure()
plt.plot(x,x)
plt.savefig("graph.svg")
JMat
źródło
5
Możesz także zapisać jako PDF, plt.savefig("graph.pdf")który również jest bezstratny
Danny
6

Dla przyszłych czytelników, którzy znaleźli to pytanie, próbując zapisać obrazy o wysokiej rozdzielczości z matplotlib tak, jak ja, wypróbowałem niektóre odpowiedzi powyżej i gdzie indziej i podsumowałem je tutaj.

Najlepszy wynik :plt.savefig('filename.pdf')

a następnie przekonwertuj ten plik PDF na png w wierszu poleceń, aby móc go używać w programie PowerPoint:

pdftoppm -png -r 300 filename.pdf filename

LUB po prostu otwierając plik PDF i przycinając do potrzebnego obrazu w Adobe, zapisując jako png i importując obraz do programu PowerPoint

Mniej udany test nr 1 :plt.savefig('filename.png', dpi=300)

W ten sposób obraz jest nieco wyższy niż normalna rozdzielczość, ale nie jest wystarczająco wysoki do publikacji lub niektórych prezentacji. Korzystanie z wartości dpi do 2000 nadal powodowało rozmycie obrazu przy oglądaniu z bliska.

Mniej udany test nr 2 :plt.savefig('filename.pdf')

Nie można tego otworzyć w Microsoft Office Professional Plus 2016 (więc nie w programie PowerPoint), tak samo z Google Slides.

Mniej udany test nr 3 :plt.savefig('filename.svg')

Nie można tego również otworzyć w programie PowerPoint lub Prezentacjach Google, z tym samym problemem co powyżej.

Mniej udany test nr 4 :plt.savefig('filename.pdf')

a następnie konwertowanie do png w linii poleceń:

convert -density 300 filename.pdf filename.png

ale widok z bliska jest nadal zbyt rozmyty.

Mniej udany test nr 5 :plt.savefig('filename.pdf')

i otwieranie w GIMP i eksportowanie jako wysokiej jakości png (zwiększono rozmiar pliku z ~ 100 KB do ~ 75 MB)

Mniej udany test nr 6 :plt.savefig('filename.pdf')

a następnie konwertowanie do formatu jpeg w wierszu poleceń:

pdfimages -j filename.pdf filename

Nie spowodowało to żadnych błędów, ale nie wygenerowało danych wyjściowych w systemie Ubuntu nawet po zmianie kilku parametrów.

Christian Seitz
źródło
1
.pdfbyła dla mnie również najlepsza. Prawie doskonała jakość powiększona do końca, tak jak 4k. Zamiast konwertować w linii poleceń, wystarczy zrobić zrzut ekranu pliku .pdf i zapisać go w formacie png.
David Erickson
2

Aby zapisać wykres:

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

Do wyświetlania wykresu podczas używania plt.show():

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

Po prostu dodaj je u góry

Jason
źródło
0

Na końcu pętli for () możesz użyć savefig()funkcji zamiast plt.show () i ustawić nazwę, dpi i format figury.

Np. Format 1000 dpi i eps są całkiem niezłej jakości, a jeśli chcesz zapisać każde zdjęcie w folderze ./ o nazwach „Sample1.eps”, „Sample2.eps” itp., Możesz po prostu dodać następujący kod:

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

    plt.savefig("./{}.eps".format(fname), bbox_inches='tight', format='eps', dpi=1000)
Jalo
źródło