¿Cómo crear diagramas condicionales de objetos de grupo utilizando matplotlib/seaborn?

Tengo datos de una Universidad donde cada entrada es un estudiante con las columnas (primer nombre, apellido, mayor, sexo, etc.)

He creado una agregación de conteos de hombres y mujeres en cada uno de los principales:

gender_counts = (only_science.groupby(['no_concentration', 'sex'], as_index=False)
         .size()
         .unstack(fill_value=0)
         .sort_values('Female', ascending=False)
        )

Producto: DataFrame

Aquí está la trama que he creado:

ax3 = gender_counts.plot(kind='bar', title='Gender Breakdown by Major')
ax3.set_xlabel("CoS Majors")
ax3.set_ylabel("Number of Applicants")
plt.show()

Producto: Majors Plot by Gender

Objetivo: Crear gráficos individuales de cada uno de los principales utilizando los datos agregados para que la escala pueda ser más significativa y no ser etiquetada por Ciencias Biológicas.

He intentado usar sns.FacetGrid() y FacetGrid.map() y también probado sns.catplot() pero no estoy seguro de qué uso para los parámetros, y conseguir una plétora de errores.

Si puedo crear un gráfico de barras para uno de los principales, entonces puedo crear un bucle para iterar sobre cuentas de género y hacer todos los gráficos de barras.

Gracias por su ayuda y me disculpo si faltan elementos de esta pregunta. Esta es mi primera pregunta de desbordamiento de pila.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por pixelprodigy50bb


3 Respuestas:

  • Puedes usar sns.catplot con sharey=False:

    import seaborn as sns
    import matplotlib.pyplot as plt
    import pandas as pd
    df = pd.DataFrame({'no_concentration': {0: 'Biological Sciences',1: 'Pre-Medicine',2: 'Biochemistry',3: 'Pre-Dentistry',4: 'Chemistry',
      5: 'Mathematics',6: 'Physics',7: 'Microbiology',8: 'Geology',9: 'Biological Sciences',10: 'Pre-Medicine',
      11: 'Biochemistry',12: 'Pre-Dentistry',13: 'Chemistry',14: 'Mathematics',15: 'Physics',16: 'Microbiology',17: 'Geology'},
     'Sex': {0: 'Female',1: 'Female',2: 'Female',3: 'Female',4: 'Female',5: 'Female',6: 'Female',7: 'Female',8: 'Female',9: 'Male',10: 
             'Male',11: 'Male',12: 'Male',13: 'Male',14: 'Male',15: 'Male', 16: 'Male',17: 'Male'},
     'value': {0: 1282,1: 1267, 2: 291, 3: 187, 4: 175, 5: 89, 6: 75, 7: 57,8: 18,9: 534,10: 445,11: 122,12: 76,13: 80,14: 76,15: 118,16: 29,17: 31}})
    sns.set_context('paper', font_scale=1.4)
    sns.catplot(data=df, x='Sex', y='value', col='no_concentration', kind='bar', 
                     col_wrap=3, palette=sns.color_palette("icefire"), sharey=False)
    plt.figure(figsize=(16, 8))
    plt.style.use('dark_background') #I use dark mode in jupyter notebook, so I need to use this line, but you can omit.
    plt.show()
    

    enter image description here

    Respondida el Dec 16, 2020 a las 17:49 - por compilerczar

    Votos positivos: 0 | Votos negativos: 0

  • Para crear gráficos individuales de cada uno de los principales utilizando los datos agregados, puedes utilizar seaborn y FacetGrid de la siguiente manera:

    • Importa la biblioteca `seaborn`
    python
    import seaborn as sns
    
    • Crea un objeto `FacetGrid` utilizando `sns.catplot()`, donde puedes especificar la columna que contiene los diferentes principales para dividir los gráficos. En este caso, sería la columna `'no_concentration'`.
    python
    g = sns.catplot(data=gender_counts.reset_index(), x='no_concentration', y='Female', kind='bar', aspect=2)
    
    • Personaliza el gráfico según tus necesidades, puedes agregar títulos, etiquetas de ejes, y otros elementos gráficos.
    python
    g.set_axis_labels("CoS Majors", "Number of Female Applicants")
    g.set_titles("Gender Breakdown by Major: {row_name}")
    
    • Por último, muestra el gráfico resultante.
    python
    plt.show()
    

    Con estos pasos, deberías poder crear gráficos individuales para cada uno de los principales utilizando los datos agregados. Asegúrate de que gender_counts tenga el formato adecuado para esta visualización.

    Respondida el Dec 17, 2020 a las 17:47 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Usando Seaborn para crear diagramas de barras condicionales para cada especialidad

    Para crear diagramas de barras condicionales para cada especialidad utilizando Seaborn, puedes utilizar el siguiente enfoque:

    python
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    

    Crea el diagrama de barras para cada especialidad

    g = sns.FacetGrid(gender_counts, col="no_concentration", col_wrap=3) g.map(sns.barplot, "sex", "value")

    Establece el título del gráfico

    g.fig.suptitle("Gender Breakdown by Major")

    Muestra el gráfico

    plt.show()

    Este código creará un conjunto de subplots, uno para cada especialidad. Cada subparcela mostrará un diagrama de barras de la cantidad de solicitantes para cada género.

    Explicación del código:

    La función sns.FacetGrid() crea un conjunto de subplots basados en los valores de una columna específica. En este caso, la columna no_concentration se utiliza para crear un subconjunto para cada especialidad. El método col_wrap=3 especifica que cada fila de subparcelas contendrá 3 subparcelas. El método map() se utiliza para aplicar la función sns.barplot() a cada subparcela. La función sns.barplot() crea un diagrama de barras de los datos especificados en los parámetros x e y. El método fig.suptitle() se utiliza para establecer el título del gráfico general.

    Creación de un bucle para iterar sobre todas las especialidades

    Para crear un bucle para iterar sobre todas las especialidades y crear un diagrama de barras para cada una, puedes utilizar el siguiente código:

    python
    for major in gender_counts["no_concentration"].unique():
        sns.barplot(x="sex", y="value", data=gender_counts[gender_counts["no_concentration"] == major])
        plt.title(f"Gender Breakdown for {major}")
        plt.show()
    

    Este código iterará sobre cada valor único en la columna no_concentration y creará un diagrama de barras para cada especialidad.

    Explicación del código:

    La función unique() se utiliza para obtener una lista de todos los valores únicos en la columna no_concentration. El bucle for itera sobre cada valor único. El código dentro del bucle crea un diagrama de barras para la especialidad actual utilizando los datos filtrados por la columna no_concentration. El método plt.title() se utiliza para establecer el título del diagrama de barras actual.

    Respondida el Dec 17, 2020 a las 17:54 - por Gemini

    Votos positivos: 0 | Votos negativos: 0