2014-05-07 29 views
11

Dataframes in Pandas hanno un metodo boxplot, ma c'è un modo per creare dot-boxplot in panda, o in altro modo con seaborn?Dot-boxplot da DataFrames

Con dot-boxplot, intendo un diagramma a scatola che mostra i punti dati attuali (o di un campione significativo di essi) all'interno della trama, ad esempio come nell'esempio qui sotto (ottenuto in R).

enter image description here

+0

È questo ciò che stai cercando http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.DataFrame.boxplot. html –

+0

Grazie a @pss ne sono consapevole. La mia domanda riguarda specificamente i dot boxplot. Mi chiedo se c'è un modo semplice per aggiungere i punti più tardi (nota la randomizzazione dei punti lungo l'asse 'x 'per renderli facilmente visibili) –

+0

Usa la trama personalizzata da' matplotlib', alimentala a pandas.boxplot as un argomento 'axe ', quindi creare un diagramma a punti nella stessa trama. –

risposta

12

Per una risposta più precisa relativi alla domanda di OP (con i panda):

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

data = pd.DataFrame({ "A":np.random.normal(0.8,0.2,20), 
         "B":np.random.normal(0.8,0.1,20), 
         "C":np.random.normal(0.9,0.1,20)}) 

data.boxplot() 

for i,d in enumerate(data): 
    y = data[d] 
    x = np.random.normal(i+1, 0.04, len(y)) 
    plt.plot(x, y, mfc = ["orange","blue","yellow"][i], mec='k', ms=7, marker="o", linestyle="None") 

plt.hlines(1,0,4,linestyle="--") 

boxplot


vecchia versione (più generico):

Con matplotlib:

import numpy as np 
import matplotlib.pyplot as plt 

a = np.random.normal(0,2,1000) 
b = np.random.normal(-2,7,100) 
data = [a,b] 

plt.boxplot(data) # Or you can use the boxplot from Pandas 

for i in [1,2]: 
    y = data[i-1] 
    x = np.random.normal(i, 0.02, len(y)) 
    plt.plot(x, y, 'r.', alpha=0.2) 

che dà che: dot-boxplot

ispirato this tutorial

Spero che questo aiuti!

12

Questo sarà possibile con Seaborn versione 0.6 (attualmente nel ramo principale su github) utilizzando la funzione stripplot. Ecco un esempio:

import seaborn as sns 
tips = sns.load_dataset("tips") 
sns.boxplot(x="day", y="total_bill", data=tips) 
sns.stripplot(x="day", y="total_bill", data=tips, 
       size=4, jitter=True, edgecolor="gray") 

enter image description here