2014-07-02 9 views
5

Una domanda precedente affrontato utilizzando savefig() per salvare con la (colore di sfondo) stesso facecolor come viene visualizzato sullo schermo, vale a dire:Matplotlib figura facecolor alpha, mentre il risparmio (colore di sfondo, la trasparenza)

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

Matplotlib figure facecolor (background color)

(Usando savefig() ci impone di specificare nuovamente il colore di sfondo.)

posso anche specificare un alfa per la trasparenza, per esempio: How to set opacity of background colour of graph wit Matplotlib

012.351.

fig.patch.set_alpha(0.5)

non riesco a trovare un modo per rendere la figura con un facecolor trasparente Salva come appare sullo schermo. La documentazione sembra incompleta su questo: http://matplotlib.org/faq/howto_faq.html#save-transparent-figures - il salvataggio effettivo non viene mostrato. L'utilizzo di con savefig() non ha l'effetto desiderato di rendere trasparente il facecolor, ma sembra che tutto faccia eccezione alla leggenda degli assi trasparente sopra quel colore (inclusi gli sfondi del grafico).

EDIT: Alcune parti pertinenti del codice:

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') 

Potrebbe essere possibile combinare questi, ma spesso mi chiamare set_face_color() all'inizio di una rappresentazione grafica delle funzioni prima di costruire una griglia di sottotrame e poi save_and_show() verso la fine. Immagino che dovrebbe funzionare in entrambi i posti, ma preferibilmente preferisco mantenere le funzioni separate ed essere in grado di estrarre l'alfa per passare a savefig() dall'ultima fig.

EDIT 2 - vale più di mille parole

Alpha = 0.5 sulla sinistra, 1 a destra.

image of code below

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

Ho ragione nell'assumere che tu voglia una figura con uno sfondo trasparente? In ogni caso, dovresti essere in grado di impostare il facecolor usando un argomento di colore RGBA a quattro tuple, ad esempio 'facecolor = (1, 1, 1, 0)'. –

+0

Basta usare alpha per ombreggiare il colore che sto usando un bit (alpha = 0.5 per questo codice). Ho provato a usare 'colorConverter.to_rgba()' così ho potuto usare 'set_facecolor()' e saltare il 'set_alpha()', ma apparentemente 'fig.savefig (..., facecolor = fig.get_facecolor())' non restituisce la 4-tupla o ignora l'alfa. Sto impostando il facecolor altrove nel programma - codificandolo a colori con i valori dei dati, così quando sfoglio i grafici posso ordinarli rapidamente - così mentre potrei portare il valore intorno e passarlo a 'savefig' in seguito preferirei di più essere in grado di estrarlo dalla fig. – schodge

+0

Non sono sicuro, cosa stai cercando di ottenere. Potresti aggiungere un'immagine al tuo post originale? –

risposta

3

mi sono imbattuto il codice su Matplotlib 1.5 che non ha prodotto i risultati attesi per me. Per tutto ciò che accadrà su questo in futuro, fornirò due modi concisi per ottenere ciò che segue.

Una nota veloce, sicuramente non si vuole impostare transparent=True come opzione per savefig in quanto ciò sovrascriverà i facecolors come si può vedere in matplotlib.figure.savefig source.

Per risolvere effettivamente il problema, il secondo link che hai postato How to set opacity of background colour of graph wit Matplotlib risolve il problema. Il problema con il frammento di codice in questione è l'uso di fig.set_facecolor al contrario di fig.patch.set_facecolor

Fix 1:

Dalla domanda di cui sopra collegato utilizza l'argomento facecolor di savefig

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:

È anche possibile specificare savefig facecolor tramite rcParams.

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') 

Se volete che i vostri assi per avere uno sfondo queste soluzioni dovrebbe lasciare che di fondo (come prodotto da Seaborn nel commento di Erotemic) intatto. Se si vuole essere più esplicito a questo proposito aggiunge:

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

L'asse cerotto alpha trasferirà a savefig, senza sforzo supplementare.

Si noti che in entrambi i casi ho utilizzato plt.tight_layout() per eliminare inutile spazio aggiuntivo nella figura salvata. Puoi leggere di più su questo in matplotlib documentation.

+0

Grazie. A questo punto, non sono sicuro della versione di Matplotlib I in esecuzione, presumibilmente, in base alla data, 1.3.1. Buono a sapersi, questo può essere fatto funzionare come previsto ora, e grazie per la tua esauriente spiegazione. – schodge

Problemi correlati