Matplotlib Plot Kehilangan Transparansi Saat Menyimpan .ps/.eps

I'm mengalami masalah dengan mencoba untuk menyimpan beberapa plot dengan transparan ellipsoids pada mereka jika saya mencoba untuk menyelamatkan mereka dengan .ps/.eps ekstensi.

Berikut ini's plot disimpan sebagai .png:

Jika aku memilih untuk menyimpannya sebagai .ps/.eps berikut adalah apa yang tampak seperti:

Bagaimana saya mendapatkan sekitar ini, adalah untuk menggunakan ImageMagick untuk mengkonversi asli png ke ps. Satu-satunya masalah adalah bahwa gambar dalam format png adalah sekitar 90k, dan itu menjadi hanya di bawah 4M setelah konversi. Ini tidak baik karena saya memiliki banyak gambar-gambar ini, dan itu akan mengambil terlalu banyak waktu untuk mengkompilasi saya dokumen latex. Apakah ada yang punya solusi untuk hal ini?

Mengomentari pertanyaan (1)
Larutan

Masalahnya adalah bahwa eps tidak mendukung transparansi native.

Ada beberapa pilihan:

  1. rasterize gambar dan cantumkan dalam file eps (seperti @Molly menunjukkan) atau mengekspor ke pdf dan mengkonversi dengan beberapa alat eksternal (seperti gs) (yang biasanya bergantung juga pada rasterization)

  2. 'meniru' transparansi, memberikan warna yang terlihat seperti transparan pada latar belakang.

Saya membahas ini untuk yakin sekali pada matplotlib mailing list, dan saya punya saran untuk rasterize, yang tidak layak seperti yang anda dapatkan baik pixellized atau tokoh besar. Dan mereka don't skala sangat baik ketika dimasukkan ke dalam, misalnya, sebuah publikasi.

Saya pribadi menggunakan pendekatan kedua, dan meskipun tidak ideal, saya menemukan itu cukup baik. Saya menulis kecil python script yang mengimplementasikan algoritma dari ini JADI post untuk memperoleh solid RGB representasi dari warna dengan memberikan transparansi

EDIT

Dalam kasus tertentu plot anda mencoba untuk menggunakan zorder kata kunci untuk memesan bagian-bagian yang diplot. Cobalah untuk menggunakan zorder=10 untuk biru elips, zorder=11 untuk hijau dan zorder=12 untuk hexbins.

Cara ini biru harus di bawah segala sesuatu, kemudian hijau elips dan akhirnya hexbins. Dan plot harus dibaca juga dengan warna solid. Dan jika anda suka nuansa warna biru dan hijau yang anda miliki dalam png, anda dapat mencoba untuk bermain dengan mimic_alpha.py.

EDIT 2

Jika anda 100% yakin bahwa anda memiliki untuk menggunakan eps, ada beberapa penyelesaian yang datang ke pikiran saya (dan yang pasti lebih jelek dari anda plot):

  1. Hanya menggambar elips perbatasan di atas hexbins.
  2. Dapatkan centre dan amplitudo dari masing-masing segi enam, (mungkin membuang semua nol sampah) dan membuat scatter plot menggunakan warna yang sama dalam hexbin dan menyesuaikan penanda ukuran dan bentuk seperti yang anda inginkan. Anda mungkin ingin untuk redraw elips perbatasan di atas itu
Komentar (5)

Alternatif lain akan menyimpannya ke pdf

savefig('myfigure.pdf')

Yang bekerja dengan pdflatex, jika itu adalah alasan mengapa anda harus menggunakan eps dan svg.

Komentar (1)

Aku punya masalah yang sama. Untuk menghindari rasterizing, anda bisa menyimpan gambar sebagai pdf dan kemudian jalankan (pada unixish sistem setidaknya) di terminal:

pdftops -eps saya.pdf saya.eps

Yang memberikan .eps file sebagai output.

Komentar (0)

Anda dapat rasterize angka sebelum menyimpannya untuk menjaga transparansi dalam file eps:

ax.set_rasterized(True)
plt.savefig('rasterized_fig.eps')
Komentar (3)

Aku memecahkan ini dengan:

  1. menambahkan set_rasterization_zorder(1) ketika menentukan angka area:
fxsize=16
fysize=8
f = figure(num=None, figsize=(fxsize, fysize), dpi=180, facecolor='w',
edgecolor='k')
plt.subplots_adjust(
left    = (18/25.4)/fxsize, 
bottom  = (13/25.4)/fysize, 
right   = 1 - (8/25.4)/fxsize, 
top     = 1 - (8/25.4)/fysize)
subplots_adjust(hspace=0,wspace=0.1)
#f.suptitle('An overall title', size=20)
gs0 = gridspec.GridSpec(1, 2)

gs11 = gridspec.GridSpecFromSubplotSpec(1, 1, subplot_spec=gs0[0])

ax110 = plt.Subplot(f, gs11[0,0])
f.add_subplot(ax110)

ax110.set_rasterization_zorder(1)
  1. zorder=0 di setiap alpha=anynumber di plot:
ax110.scatter(xs1,ys1  , marker='o', color='gray'  , s=1.5,zorder=0,alpha=0.3)#, label=label_bg)

dan 3) akhirnya raster=True ketika menyimpan:

P.savefig(str(PLOTFILENAME)+'.eps', rasterized=True)

Catatan bahwa ini mungkin tidak bekerja seperti yang diharapkan dengan transparan kata kunci savefig karena RGBA warna dengan alpha<1 pada latar belakang transparan akan diberikan sama seperti RGB warna dengan alpha=1.

Komentar (0)

Seperti disebutkan di atas, yang terbaik dan termudah pilihan (jika anda tidak ingin kehilangan resolusi) adalah untuk raster gambar

f = plt.figure()
f.set_rasterized(True)

ax = f.add_subplot(111)

ax.set_rasterized(True)
f.savefig('figure_name.eps',rasterized=True,dpi=300)

Dengan cara ini, anda dapat mengatur ukuran dpi pilihan juga. Bahkan, anda juga dapat bermain dengan zorder di bawah ini yang anda inginkan untuk menerapkan rasterization:

ax.set_rasterization_zorder(0)

Catatan: Hal ini penting untuk menjaga f.set_rasterized(True) ketika anda menggunakan plt.subplot dan plt.subplot2grid fungsi. Jika tidak, label dan centang daerah tidak akan muncul di .eps file

Komentar (0)

Solusi saya adalah untuk ekspor plot sebagai .eps, beban itu dengan Inkscape misalnya, kemudian Ungroup plot, pilih objek yang ingin saya mengatur transparansi dan hanya mengedit Opacity Isi "Fill dan Stroke" tab.

Anda bisa menyimpan file seperti .svg jika anda ingin men-tweak itu nanti, atau mengekspor gambar untuk publikasi.

Komentar (0)