In matplotlib we can draw lines using at least 2 methods:
plt.plot
plt.plot([1,2],[1,2],color='k',marker='o')
Line2D method
line = lines.Line2D([0.3,0.6],[0.9,0.3],linestyle='dashed',color='k')
plt.axes().add_line(line)
I suspect both methods are the same in implementation of course. But anyway, it draws a line exactly between 2 stated points. Sometimes I need to extend line over those 2 points up to graph limits. Sure I can calculate it in form of y=ax+b, but does anybody know way easier?
Perfect case if I can just put some additional option, but I wasn't able to find it.
Changing the Defaults: rcParams Each time Matplotlib loads, it defines a runtime configuration (rc) containing the default styles for every plot element you create. This configuration can be adjusted at any time using the plt. rc convenience routine.
In matplotlib, if you want to draw a horizontal line with full width simply use the axhline() method. You can also use the hlines() method to draw a full-width horizontal line but in this method, you have to set xmin and xmax to full width.
After good lunch I was able to find a way using numpy.
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')
Little late on this, but I just came across this while googling. I was also sick of not being able to do this in matplotlib, so I wrote abline_plot. It includes callbacks to update a 2D line if the axes limits are changed.
Search for the abline_plot examples in the link below.
http://statsmodels.sourceforge.net/devel/examples/generated/example_interactions.html
Documentation:
http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.regressionplots.abline_plot.html#statsmodels.graphics.regressionplots.abline_plot
Implementation:
https://github.com/statsmodels/statsmodels/blob/master/statsmodels/graphics/regressionplots.py#L572
Edit: A simpler one that doesn't update
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With