görüntüleri python'da çok yüksek kalitede kaydetmek


109

Python grafiklerini çok yüksek kalitede nasıl kaydedebilirim?

Yani, bir pdf dosyasına kaydedilmiş nesneyi yakınlaştırmaya devam ettiğimde, bulanıklaşma olmaz mı?

Ayrıca, onu kaydetmek için en iyi mod ne olurdu?

png, eps? Veya bir başkası? Yapamam pdfçünkü Latexmkderlemeyle karışan gizli bir numara var .

Yanıtlar:


153

matplotlibLateks bir belgede iyi rakamlar kullanıyor ve elde etmeye çalışıyorsanız, eps olarak kaydedin. Özellikle, görüntüyü çizmek için komutları çalıştırdıktan sonra şuna benzer bir şey deneyin:

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

Eps dosyalarının en iyi şekilde çalıştığını buldum ve dpiparametre onları bir belgede gerçekten iyi görünmesini sağlayan şeydir.

GÜNCELLEME:

Şeklin yönünü kaydetmeden önce belirtmek için, plt.savefigaramadan önce , ancak grafiği oluşturduktan sonra (adı taşıyan bir eksen kullanarak çizim yaptığınızı varsayarak) basitçe aşağıdakileri çağırın ax:

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

Burada elevation_angleolduğu (derece cinsinden), bir numara (dikey z ekseni aşağı) kutup açısı belirlenmesi ve azimuthal_anglebelirtir (z ekseni çevresinde) azimut açısı.

Bu değerleri, önce görüntüyü çizip sonra döndürerek ve pencerenin altına doğru gerçek arsanın hemen altındaki açıların mevcut değerlerinin göründüğünü izleyerek belirlemenin en kolay olduğunu buluyorum. Varsayılan olarak x, y, z konumlarının göründüğünü, ancak görüntüyü tıklatmaya + sürüklemeye + döndürmeye başladığınızda iki açıyla değiştirildiğini unutmayın.


@ spencerlon2 kaydetmeden önce şeklin yönünü değiştirmek istersem ne olur?
dustin

13
DPI parametresine neden ihtiyacımız var? Eps bir vektör biçimi değil mi?
mkvoya

1
İyi bir nokta - svg, pdf, eps gibi vektör formatları için DPI gerekli değildir
spencerlyon2

İstersen atlayabilirsin format='eps'. Bu durumda format, dosya adından çıkarılır.
timgeb

72

Sadece sonuçlarımı eklemek için, matplotlib'i de kullanarak.

.eps tüm metnimi kalınlaştırdı ve şeffaflığı kaldırdı. .svg bana grafiğime benzeyen yüksek çözünürlüklü resimler verdi.

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

1200 dpi kullandım çünkü birçok bilimsel dergi, görüntünün ne olduğuna bağlı olarak 1200/600/300 dpi görüntü gerektirir. GiMP veya Inkscape'de istenen dpi ve formata dönüştürün.

DÜZENLEME: Açıkçası dpi'nin önemi yok çünkü .svg vektör grafikleri ve "sonsuz çözünürlüğe" sahip.


2
DPI imshow(..), şeklin herhangi bir yerinde kullandığımızda çok önemlidir . Bu bit eşlemler, SVG'ye gömüldükçe küçültülür. Varsayılan DPI ile sonuçlar, ekranda gördüğümüzden daha da kötüdür ve kesinlikle yayınlar için uygun değildir.
Evgeni Sergeev

Ayrıca svg'nizin dosya boyutunu küçültmek için Scour'u ( github.com/scour-project/scour ) tavsiye ederim . En agresif ayarda dosya boyutumu orijinalin% 50'sine, sıkıştırılmış .svgz biçimini kullanırsam% 5'e indirebilirim.
grofte

8

Tamam, spencerlyon2'nin cevabını işe yaradığını buldum, ancak herhangi biri kendini bu satırla ne yapacağını bilmediğini fark ederse, bunu şu şekilde yapmalıydım:

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)

7

Matplotlib yerine deniz kenarı arazileriyle çalışıyorsanız, aşağıdaki gibi bir .png görüntüsünü kaydedebilirsiniz:

Farz edelim ki bir matrixnesneniz (pandalar veya uyuşuklar) var ve bir ısı haritası almak istiyorsunuz:

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

Bu kod, seaborn'un en son sürümüyle uyumludur. Stackoverflow etrafındaki diğer kodlar yalnızca önceki sürümler için çalışıyordu.

Sevdiğim başka bir yol da bu. Sonraki görüntünün boyutunu şu şekilde ayarlıyorum:

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

Ve daha sonra, çıktıyı istediğim yere kopyalayıp yapıştırabileceğim konsolda çiziyorum. (Seaborn, matplotlib üzerine kurulduğu için herhangi bir sorun olmayacaktır.)


5

Aşağıdakileri kullanarak 1920x1080 (veya 1080p) olan bir rakama kaydedebilirsiniz:

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

Ayrıca çok daha yükseğe veya aşağıya gidebilirsiniz. Yukarıdaki çözümler yazdırma için iyi sonuç verir, ancak bu günlerde oluşturulan görüntünün PNG / JPG'ye gitmesini veya geniş ekran biçiminde görünmesini istiyorsunuz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.