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()
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.
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:
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()
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()
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()
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()
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()
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()
El argumento s
permite personalizar el tamaño de los símbolos. Las unidades son “puntos ^ 2”.
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.
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()
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()
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()
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()
También te puede interesar