Encontré una joya escondida en la biblioteca Matplotlib: diagramas de burbujas envueltos en Python | de Anna Gordún Peiró | julio 2024

Encontré una joya escondida en la biblioteca Matplotlib: diagramas de burbujas envueltos en Python |  de Anna Gordún Peiró |  julio 2024

Para mi gráfico, estoy usando un conjunto de datos olímpicos históricos de Olympia.org que Joseph Cheng compartió en Kaggle con licencia de dominio público.

Captura de pantalla del conjunto de datos

Contiene resultados de los Juegos Olímpicos a nivel de atletas desde Atenas 1896 hasta Beijing 2022. Después del análisis de datos exploratorios (EDA), lo transformé en un conjunto de datos que detalla la cantidad de atletas femeninas en cada deporte/prueba por año. Mi idea para un gráfico de burbujas es mostrar qué deportes tienen una proporción de 50/50 de atletas femeninos y masculinos y cómo eso ha cambiado con el tiempo.

Mis datos de seguimiento se componen de dos conjuntos de datos diferentes, uno para cada año: 2020 Y 1996Para cada conjunto de datos, calculé la suma total de atletas que participaron en cada evento. (atleta_suma) y cuanto representa esta suma en relación al total de deportistas (hombres + mujeres) (diferencia). Vea una captura de pantalla de los datos a continuación:

Captura de pantalla del trazado del conjunto de datos

Aquí está mi enfoque para visualizarlo:

  • Proporción de tamaño. Utilice el radio de la burbuja para comparar la cantidad de atletas por deporte. Las burbujas más grandes representarán eventos altamente competitivos, como el atletismo.
  • Interpretación multivariable. Uso de colores para representar la representación femenina. Las burbujas de color verde claro representarán eventos con una división 50/50, como el hockey.

Este es mi punto de partida (usando el código y el enfoque anteriores):

Primer resultado

Algunas soluciones sencillas: aumentar el tamaño de las figuras y cambiar las etiquetas a vacías si el tamaño no es mayor a 250 para evitar que queden palabras fuera de las burbujas.

fig, ax = plt.subplots(figsize=(12,8),subplot_kw=dict(aspect="equal"))

#Labels edited directly in dataset

Segundo resultado

Bueno, ahora al menos es legible. Pero ¿por qué es esto? Atletismo rosa Y Boxeo azul? Agreguemos un título para ilustrar la relación entre los colores y la representación femenina.

Debido a que este no es su gráfico de barras habitual, plt.leyenda() eso no funciona aquí.

Usando la anotación Bbox de matplotlib, podemos crear rectángulos (o círculos) para mostrar el significado de cada color. También podemos hacer lo mismo para mostrar una escala de burbuja.

import matplotlib.pyplot as plt
from matplotlib.offsetbox import (AnnotationBbox, DrawingArea,
TextArea,HPacker)
from matplotlib.patches import Circle,Rectangle

# This is an example for one section of the legend

# Define where the annotation (legend) will be
xy = [50, 128]

# Create your colored rectangle or circle
da = DrawingArea(20, 20, 0, 0)
p = Rectangle((10 ,10),10,10,color="#fc8d62ff")
da.add_artist(p)

# Add text

text = TextArea("20%", textprops=dict(color="#fc8d62ff", size=14,fontweight='bold'))

# Combine rectangle and text
vbox = HPacker(children=[da, text], align="top", pad=0, sep=3)

# Annotate both in a box (change alpha if you want to see the box)
ab = AnnotationBbox(vbox, xy,
xybox=(1.005, xy[1]),
xycoords='data',
boxcoords=("axes fraction", "data"),
box_alignment=(0.2, 0.5),
bboxprops=dict(alpha=0)
)
#Add to your bubble chart
ax.add_artist(ab)

También agregué un subtítulo y una descripción de texto debajo del gráfico simplemente usando plt.texto()

Visualización final

Interpretaciones simples y fáciles de usar del gráfico:

  • La mayoría de las burbujas son de color verde claro → verde significa 50% mujeres → la mayoría de las competiciones olímpicas tienen una división equitativa 50/50 mujeres/hombres (sí 🙌)
  • Sólo un deporte (béisbol), de color verde oscuro, no tiene participación femenina.
  • 3 deportes tienen participación exclusivamente femenina pero el número de deportistas es bastante bajo.
  • Los deportes con mayor número de atletas (natación, atletismo y gimnasia) están muy cerca de tener una división 50/50.