I discovered a hidden gem in Matplotlib’s library: Packed Bubble Charts in Python | by Anna Gordun Peiro | Jul, 2024

For my chart, I’m utilizing an Olympic Historic Dataset from Olympedia.org which Joseph Cheng shared in Kaggle with a public area license.

Screenshot of dataset

It accommodates occasion to Athlete degree Olympic Video games Outcomes from Athens 1896 to Beijing 2022. After an EDA (Exploratory Information Evaluation) I reworked it right into a dataset that particulars the variety of feminine athletes in every sport/occasion per yr. My bubble chart concept is to point out which sports activities have a 50/50 feminine to male ratio athletes and the way it has advanced throughout time.

My plotting information consists of two totally different datasets, one for every year: 2020 and 1996. For every dataset I’ve computed the full sum of athletes that participated to every occasion (athlete_sum) and the way a lot that sum represents in comparison with the variety of complete athletes (male + feminine) (distinction). See a screenshot of the info beneath:

Display shot of plotting dataset

That is my strategy to visualise it:

  • Dimension proportion. Utilizing radius of bubbles to check quantity athletes per sport. Greater bubbles will signify extremely aggressive occasions, similar to Athletics
  • Multi variable interpretation. Making use of colors to signify feminine illustration. Mild inexperienced bubbles will signify occasions with a 50/50 break up, similar to Hockey.

Right here is my place to begin (utilizing the code and strategy from above):

First outcome

Some straightforward fixes: growing determine measurement and altering labels to empty if the scale isn’t over 250 to keep away from having phrases exterior bubbles.

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

#Labels edited instantly in dataset

Second outcome

Effectively, now no less than it’s readable. However, why is Athletics pink and Boxing blue? Let’s add a legend as an instance the connection between colors and feminine illustration.

As a result of it’s not your common barplot chart, plt.legend() doesn’t do the trick right here.

Utilizing matplotlib Annotation Bbox we are able to create rectangles (or circles) to point out that means behind every color. We will additionally do the identical factor to point out a bubble scale.

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

# That is an instance for one part of the legend

# Outline the place the annotation (legend) might be
xy = [50, 128]

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

# Add textual content

textual content = TextArea("20%", textprops=dict(shade="#fc8d62ff", measurement=14,fontweight='daring'))

# Mix rectangle and textual content
vbox = HPacker(kids=[da, text], align="high", pad=0, sep=3)

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

I’ve additionally added a subtitle and a textual content description underneath the chart simply through the use of plt.textual content()

Last visualisation

Simple and consumer pleasant interpretations of the graph:

  • Majority of bubbles are mild inexperienced → inexperienced means 50% females → majority of Olympic competitions have a good 50/50 feminine to male break up (yay🙌)
  • Just one sport (Baseball), in darkish inexperienced color, has no feminine participation.
  • 3 sports activities have solely feminine participation however the variety of athletes is pretty low.
  • The largest sports activities when it comes to athlete quantity (Swimming, Athletics and Gymnastics) are very near having a 50/50 break up

Leave a Reply