HOWTO · Matplotlib

Cómo dibujar una línea arbitraria en Matplotlib

Dibuja segmentos de línea finitos en Matplotlib con plot(), hlines(), vlines() y LineCollection.

En esta página

Para dibujar un solo segmento de línea finito en Matplotlib, pasa las coordenadas de sus dos extremos a Axes.plot(). Usa hlines() o vlines() cuando el segmento sea horizontal o vertical, y usa LineCollection cuando tengas muchos segmentos independientes. Estas API usan coordenadas de datos; axhline(), axvline() y axline() resuelven un problema diferente de una línea que atraviesa los ejes o es infinita.

Los ejemplos usan Python con Matplotlib. Instala Matplotlib con python -m pip install matplotlib si todavía no está disponible. Cada ejemplo ejecutable guarda un PNG para poder comprobarlo en un entorno no interactivo; sustituye savefig() por plt.show() cuando quieras una ventana interactiva.

Dibujar un segmento finito con plot()

Para un segmento desde (x1, y1) hasta (x2, y2), proporciona a plot() una secuencia de dos valores x y otra de dos valores y. Matplotlib conecta los valores que ocupan la misma posición, de modo que el primer par x/y es un extremo y el segundo par es el otro.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([3, 5], [1, 6], color="tab:green", marker="o")
ax.set(xlabel="x", ylabel="y", title="Finite segment with plot()")
fig.savefig("plot-segment.png", dpi=120)
print("saved: plot-segment.png")
saved: plot-segment.png

Un segmento verde finito que une los dos extremos trazados

La marca hace visibles los dos extremos. Añade más pares de valores solo cuando quieras crear una polilínea: plot() conecta puntos consecutivos en lugar de crear segmentos independientes.

Dibujar segmentos horizontales o verticales finitos

Usa hlines(y, xmin, xmax) para un segmento horizontal y vlines(x, ymin, ymax) para uno vertical. La coordenada que permanece constante es el primer argumento; los otros dos son los extremos finitos en coordenadas de datos.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.hlines(3, 2, 5, color="tab:red")
ax.vlines(6, 1, 5, color="tab:green")
ax.set(xlim=(0, 7), ylim=(0, 6), xlabel="x", ylabel="y")
fig.savefig("horizontal-vertical-segments.png", dpi=120)
print("saved: horizontal-vertical-segments.png")
saved: horizontal-vertical-segments.png

Un segmento horizontal rojo finito y un segmento vertical verde finito

Aquí el segmento rojo va de (2, 3) a (5, 3), mientras que el segmento verde va de (6, 1) a (6, 5). Los límites explícitos aclaran el rango de datos previsto y evitan interpretar una línea recortada como un segmento más corto.

No sustituyas una línea de referencia que atraviesa los ejes

axhline() y axvline() son útiles como líneas de referencia, pero atraviesan los ejes en una dirección en lugar de usar dos extremos en coordenadas de datos. Del mismo modo, axline() representa una línea infinita que pasa por puntos o tiene una pendiente. Usa una de esas API solo cuando ese comportamiento sea el que necesita el gráfico.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
segment = ax.hlines(3, 2, 5, color="tab:red")
reference = ax.axhline(3, color="0.35", linestyle="--")
assert segment.get_segments()[0].tolist() == [[2.0, 3.0], [5.0, 3.0]]
assert reference.get_transform() is ax.get_yaxis_transform()
print("hlines endpoints: [2.0, 3.0] to [5.0, 3.0]")
print("axhline uses axes-relative x coordinates")
hlines endpoints: [2.0, 3.0] to [5.0, 3.0]
axhline uses axes-relative x coordinates

La aserción demuestra el límite: hlines() conserva extremos finitos en coordenadas de datos, mientras que axhline() usa coordenadas relativas a los ejes para su extensión horizontal. Esta diferencia importa al aplicar zoom, cambiar los límites o exportar un gráfico.

Dibujar muchos segmentos independientes con LineCollection

Cuando necesites muchos segmentos desconectados, crea una LineCollection a partir de una secuencia de segmentos de dos puntos y añádela a unos ejes. Llamar a autoscale() después de add_collection() permite que los ejes incluyan la colección; establece límites explícitos si un rango de visualización fijo forma parte del gráfico.

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

segments = [[(1, 10), (6, 9)], [(1, 7), (3, 6)]]
collection = LineCollection(segments, colors=["tab:red", "tab:green"])

fig, ax = plt.subplots()
ax.add_collection(collection)
ax.autoscale()
ax.set(xlabel="x", ylabel="y", title="Two independent segments")
fig.savefig("line-collection.png", dpi=120)
print("segments: 2")
print("saved: line-collection.png")
segments: 2
saved: line-collection.png

Dos segmentos independientes añadidos a una LineCollection de Matplotlib

LineCollection es adecuado para muchos segmentos porque los agrupa en una sola colección. No conecta el final de un segmento con el principio del siguiente, que es la diferencia clave frente a pasar una secuencia de puntos más larga a plot().

Elegir la API que corresponde a la geometría

Elige plot() para un segmento o una trayectoria conectada, hlines() y vlines() para segmentos finitos alineados con los ejes, y LineCollection para un conjunto de segmentos desconectados. Prefiere axhline() o axvline() solo para una guía que atraviesa los ejes, y recuerda que axline() es infinita.

Para conocer los parámetros y las opciones de estilo, consulta la documentación oficial de plot(), hlines(), vlines() y LineCollection. Los ejemplos anteriores se ejecutaron con Matplotlib 3.11.2 en el contenedor local de Polyglot registrado.