2015-04-15 5 views
8

Utilizzando Seaborn, posso creare grafici a scatole di più colonne di uno pandas DataFrame sulla stessa figura. Vorrei applicare uno stile personalizzato ai volantini (valori anomali), ad es. impostazione del simbolo del marker, del colore e della dimensione del marker.L'impostazione dello stile del flier (in precedenza) in Seaborn boxplot viene ignorata

The API documentation on seaborn.boxplot, tuttavia, fornisce solo un argomento fliersize che mi consente di controllare la dimensione dei volantini ma non il colore e il simbolo.

Dal Seaborn utilizza matplotlib per la stampa, ho pensato che avrei potuto fornire un dizionario matplotlib styling per la funzione boxplot in questo modo:

import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 

# create a dataframe 
df = pd.DataFrame({'column_a': [3, 6, 200, 100, 7], 'column_b': [1, 8, 4, 150, 290], 'column_c': [6, 7, 20, 80, 275]}) 

# set figure size 
sns.set(rc={"figure.figsize": (14, 6)}) 

# define outlier properties 
flierprops = dict(marker='o', markersize=5) 

# create boxplot 
ax = sns.boxplot(df, vert=False, showmeans=True, flierprops=flierprops) 
plt.show() 

Risultato:

Boxplot Secondo il dizionario fornito, vorrei aspettarsi un grande cerchio rosso che rappresenta il volantino di column_c ma, invece, le impostazioni standard sono ancora utilizzate.

This thread describes a similar problem quando matplotlib viene utilizzato direttamente, tuttavia, dalla discussione ho indovinato che questo dovrebbe essere risolto nel frattempo quando si utilizzano versioni recenti di matplotlib.

Ho provato questo con un notebook iPython (iPython 3.10), Matplotlib 1.4.3 e Seaborn 0.5.1.

risposta

5

Il codice boxplot di Seaborn ignora l'argomento flierprops e lo sovrascrive con il proprio prima di passare argomenti a Matplotlib. Il boxplot di Matplotlib restituisce anche tutti gli oggetti del flier come parte del suo valore di ritorno, quindi è possibile modificarlo dopo aver eseguito il boxplot, ma Seaborn non lo restituisce.

La sovrascrittura di flierprops (e sym) sembra un bug, quindi vedrò se riesco a risolverlo: vedere this issue. Nel frattempo, potresti prendere in considerazione l'utilizzo del boxplot di matplotlib. Guardare il codice di Seaborn può essere utile (boxplot è in distributions.py).


Aggiornamento: ora c'è una richiesta di pull che risolve questo (e altri flierprops*props, ma non sym)

+3

Vogliono solo notare che, mentre 'sns.boxplot' sarà ancora ignorare il parametro' sym', il codice nella tua domanda dovrebbe ora funzionare pienamente incluso l'impostazione del marcatore giusto per i volantini. – mwaskom

+0

Sì, dopo l'aggiornamento al master Seaborn più recente con 'pip install git + git: // github.com/mwaskom/seaborn.git # egg = seaborn', funziona come indicato nella mia domanda sopra. Grazie mille ragazzi! – Dirk