Gráfico de dispersión en matplotlib

La función scatter en matplotlib

Matplotlib proporciona una función llamada scatter que permite crear gráficos de dispersión (scatter plots) completamente personalizables en Python. Para crear un gráfico de dispersión tan solo es necesario pasar arrays a los argumentos x e y con tus datos.

import numpy as np
import matplotlib.pyplot as plt

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x = x, y = y)
# plt.show()

Gráfico de dispersión en matplotlib

Personalización de los símbolos

El símbolo por defecto de un gráfico de dispersión es un círculo, pero el argumento marker permite personalizarlo. Las posibles opciones son las de esta lista.

Personalizar el símbolo en matplotlib

import numpy as np
import matplotlib.pyplot as plt

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x, y, marker = "*")
# plt.show()

Símbolos de LaTeX

Ten en cuenta que además de los símbolos de matplotlib también puedes utilizar los de LaTeX de la siguiente forma:

Símbolos de LaTeX en matplotlib

import numpy as np
import matplotlib.pyplot as plt

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x, y, marker = r'$\clubsuit$')
# plt.show()

Personalización del color

La función scatter proporciona varios argumentos para personalizar los marcadores de diversar maneras. Si quieres cambiar el color azul por defecto puedes establecer un nuevo color utilizando el argumento c.

import numpy as np
import matplotlib.pyplot as plt

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x, y, c = "red")
# plt.show()

Cambiar el color de los puntos de un gráfico de dispersión en Python

Color por grupo

También puedes establecer el color por grupo creando un array con colores, como en el ejemplo siguiente.

import numpy as np
import matplotlib.pyplot as plt

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])
color = np.where(x < 5, "yellow", "lightblue")

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x, y, c = color)
# plt.show()

Gráfico de dispersión por grupo en Python

Degradado

Si pasas un array numérico a c los puntos se colorearán con una paleta de colores, como se muestra en la imagen siguiente. La paleta de colores por defecto (viridis) se puede cambiar con el argumento cmap.

import numpy as np
import matplotlib.pyplot as plt

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x, y, c = np.sqrt(x ** 2 + y ** 2))
# plt.show()

Scatter plot with color gradient in matplotlib

Transparencia de los símbolos

Además, la transparencia de los símbolos se puede personalizar con alpha, que va desde 0 (invisible) a 1 (completamente opaco).

import numpy as np
import matplotlib.pyplot as plt

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x, y, alpha = 0.5)
# plt.show()

Transparencia de los puntos en matplotlib con alpha

Color de borde

Por último, también puedes personalizar el borde de los símbolos utilizando el argumento edgecolors, que por defecto es igual al color de fondo del símbolo. Ten en cuenta que también puedes personalizar su grosor con linewidths.

import numpy as np
import matplotlib.pyplot as plt

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x, y, c = "white",
           edgecolors = "black", linewidths = 1.5)
# plt.show()

Personalizar el color de borde en matplotlib con edgecolors

Tamaño de los símbolos

El argumento s permite personalizar el tamaño de los símbolos. Las unidades son “puntos ^ 2”.

Tamaño de los símbolos en un scatter plot de matplotlib

import numpy as np
import matplotlib.pyplot as plt

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x, y, s = 200)
# plt.show()

Tamaño en base a una variable

Una alternativa es establecer el tamaño a partir de una variable numérica de la misma longitud que los datos.

Tamaño de los símbolos en base a una variable en Python

import numpy as np
import matplotlib.pyplot as plt

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])
size = x * 25

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x, y, s = size)
# plt.show()

Leyenda de un gráfico de dispersión

Existen varias formas de agregar una leyenda a un gráfico de dispersión en matplotlib. La selección entre un método u otro dependerá de tu caso de uso. Si quieres agregar una etiqueta para un solo grupo puedes pasar un nombre a label y agregar la leyenda con legend.

import numpy as np
import matplotlib.pyplot as plt

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x, y, label = "Puntos")
plt.legend(loc = "upper right")
# plt.show()

Agregar una leyenda a un gráfico de dispersión en Python

Dividiendo los datos

Si divides tus datos en varios grupos y agregas los puntos de manera independiente puedes agregar una leyenda mostrando los grupos, como en el ejemplo siguiente.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

# Datos 1
x1 = np.array([1, 1, 2, 3])
y1 = np.array([2, 6, 5, 4])

plt.scatter(x1, y1, c = "red", label = "Grupo 1")

# Datos 2
x2 = np.array([5, 6, 7, 8, 8, 9])
y2 = np.array([2, 4, 6, 5, 3, 1])

plt.scatter(x2, y2, c = "blue", label = "Grupo 2")

# Leyenda
plt.legend()
# plt.show()

Leyenda por color en un gráfico de dispersión de matplotlib

Utilizando mpatches

Otra manera es utilizar mpatches de matplotlib.patches, pero ten en cuenta que por defecto la leyenda no mostrará el símbolo del gráfico, sino que mostrará rectángulos.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

# Datos 
x = np.array([3, 8, 5, 6, 1, 9, 6, 7, 2, 1, 8])
y = np.array([4, 5, 2, 4, 6, 1, 4, 6, 5, 2, 3])
color = np.where(x < 5, "red", "green")

# Gráfico
fig, ax = plt.subplots()
ax.scatter(x, y, c = color, label = color)

# Etiquetas de la leyenda
rojo = mpatches.Patch(color = "red", label = "Puntos rojos")
verde = mpatches.Patch(color = "green", label = "Puntos verdes")

# Leyenda
plt.legend(handles = [rojo, verde])
# plt.show()

Leyenda de un gráfico de dispersión en matplotlib utilizando mpatches

Better Data Visualizations

A Guide for Scholars, Researchers, and Wonks

Comprar en Amazon
Data Sketches

A journey of imagination, exploration, and beautiful data visualizations

Comprar en Amazon

También te puede interesar