¿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
consharey=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()
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
yFacetGrid
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 columnano_concentration
se utiliza para crear un subconjunto para cada especialidad. El métodocol_wrap=3
especifica que cada fila de subparcelas contendrá 3 subparcelas. El métodomap()
se utiliza para aplicar la funciónsns.barplot()
a cada subparcela. La funciónsns.barplot()
crea un diagrama de barras de los datos especificados en los parámetrosx
ey
. El métodofig.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 columnano_concentration
. El buclefor
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 columnano_concentration
. El métodoplt.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