Trazando barras de errores desde el dataframe usando Seaborn FacetGrid

Quiero trazar barras de error de una columna en un dataframe de pandas en un Seaborn FacetGrid

import matplotlib.pyplot as plt import pandas as pd import seaborn as sns df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar']*2, 'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C' : np.random.randn(8), 'D' : np.random.randn(8)}) df 

Ejemplo de dataframe

  ABCD 0 foo one 0.445827 -0.311863 1 bar one 0.862154 -0.229065 2 foo two 0.290981 -0.835301 3 bar three 0.995732 0.356807 4 foo two 0.029311 0.631812 5 bar two 0.023164 -0.468248 6 foo one -1.568248 2.508461 7 bar three -0.407807 0.319404 

Este código funciona para barras de error de tamaño fijo:

 g = sns.FacetGrid(df, col="A", hue="B", size =5) g.map(plt.errorbar, "C", "D",yerr=0.5, fmt='o'); 

introduzca la descripción de la imagen aquí

Pero no puedo hacer que funcione con valores del dataframe

 df['E'] = abs(df['D']*0.5) g = sns.FacetGrid(df, col="A", hue="B", size =5) g.map(plt.errorbar, "C", "D", yerr=df['E']); 

o

 g = sns.FacetGrid(df, col="A", hue="B", size =5) g.map(plt.errorbar, "C", "D", yerr='E'); 

Ambos producen reglas de errores.

EDITAR:

Después de un montón de lectura de documentos de matplotlib, y respuestas variadas de stackoverflow, aquí hay una solución de matplotlib pura

 #define a color palette index based on column 'B' df['cind'] = pd.Categorical(df['B']).labels #how many categories in column 'A' cats = df['A'].unique() cats.sort() #get the seaborn colour palette and convert to array cp = sns.color_palette() cpa = np.array(cp) #draw a subplot for each category in column "A" fig, axs = plt.subplots(nrows=1, ncols=len(cats), sharey=True) for i,ax in enumerate(axs): df_sub = df[df['A'] == cats[i]] col = cpa[df_sub['cind']] ax.scatter(df_sub['C'], df_sub['D'], c=col) eb = ax.errorbar(df_sub['C'], df_sub['D'], yerr=df_sub['E'], fmt=None) a, (b, c), (d,) = eb.lines d.set_color(col) 

Aparte de las tags, y el eje limita su OK. Se trazó un gráfico secundario separado para cada categoría en la columna ‘A’, coloreado por la categoría en la columna ‘B’. (Note que los datos aleatorios son diferentes a los de arriba)

¿Todavía me gustaría una solución de pandas / de nacimiento si alguien tiene alguna idea?

introduzca la descripción de la imagen aquí

Cuando se utiliza FacetGrid.map , todo lo que se refiera al DataFrame de data debe pasarse como un argumento posicional. Esto funcionará en su caso porque yerr es el tercer argumento posicional para plt.errorbar , aunque para demostrar que voy a usar el conjunto de datos de consejos:

 from scipy import stats tips_all = sns.load_dataset("tips") tips_grouped = tips_all.groupby(["smoker", "size"]) tips = tips_grouped.mean() tips["CI"] = tips_grouped.total_bill.apply(stats.sem) * 1.96 tips.reset_index(inplace=True) 

Entonces puedo trazar usando FacetGrid y la errorbar :

 g = sns.FacetGrid(tips, col="smoker", size=5) g.map(plt.errorbar, "size", "total_bill", "CI", marker="o") 

introduzca la descripción de la imagen aquí

Sin embargo, tenga en cuenta que existen funciones de trazado marinas para pasar de un conjunto de datos completo a diagtwigs con barras de error (utilizando bootstrapping), por lo que para muchas aplicaciones esto puede no ser necesario. Por ejemplo, podrías usar factorplot :

 sns.factorplot("size", "total_bill", col="smoker", data=tips_all, kind="point") 

introduzca la descripción de la imagen aquí

O lmplot :

 sns.lmplot("size", "total_bill", col="smoker", data=tips_all, fit_reg=False, x_estimator=np.mean) 

introduzca la descripción de la imagen aquí

No está mostrando qué es en realidad df['E'] , y si es una lista de la misma longitud que df['C'] y df['D'] .

El argumento de la palabra clave yerr (kwarg) toma un solo valor que se aplicará a cada elemento de las listas para las claves C y D del dataframe, o necesita una lista de valores de la misma longitud que esas listas.

Por lo tanto, C, D y E deben asociarse con listas de la misma longitud, o C y D deben ser listas de la misma longitud y E debe asociarse con un solo float o int . Si ese único float o int está dentro de una lista, debe extraerlo, como df['E'][0] .

Ejemplo de código yerr con yerr : http://matplotlib.org/1.2.1/examples/pylab_examples/errorbar_demo.html

Barra de documentación de la API que describe yerr : http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar