2015-07-02 11 views
9

Ho cercato una risposta chiara a questo e non sono stato in grado di trovarne uno, mi scuso se questo è stato chiesto in precedenza. Sto usando Seaborn 0.6 con Matplotlib 1.4.3. Mi piacerebbe cambiare temporaneamente gli stili delle trame mentre sto creando molte figure in un notebook ipython.Utilizzo con sns.set nei grafici di nidificazione del mare

In particolare, in questo esempio, vorrei modificare sia la dimensione del carattere che lo stile di sfondo su base per-plot.

Questo crea la trama sto cercando, ma definisce i parametri a livello mondiale:

import seaborn as sns 
import numpy as np 

x = np.random.normal(size=100) 

sns.set(style="whitegrid", font_scale=1.5) 
sns.kdeplot(x, shade=True); 

tuttavia questo viene a mancare:

with sns.set(style="whitegrid", font_scale=1.5): 
    sns.kdeplot(x, shade=True); 

con:

--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-10-70c5b03f9aa8> in <module>() 
----> 1 with sns.set(style="whitegrid", font_scale=1.5): 
     2  sns.kdeplot(x, shade=True); 

AttributeError: __exit__ 

Ho anche provato:

with sns.axes_style(style="whitegrid", rc={'font.size':10}): 
    sns.kdeplot(x, shade=True); 

Che non fallisce, tuttavia non cambia anche la dimensione del carattere. Qualsiasi aiuto sarebbe molto apprezzato.

+0

Non c'è nulla in Seaborn per farlo, ma potresti combinare i Dit dei parametri da 'axes_style' e' plotting_context' e poi passarli a 'plt.rc_context'. – mwaskom

+0

L'istruzione with utilizza i metodi magici Python _ \ _ immettere _ \ _ e _ \ _ exit _ \ _. Quei metodi sono chiamati da qualunque sns.set sta tornando. Deve avere un metodo _ \ _ enter _ \ _, ma non un metodo _ \ _ exit _ \ _. Penso che potresti voler usare un contesto di trama. http://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.plotting_context.html#seaborn.plotting_context – HashSplat

+0

'set' non restituisce nulla; il codice relativo è qui: https://github.com/mwaskom/seaborn/blob/master/seaborn/rcmod.py#L69 – mwaskom

risposta

7

La cosa migliore da fare sarebbe quella di combinare i parametri di stile Seaborn e di contesto in un dizionario e poi passarlo alla funzione plt.rc_context:

import numpy as np 
import seaborn as sns 
import matplotlib.pyplot as plt 
x = np.random.normal(size=100) 
with plt.rc_context(dict(sns.axes_style("whitegrid"), 
         **sns.plotting_context("notebook", font_scale=1.5))): 
    sns.kdeplot(x, shade=True) 
+0

Grazie, questo è quello che stavo cercando! Mi mancava l'argomento "notebook" nel codice che ho collegato sopra, ed è per questo che non sembra funzionare. – johnchase

+0

Stavo solo giocando con altri modi per combinare dizionari e trovato [collections.ChainMap] (https://docs.python.org/3/library/collections.html#chainmap-objects) ... mentre richiede un'importazione, 'con plt.rc_context (ChainMap (sns.axes_style ('whitegrid'), sns.plotting_context ('notebook', font_scale = 1.5))):'. È anche Python 3.3+ solo secondo i documenti. Nella versione 2.7 preferirei la tua soluzione stdlib sopra una libreria di terze parti per qualcosa di così semplice. – flutefreak7

3

Questo è quello che sto usando, sfruttando la gestione del contesto fornito da matplotlib:

import matplotlib 

class Stylish(matplotlib.rc_context): 
    def __init__(self, **kwargs): 
     matplotlib.rc_context.__init__(self) 
     sns.set(**kwargs) 

E poi, per esempio:

with Stylish(font_scale=2): 
    sns.kdeplot(x, shade=True) 
+0

Bene, avevo letto l'altra risposta ma non i commenti sopra ... questo in realtà non è niente di particolarmente nuovo, solo copiabottabile. –

+0

https: // github.com/mwaskom/seaborn/pull/932 ... –

Problemi correlati