zapisywanie obrazów w Pythonie w bardzo wysokiej jakości

109

Jak mogę zapisać wykresy Pythona w bardzo wysokiej jakości?

Oznacza to, że kiedy powiększam obiekt zapisany w pliku pdf, nie ma rozmycia?

W jakim trybie najlepiej go zapisać?

png, eps? Albo inny? Nie mogę tego zrobić, pdfponieważ jest ukryta liczba, która zdarza się, że bałagan przy Latexmkkompilacji.

dustin
źródło

Odpowiedzi:

153

Jeśli używasz matplotlibi próbujesz uzyskać dobre wyniki w dokumencie lateksowym, zapisz jako eps. W szczególności spróbuj czegoś takiego po uruchomieniu poleceń, aby wykreślić obraz:

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

Zauważyłem, że pliki eps działają najlepiej, a dpiparametr jest tym, co naprawdę sprawia, że ​​wyglądają dobrze w dokumencie.

AKTUALIZACJA:

Aby określić orientację figury przed zapisaniem, po prostu wywołaj następujące polecenie przed plt.savefigwywołaniem, ale po utworzeniu wykresu (zakładając, że narysowałeś za pomocą osi z nazwą ax):

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

Gdzie elevation_anglejest liczbą (w stopniach) określającą kąt biegunowy (w dół od pionowej osi z), a azimuthal_angleokreślającą kąt azymutalny (wokół osi z).

Uważam, że najłatwiej jest określić te wartości, najpierw wykreślając obraz, a następnie obracając go i obserwując, jak bieżące wartości kątów pojawiają się w dolnej części okna tuż pod faktycznym wykresem. Pamiętaj, że pozycje x, y, z pojawiają się domyślnie, ale są zastępowane dwoma kątami, gdy zaczniesz klikać + przeciąganie + obracanie obrazu.

spencerlyon2
źródło
@ spencerlon2 co jeśli chcę zmienić orientację figury przed zapisaniem?
dustin
13
Dlaczego potrzebujemy parametru DPI? Czy eps nie jest formatem wektorowym?
mkvoya
1
Dobra uwaga - DPI nie jest potrzebne do formatów wektorowych, takich jak svg, pdf, eps
spencerlyon2
Możesz pominąć, format='eps'jeśli chcesz. W tym przypadku format jest wywnioskowany z nazwy pliku.
timgeb
72

Aby dodać moje wyniki, również używając matplotlib.

.eps pogrubił cały mój tekst i usunął przezroczystość. .svg dał mi zdjęcia w wysokiej rozdzielczości, które faktycznie wyglądały jak mój wykres.

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

Użyłem 1200 dpi, ponieważ wiele czasopism naukowych wymaga obrazów w rozdzielczości 1200/600/300 dpi w zależności od tego, czego one dotyczą. Konwertuj do żądanej rozdzielczości i formatu w GiMP lub Inkscape.

EDYCJA: Oczywiście dpi nie ma znaczenia, ponieważ .svg są grafiką wektorową i mają „nieskończoną rozdzielczość”.

grofte
źródło
2
DPI ma duże znaczenie, gdy używamy go imshow(..)gdzieś na rysunku. Te mapy bitowe są rasteryzowane w dół, gdy są osadzane w pliku SVG. Przy domyślnym DPI wyniki są jeszcze gorsze niż to, co widzimy na ekranie, zdecydowanie nie nadające się do publikacji.
Evgeni Sergeev
Bardzo polecam również narzędzie Scour ( github.com/scour-project/scour ), aby zmniejszyć rozmiar pliku svg. Przy najbardziej agresywnym ustawieniu mogę zmniejszyć rozmiar mojego pliku do 50% oryginału - 5%, jeśli używam skompresowanego formatu .svgz.
grofte
8

Okay, odpowiedź spencerlyon2 działa, jednak gdyby ktoś nie wiedział, co zrobić z tą linią, musiałem to zrobić w ten sposób:

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
źródło
7

W przypadku, gdy pracujesz z działkami morskimi , zamiast matplotlib możesz zapisać obraz .png w następujący sposób:

Załóżmy, że masz matrixobiekt (pandy lub numpy) i chcesz wziąć mapę cieplną:

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

Ten kod jest zgodny z najnowszą wersją gatunku Seaaborn. Inne kody dotyczące stackoverflow działały tylko dla poprzednich wersji.

Innym sposobem, który mi się podoba, jest to. Rozmiar kolejnego obrazu ustawiam następująco:

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

A potem wykreślam wynik w konsoli, z której mogę je skopiować i wkleić, gdzie chcę. (Ponieważ poroże morskie jest zbudowane na bazie matplotlib, nie będzie problemu).

Leevo
źródło
5

Możesz zapisać do postaci 1920 × 1080 (lub 1080p) za pomocą:

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

Możesz także iść znacznie wyżej lub niżej. Powyższe rozwiązania sprawdzają się dobrze w przypadku drukowania, ale obecnie chcesz, aby utworzony obraz trafił do formatu PNG / JPG lub pojawił się w formacie szerokiego ekranu.

Eamonn Kenny
źródło