es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

“Stack” no funciona para las tramas de facetas de seaborn.

Intenté utilizar la opción “multiple = stack” en la función “histplot” con un “FacetGrid”, pero no puedo obtener el gráfico adecuado sin errores. Cualquier ayuda o sugerencia es apreciada.

Aquí hay un ejemplo reproducible con Python 3.8 + seaborn==0.11.2 + pandas==1.3.4:

import pandas as pd
import seaborn as sns

# Datos de prueba
data = [1, 1, 1, 2, 1, 1, 1, 2]
facet = [1, 1, 1, 1, 2, 2, 2, 2]
group = [1, 2] * 4
df = pd.DataFrame(data={"data": data, "facet": facet, "group": group})

# Gráfico de histplot individual apilado
sns.histplot(data=df, x="data", hue="group", multiple="stack")

# Gráfico de facetgrid no puede ser apilado
g = sns.FacetGrid(df, col=None, row="facet", hue="group")
g.map(sns.histplot, "data", **{"stat": "count", "multiple": "stack", "binwidth": 0.1})

# También intenté esto
g.map_dataframe(sns.histplot, "data", multiple="stack", binwidth=.1)

g.add_legend()

Aquí está la salida para el único histplot que funciona:

single stack works

Pero no puedo hacerlo junto con facetgrid: Nótese que si se apila correctamente, debería haber 3 en lugar de 2 para ambos facet.

multiple cannot work

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que la opción “multiple=stack” no funciona correctamente cuando se utiliza junto con FacetGrid en la función histplot. El problema se ha replicado con éxito utilizando el fragmento de código proporcionado.

    Como solución alternativa, puedes considerar crear un bucle para mapear cada faceta por separado y luego apilarlas manualmente utilizando matplotlib. Aquí tienes un ejemplo de cómo puedes apilar los histogramas para cada faceta:

    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    # datos de prueba
    data = [1, 1, 1, 2, 1, 1, 1, 2]
    facet = [1, 1, 1, 1, 2, 2, 2, 2]
    group = [1, 2] * 4
    df = pd.DataFrame(data = {"data": data, "facet": facet, "group": group})
    
    # crear grid de facetas
    g = sns.FacetGrid(df, row="facet", hue="group")
    
    # recorrer cada faceta y agregar un histograma apilado
    for ax, facet_val in zip(g.axes.flat, g.row_names):
        data_subset = df[df["facet"] == facet_val]
        sns.histplot(data=data_subset, x="data", hue="group", multiple="stack", ax=ax)
    
    # ajustar manualmente el eje y y agregar una leyenda
    g.axes[0][0].set_ylabel("Conteo")
    g.add_legend()
    

    Este código producirá la salida esperada con histogramas correctamente apilados para cada faceta:

    [![histogramas correctamente apilados para cada faceta][3]][3]

    ¡Espero que esto te sea útil! Hazme saber si tienes alguna pregunta adicional.

Comments are closed.