HOWTO · Matplotlib

Cómo conectar los puntos de dispersión con la línea en Matplotlib

Para conectar los puntos de un gráfico de dispersión en el orden de los datos, `plot()` dibuja el trazado que los une, `scatter()` añade marcadores independientes y `show()` muestra la figura terminada. Usa `zorder` para controlar qué capa aparece encima.

En esta página

Para conectar los puntos de un gráfico de dispersión en el orden de los datos, pasa los mismos valores de x e y a scatter() y plot(), y luego llama a show() para mostrar la figura. scatter() dibuja los marcadores como una colección independiente, plot() dibuja el trazado que conecta los puntos en el orden suministrado y show() muestra la figura terminada.

Los ejemplos de este tutorial se ejecutaron y verificaron con Matplotlib 3.11.2 en Python 3.12, y cada figura siguiente es el resultado renderizado del ejemplo que está justo encima.

Conectar los puntos de dispersión en el orden de los datos con scatter() y plot()

Pasa a ambas funciones las mismas secuencias de coordenadas. plot() conecta cada par en el orden suministrado, de modo que la secuencia determina el trazado; Matplotlib no ordena los puntos por la coordenada x. Mantén cada valor x emparejado con su valor y correspondiente: el primer valor x pertenece al primer valor y, el segundo al segundo, y así sucesivamente. Si ordenas las observaciones por x, reordena los valores y junto con esas mismas observaciones en lugar de ordenar las dos listas por separado.

Esto es importante cuando los datos representan una ruta, una serie temporal u otra secuencia en la que el orden tiene significado. Por ejemplo, unos valores x que pasan de 1 a 3 y luego vuelven a 2 producen un trazado que se mueve a la derecha y luego a la izquierda. Eso puede ser correcto para una trayectoria. Si tu objetivo es, en cambio, una curva que progrese de izquierda a derecha, ordena primero las observaciones emparejadas. Una línea también puede contener segmentos verticales cuando observaciones vecinas comparten un valor x; plot() sigue uniéndolas en el orden suministrado.

Este ejemplo superpone los marcadores y la línea de conexión usando un solo conjunto de coordenadas:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.scatter(x, y)
plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Cuatro puntos de dispersión en (1, 2), (2, 1), (3, 3) y (4, 2) unidos en orden de datos por una línea continua.

Usar las mismas entradas x e y mantiene los marcadores y la línea alineados. Si las dos capas parecen desplazadas, comprueba que ninguna secuencia se haya transformado ni reordenado para una sola llamada. Para datos almacenados en una tabla, selecciona ambas columnas de las mismas filas y en el mismo orden. El ejemplo usa la interfaz pyplot, por lo que no necesita una variable de figura separada; con la interfaz orientada a objetos, crea una figura y unos ejes con fig, ax = plt.subplots() y luego llama a ax.scatter(...) y ax.plot(...) en esos ejes.

Dar estilo a la línea y los marcadores con plot()

Usa linestyle y color para dar estilo al trazado que dibuja plot(). El ejemplo siguiente mantiene una capa scatter() separada para los marcadores y dibuja el trazado de conexión como una línea azul discontinua:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.scatter(x, y, color="blue")
plt.plot(x, y, linestyle="--", color="blue")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Los mismos cuatro puntos unidos por una línea azul discontinua, con un marcador azul en cada punto.

Llamar a scatter() y plot() por separado proporciona un control independiente sobre la colección de puntos y el trazado de conexión: el tamaño y el color de los marcadores pueden cambiar sin tocar la línea, lo cual es útil cuando los puntos necesitan más énfasis mientras el trazado se mantiene visualmente sencillo. Pasa a ambas llamadas las mismas secuencias de coordenadas para que cada marcador quede sobre su punto correspondiente en la línea.

Una sola llamada a plot() también puede dibujar ambas capas a la vez mediante una cadena de formato como "xb-", donde x selecciona la forma del marcador, b selecciona el azul y - selecciona una línea continua. La cadena de formato es compacta cuando una llamada debe dibujarlo todo; los argumentos de palabra clave como color, marker y linestyle son más claros cuando necesitas otras propiedades, como el tamaño del marcador, el grosor de la línea o la transparencia. Elijas el enfoque que elijas, show() va después de todas las llamadas de estilo y de capas, porque muestra la figura solo después de que esos elementos se hayan añadido.

Controlar qué capa aparece encima con zorder

El elemento con el zorder más alto se dibuja encima del que tiene el valor más bajo. Esto solo cambia el orden de dibujo; no cambia las coordenadas ni el trazado. El ajuste importa cuando una línea gruesa cruza un marcador y oculta su centro, o cuando la línea debe permanecer visible sobre marcadores densos.

El ejemplo siguiente hace la línea deliberadamente gruesa y asigna a los marcadores el zorder más alto, para que cada marcador redondo permanezca entero donde la línea pasa por debajo:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3, 2]

plt.plot(x, y, linewidth=6, zorder=2)
plt.scatter(x, y, s=120, zorder=3)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Una línea gruesa a través de los cuatro puntos, con marcadores redondos más grandes dibujados sobre la línea en cada punto.

Para que los marcadores queden sobre la línea, asigna a la colección de dispersión el valor mayor, como zorder=3 para scatter() frente a zorder=2 para plot() en el ejemplo anterior. Para poner la línea sobre los marcadores, intercambia los valores. Usa una diferencia modesta entre los dos valores para expresar el orden deseado, y define zorder en ambos elementos cuando la superposición deba ser inequívoca. La misma comparación se aplica a cualquier otro elemento del gráfico que añadas después: el elemento con el zorder más alto se dibuja sobre los demás.

Igualar las longitudes de x e y para evitar el error de tamaño

Ambas funciones emparejan los valores posición a posición, por lo que las dos secuencias deben tener la misma longitud. Cuando no la tienen, la llamada produce un ValueError y no se dibuja ninguna figura. Este ejemplo omite por error el último valor y:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 1, 3]

plt.scatter(x, y)
plt.plot(x, y)
plt.show()

Al ejecutarlo, falla en la llamada a scatter() con:

ValueError: x and y must be the same size

Llamar solo a plot() con las mismas entradas también falla, con su propia formulación del mismo problema: ValueError: x and y must have same first dimension, but have shapes (4,) and (3,). Para corregir el error, localiza la observación que falta o sobra y haz que las dos secuencias vuelvan a describir los mismos puntos. Comparar len(x) y len(y) antes de dibujar señala qué lado es más corto. Cuando los datos proceden de una tabla, filtra las filas una sola vez y toma luego ambas columnas de las filas filtradas, en lugar de filtrar cada columna por separado y dejar que sus longitudes se desajusten.

Dos secuencias vacías son un caso diferente: se aceptan y producen unos ejes vacíos sin error. Por tanto, una figura vacía suele significar que los datos de entrada estaban vacíos, no que las longitudes no coincidieran.