python - matplotlib: línea extendida sobre 2 puntos de control
set title matplotlib (3)
En matplotlib podemos dibujar líneas usando al menos 2 métodos:
plt.plot
plt.plot([1,2],[1,2],color=''k'',marker=''o'')
Método line2d
line = lines.Line2D([0.3,0.6],[0.9,0.3],linestyle=''dashed'',color=''k'') plt.axes().add_line(line)
Sospecho que ambos métodos son los mismos en la implementación, por supuesto. Pero de todos modos, dibuja una línea exactamente entre 2 puntos establecidos. A veces necesito extender la línea sobre esos 2 puntos hasta los límites del gráfico. Claro que puedo calcularlo en forma de y = ax + b, pero ¿alguien sabe de una manera más fácil?
Estuche perfecto si puedo poner alguna opción adicional, pero no pude encontrarlo.
Después de un buen almuerzo, pude encontrar una manera de usar Npypy.
def drawLine2P(x,y,xlims):
xrange = np.arange(xlims[0],xlims[1],0.1)
A = np.vstack([x, np.ones(len(x))]).T
k, b = np.linalg.lstsq(A, y)[0]
plt.plot(xrange, k*xrange + b, ''k'')
Espero que esto ayude
import matplotlib.pyplot as plt
# I am generating 2 random points, u might want to update these
x1,y1,x2,y2 = np.random.uniform(-1,1,4)
# make use of line equation to form function line_eqn(x) that generated y
line_eqn = lambda x : ((y2-y1)/(x2-x1)) * (x - x1) + y1
# generate range of x values based on your graph
xrange = np.arange(-1.2,1.2,0.2)
# plot the line with generate x ranges and created y ranges
plt.plot(xrange, [ line_eqn(x) for x in xrange], color=''k'', linestyle=''-'', linewidth=2)
Poco tarde en esto, pero acabo de encontrar esto mientras buscaba en Google. También estaba harta de no poder hacer esto en matplotlib, así que escribí abline_plot. Incluye devoluciones de llamada para actualizar una línea 2D si se cambian los límites de los ejes.
Busque los ejemplos de abline_plot en el enlace de abajo.
http://statsmodels.sourceforge.net/devel/examples/generated/example_interactions.html
Documentación:
Implementación:
https://github.com/statsmodels/statsmodels/blob/master/statsmodels/graphics/regressionplots.py#L572
Edición: Una más simple que no se actualiza.
import matplotlib.pyplot as plt
from matplotlib import lines as mpl_lines
def slope_from_points(point1, point2):
return (point2[1] - point1[1])/(point2[0] - point1[0])
def plot_secant(point1, point2, ax):
# plot the secant
slope = slope_from_points(point1, point2)
intercept = point1[1] - slope*point1[0]
# update the points to be on the axes limits
x = ax.get_xlim()
y = ax.get_ylim()
data_y = [x[0]*slope+intercept, x[1]*slope+intercept]
line = mpl_lines.Line2D(x, data_y, color=''red'')
ax.add_line(line)
return ax.figure()