Considera los siguientes datos a modo de ejemplo:
import numpy as np
# Semilla
rng = np.random.RandomState(1)
# Simulación de datos
x = rng.uniform(0, 1, 40)
y = rng.uniform(0, 1, 40)
size = rng.uniform(20, 60, 40)
scatter
Un gráfico de burbujas es un gráfico de dispersión donde una tercera variable numérica se mapea al tamaño de los marcadores. Matplotlib no necesita una función específica: basta con pasar un array al argumento s de scatter.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.scatter(x, y, s = size)
# plt.show()

Escala de tamaño
Los valores pasados a s son el área del marcador en puntos, no una escala relativa, así que a menudo tendrás que multiplicar tu variable por una constante para obtener un rango de tamaños de burbuja legible.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.scatter(x, y, s = size * 10)
# plt.show()

Colores
Mapea una cuarta variable a c junto con un cmap para codificar también el color, o pasa un único color fijo para todas las burbujas.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.scatter(x, y, s = size * 10, c = size, cmap = "viridis")
# plt.show()

Transparencia y color del borde
Las burbujas que se solapan se leen mejor con algo de transparencia (alpha) y un borde (edgecolors).
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.scatter(x, y, s = size * 10, color = "#4C72B0",
alpha = 0.6, edgecolors = "white")
# plt.show()

Como scatter no crea una leyenda de tamaño automáticamente, constrúyela a mano con legend_elements, que obtiene ejemplos representativos a partir de los tamaños representados.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
scatter = ax.scatter(x, y, s = size * 10, color = "#4C72B0", alpha = 0.6)
handles, labels = scatter.legend_elements(prop = "sizes", num = 4, alpha = 0.6)
ax.legend(handles, labels, title = "Tamaño", loc = "upper right")
# plt.show()

También te puede interesar