2014-07-02 6 views
5

bir önceki soruya kaydedilirken:Matplotlib rakam ekranında görüntülenen şekilde yani (arka plan rengini, şeffaflık) aynı facecolor (arka plan rengi) ile kaydetmek için <code>savefig()</code> kullanılarak ele

fig = plt.figure() 
fig.patch.set_facecolor('blue') 
fig.savefig('foo.png', facecolor=fig.get_facecolor()) 

Matplotlib figure facecolor (background color)

(savefig() kullanma arka plan rengini respecify etmemizi gerektirir.)

Ben de mesela, şeffaflık alfa belirtebilirsiniz: How to set opacity of background colour of graph wit Matplotlib

fig.patch.set_alpha(0.5)

Ben ekranda gösterilir olarak kaydetme şeffaf facecolor ile çıkarmalarıiçin için bir yol bulmak mümkün değil. Belgeler şu şekilde eksik görünüyor: http://matplotlib.org/faq/howto_faq.html#save-transparent-figures - gerçek kaydetme gösterilmiyor. transparent=True'u savefig() ile kullanmak, yüz rengini saydamlaştırmak için istenen bir etki yapmaz; bunun yerine, bu rengin üstündeki (grafik arka planı dahil) eksenler efsanesi hariç her şeyi yapar gibi görünür.

DÜZENLEME: kodun bazıları, ilgili ekstreler:

def set_face_color(fig, facecolor): 
    if facecolor is False: 
     # Not all graphs get color-coding 
     facecolor = fig.get_facecolor() 
     alpha = 1 
    else: 
     alpha = 0.5 
    color_with_alpha = colorConverter.to_rgba(
     facecolor, alpha) 
    fig.patch.set_facecolor(color_with_alpha) 

def save_and_show(plt, fig, save, disp_on, save_as): 
    if save: 
     plt.savefig(save_as, dpi=dpi_file, facecolor=fig.get_facecolor(), 
        edgecolor='none') 
    if disp_on is True: 
     figManager = plt.get_current_fig_manager() 
     figManager.window.showMaximized() 
     plt.show() 
    else: 
     plt.close('all') 

birleştirmek mümkün olabilir, ama ben bir subplots ızgara ve daha sonra save_and_show() kurmak önce sık sık bir grafik işlevi başında set_face_color() çağrı sona doğru. Sanırım her iki yerde de çalışmalı, ama en iyisi, fonksiyonları ayrı tutmayı ve alfadan son incirden savefig()'a geçmeyi tercih ederim.

DÜZENLEME 2 - bin kelime sağda

solda

Alfa = 0.5, 1 değerinde.

t = [1, 2, 3, 4, 5] 
fig = plt.figure() 
fig.patch.set_alpha(0.5) 
fig.set_facecolor('b') 
plt.plot(t, t) 
fig2 = plt.figure() 
fig2.set_facecolor('b') 
plt.plot(t,t) 
+0

Saydam bir arka plana sahip bir şekil istediğinizi varsaymak için haklı mıyım? Her neyse, yüz rengini 4-tuple RGBA renk argümanını kullanarak ayarlayabilmelisiniz, yani 'facecolor = (1, 1, 1, 0) '. –

+0

Sadece rengi kullanmak için alfa kullanıyorum biraz kullanıyorum (bu kod için alpha = 0,5). 'ColorConverter.to_rgba() 'yi kullanmayı denedim, bu yüzden' set_facecolor()' ı kullanabiliyordum ve 'set_alpha()' yi atlayabiliyordum ama görünüşe göre 'fig.savefig (..., facecolor = fig.get_facecolor())' 4-tuple döndürmez veya alfa yok sayar. Programda başka bir yerde yüz rengini ayarlıyorum - renk kodlamasını veri değerlerine göre kodluyorum, böylelikle plotları ters çevirdiğimde onları hızlı bir şekilde sıralayabilirim - böylece değeri taşıyabilir ve daha sonra "savefig" e gönderebilirim. incirden ayıklamak. – schodge

+0

Emin değilim, elde etmeye çalıştığınız şey. Orijinal yayınınıza bir resim ekleyebilir misiniz? –

cevap

3

image of code below

Ben Matplotlib 1.5 kodunuzu koştum ve benim için beklenen çıkışı üretilen bulundu. Gelecekte bunun gerçekleşmesi için her şeyden önce aşağıdakileri gerçekleştirmenin iki özlü yolu sunuyorum.

Hızlı bir not olarak, matplotlib.figure.savefig source'da görebileceğiniz gibi yüz renklerini geçersiz kılacağından, kaydetme seçeneği için kesinlikle transparent=True seçeneğini ayarlamak istemezsiniz.

Sorununuzu gerçekten çözmek için, How to set opacity of background colour of graph wit Matplotlib'u gönderdiğiniz ikinci bağlantı aslında sorunu çözmektedir.

import matplotlib.pyplot as plt 

fig = plt.figure() 
fig.patch.set_facecolor('b') # instead of fig.patch.set_facecolor 
fig.patch.set_alpha(0.5) 

plt.plot([1,3], [1,3]) 
plt.tight_layout() 
plt.show() 
plt.savefig('method1.png', facecolor=fig.get_facecolor()) 

Fix 2 savefig için facecolor argümanı kullanmak Yukarıda bağlantılı soruya itibaren

: Söz konusu kod parçası ile sorun fig.patch.set_facecolor

Fix 1 aksine fig.set_facecolor kullanılmasıdır:

Ayrıca, savefig yüz rengini rcParams üzerinden de belirleyebilirsiniz.Eğer eksenleri istiyorum Eğer

import matplotlib.pyplot as plt 
import matplotlib as mpl 

fig = plt.figure() 

col = 'blue' 
#specify color of plot when showing in program. 
#fig.set_facecolor(col) also works 
fig.patch.set_facecolor(col) 
#specify color of background in saved figure 
mpl.rcParams['savefig.facecolor'] = col 

#set the alpha for both plot in program and saved image 
fig.patch.set_alpha(0.5) 
plt.plot([1,3], [1,3]) 
plt.tight_layout() 
plt.show() 
plt.savefig('method2.png') 

bu çözüm (örneğin Erotemic en yorumunda Seaborn tarafından üretilen gibi) bozulmamış o arka plan bırakmalısınız bir arka plan var. Eğer eklemek hakkında daha açık olmasını istiyorsanız:

ax.patch.set_color('palegoldenrod') # or whatever color you like 
ax.patch.set_alpha(.7) 

eksen yama alfa ekstra çaba olmadan savefig aktarılacak.

Her iki durumda da kaydedilen şekilde gereksiz yere fazla alan kalmaması için plt.tight_layout() kullanıldığını unutmayın. Daha fazla bilgiyi matplotlib documentation'da okuyabilirsiniz.

+0

Teşekkür ederim. Bu noktada, Matplotlib I'in hangi sürümünün yayınlandığından emin değilim - muhtemelen, tarihe göre, 1.3.1. Bunu bilmek güzel, şimdi beklediğiniz gibi çalışabilir ve kapsamlı bir açıklama için teşekkürler. – schodge

İlgili konular