¿Cómo dibujar una línea con matplotlib?

No puedo encontrar una forma de dibujar una línea arbitraria con la biblioteca de matplotlib Python. Permite dibujar líneas horizontales y verticales (con matplotlib.pyplot.axhline y matplotlib.pyplot.axvline , por ejemplo), pero no veo cómo dibujar una línea a través de dos puntos dados (x1, y1) y (x2, y2) . ¿Hay alguna manera? ¿Hay una forma sencilla?

Estaba comprobando cómo funciona ax.axvline, y escribí una pequeña función que se parece a parte de su idea:

 import matplotlib.pyplot as plt import matplotlib.lines as mlines def newline(p1, p2): ax = plt.gca() xmin, xmax = ax.get_xbound() if(p2[0] == p1[0]): xmin = xmax = p1[0] ymin, ymax = ax.get_ybound() else: ymax = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmax-p1[0]) ymin = p1[1]+(p2[1]-p1[1])/(p2[0]-p1[0])*(xmin-p1[0]) l = mlines.Line2D([xmin,xmax], [ymin,ymax]) ax.add_line(l) return l 

Por lo tanto, si ejecuta el siguiente código, se dará cuenta de cómo funciona. La línea abarcará el rango completo de su trazado (independientemente de su tamaño), y la creación de la línea no se basa en ningún punto de datos dentro del eje, sino solo en dos puntos fijos que debe especificar.

 import numpy as np x = np.linspace(0,10) y = x**2 p1 = [1,20] p2 = [6,70] plt.plot(x, y) newline(p1,p2) plt.show() 

introduzca la descripción de la imagen aquí

Esto dibujará una línea que pasa por los puntos (-1, 1) y (12, 4) y otra que pasa por los puntos (1, 3) et (10, 2).

x1 son las coordenadas x de los puntos para la primera línea, y1 son las coordenadas y para los mismos – los elementos en x1 y y1 deben estar en secuencia.

x2 y y2 son iguales para la otra línea.

 import matplotlib.pyplot as plt x1, y1 = [-1, 12], [1, 4] x2, y2 = [1, 10], [3, 2] plt.plot(x1, y1, x2, y2, marker = 'o') plt.show() 

introduzca la descripción de la imagen aquí

Le sugiero que pase un tiempo leyendo / estudiando los tutoriales básicos que se encuentran en el rico sitio web de matplotlib para familiarizarse con la biblioteca.

¿Qué pasa si no quiero segmentos de línea?

No hay formas directas de extender las líneas hasta el infinito … matplotlib cambiará el tamaño o la escala de la gráfica para que el punto más lejano se encuentre en el límite y el otro en el interior, dibujando segmentos de línea en efecto; o debe elegir puntos fuera del límite de la superficie que desea establecer visible, y establecer límites para los ejes x e y.

Como sigue:

 import matplotlib.pyplot as plt x1, y1 = [-1, 12], [1, 10] x2, y2 = [-1, 10], [3, -1] plt.xlim(0, 8), plt.ylim(-2, 8) plt.plot(x1, y1, x2, y2, marker = 'o') plt.show() 

introduzca la descripción de la imagen aquí

Solo quiero mencionar otra opción aquí.

Puede calcular los coeficientes utilizando numpy.polyfit () y alimentar los coeficientes a numpy.poly1d (). Esta función puede construir polinomios usando los coeficientes, puedes encontrar más ejemplos aquí

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.poly1d.html

Digamos, dados dos puntos de datos (-0.3, -0.5) y (0.8, 0.8)

 import numpy as np import matplotlib.pyplot as plt # compute coefficients coefficients = np.polyfit([-0.3, 0.8], [-0.5, 0.8], 1) # create a polynomial object with the coefficients polynomial = np.poly1d(coefficients) # for the line to extend beyond the two points, # create the linespace using the min and max of the x_lim # I'm using -1 and 1 here x_axis = np.linspace(-1, 1) # compute the y for each x using the polynomial y_axis = polynomial(x_axis) fig = plt.figure() axes = fig.add_axes([0.1, 0.1, 1, 1]) axes.set_xlim(-1, 1) axes.set_ylim(-1, 1) axes.plot(x_axis, y_axis) axes.plot(-0.3, -0.5, 0.8, 0.8, marker='o', color='red') 

introduzca la descripción de la imagen aquí

Espero eso ayude.