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
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
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
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.