menyimpan gambar dengan python dengan kualitas yang sangat tinggi

109

Bagaimana cara menyimpan plot python dengan kualitas sangat tinggi?

Artinya, ketika saya terus memperbesar objek yang disimpan dalam file pdf, tidak ada yang kabur?

Juga, apa mode terbaik untuk menyimpannya?

png, eps? Atau yang lainnya? Saya tidak dapat melakukannya pdfkarena ada nomor tersembunyi yang terjadi yang mengacaukan Latexmkkompilasi.

tempat sampah
sumber

Jawaban:

153

Jika Anda menggunakan matplotlibdan mencoba mendapatkan gambar yang bagus dalam dokumen lateks, simpan sebagai eps. Secara khusus, coba sesuatu seperti ini setelah menjalankan perintah untuk memplot gambar:

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

Saya telah menemukan bahwa file eps berfungsi paling baik dan dpiparameternya adalah apa yang benar-benar membuatnya terlihat bagus dalam dokumen.

MEMPERBARUI:

Untuk menentukan orientasi gambar sebelum menyimpan cukup panggil yang berikut ini sebelum plt.savefigpanggilan, tetapi setelah membuat plot (dengan asumsi Anda telah membuat plot menggunakan sumbu dengan nama ax):

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

Dimana elevation_angleadalah angka (dalam derajat) yang menentukan sudut kutub (turun dari sumbu z vertikal) dan azimuthal_anglemenentukan sudut azimut (di sekitar sumbu z).

Saya merasa paling mudah untuk menentukan nilai-nilai ini dengan terlebih dahulu memplot gambar dan kemudian memutarnya dan melihat nilai sudut saat ini muncul di bagian bawah jendela tepat di bawah plot yang sebenarnya. Perlu diingat bahwa posisi x, y, z, muncul secara default, tetapi diganti dengan dua sudut saat Anda mulai mengklik + seret + putar gambar.

spencerlyon2
sumber
@ spencerlon2 bagaimana jika saya ingin mengubah orientasi gambar sebelum menyimpan?
debu
13
Mengapa kita membutuhkan parameter DPI? Bukankah eps adalah format vektor?
mkvoya
1
Poin bagus - DPI tidak diperlukan untuk format vektor seperti svg, pdf, eps
spencerlyon2
Anda bisa menghilangkannya format='eps'jika mau. Dalam hal ini formatnya disimpulkan dari nama file.
timgeb
72

Sekadar menambahkan hasil saya, juga menggunakan matplotlib.

.eps membuat semua teks saya tebal dan menghapus transparansi. .svg memberi saya gambar beresolusi tinggi yang benar-benar tampak seperti grafik saya.

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

Saya menggunakan 1200 dpi karena banyak jurnal ilmiah membutuhkan gambar dalam 1200/600/300 dpi tergantung dari gambar apa. Ubah ke dpi dan format yang diinginkan dalam GiMP atau Inkscape.

EDIT: Jelas dpi tidak masalah karena .svg adalah grafik vektor dan memiliki "resolusi tak terbatas".

grofte
sumber
2
DPI sangat penting ketika kita menggunakan imshow(..)suatu tempat pada gambar. Bitmap ini dirasterisasi saat disematkan ke SVG. Dengan DPI default, hasilnya bahkan lebih buruk dari yang kita lihat di layar, jelas tidak cocok untuk publikasi.
Evgeni Sergeev
Saya juga sangat merekomendasikan Scour ( github.com/scour-project/scour ) untuk mengurangi ukuran file svg Anda. Pada pengaturan yang paling agresif, saya bisa mengurangi ukuran file saya menjadi 50% dari aslinya - 5% jika saya menggunakan format terkompresi .svgz.
grofte
8

Oke, saya menemukan jawaban spencerlyon2 berfungsi, namun jika ada orang yang tidak tahu apa yang harus dilakukan dengan satu baris itu, saya harus melakukannya dengan cara ini:

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
sumber
7

Dalam kasus Anda bekerja dengan Seaborn plot, bukan matplotlib, Anda dapat menyimpan gambar .png seperti ini:

Misalkan Anda memiliki matrixobjek (baik pandas atau numpy), dan Anda ingin mengambil peta panas:

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

Kode ini kompatibel dengan versi terbaru seaborn. Kode lain di sekitar stackoverflow hanya berfungsi untuk versi sebelumnya.

Cara lain yang saya suka adalah ini. Saya mengatur ukuran gambar berikutnya sebagai berikut:

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

Dan kemudian saya memplot output di konsol, dari mana saya dapat menyalin-tempel di tempat yang saya inginkan. (Karena seaborn dibangun di atas matplotlib, tidak akan ada masalah.)

Leevo
sumber
5

Anda dapat menyimpan ke gambar 1920x1080 (atau 1080p) menggunakan:

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

Anda juga bisa pergi lebih tinggi atau lebih rendah. Solusi di atas berfungsi dengan baik untuk pencetakan, tetapi saat ini Anda ingin gambar yang dibuat menjadi PNG / JPG atau muncul dalam format layar lebar.

Eamonn Kenny
sumber