1s6vkcd3s72mhxci4qskywq.png

Para mi gráfico, estoy usando un conjunto de datos históricos olímpicos de Olympedia.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 desde Atenas 1896 hasta Pekín 2022, desde el nivel de evento hasta el de atleta. Después de un análisis exploratorio de datos (EDA), lo transformé en un conjunto de datos que detalla la cantidad de atletas femeninas en cada deporte/evento por año. Mi idea del gráfico de burbujas es mostrar qué deportes tienen una proporción de atletas femeninas y masculinas de 50/50 y cómo ha evolucionado con el tiempo.

Mis datos gráficos se componen de dos conjuntos de datos diferentes, uno para cada año: 2020 y 1996Para cada conjunto de datos, he calculado la suma total de atletas que participaron en cada evento. (suma_atleta) y cuánto representa esa suma en comparación con el número total de atletas (hombres + mujeres) (diferencia)Vea una captura de pantalla de los datos a continuación:

Captura de pantalla del conjunto de datos de trazado

Este es mi enfoque para visualizarlo:

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

Aquí está mi punto de partida (usando el código y el enfoque mencionados anteriormente):

Primer resultado

Algunas soluciones fáciles: aumentar el tamaño de la figura y cambiar las etiquetas a vacías si el tamaño no supera los 250 para evitar tener 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, al menos ahora es legible. Pero, ¿por qué? Atletismo rosa y Boxeo azul? Agreguemos una leyenda para ilustrar la relación entre los colores y la representación femenina.

Porque no es un gráfico de barras normal, plt.leyenda() No funciona aquí.

Con 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 burbujas.

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 sencillas y fáciles de usar del gráfico:

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