Is it possible to find the peak (vertex?) values (x,y) of a polynomial regression line that was computed using Matplotlib?
I’ve included my basic setup below (of course with fuller data sets), as well as a screenshot of the actual regression line question.
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LinearRegression
degree=6
setX={'Fixation Duration': {0:1,1:2,2:3}}
setY={'Fixation Occurrences': {0:1,1:2,2:3}}    
X_gall=pd.DataFrame.from_dict(setX)
Y_gall=pd.DataFrame.from_dict(setY)
X_seqGall = np.linspace(X_gall.min(),X_gall.max(),300).reshape(-1,1)
polyregGall=make_pipeline(PolynomialFeatures(degree),LinearRegression())
polyregGall.fit(X_gall,Y_gall)
plt.scatter(X_gall,Y_gall, c="#1E4174", s=100.0, alpha=0.4)
plt.plot(X_seqGall,polyregGall.predict(X_seqGall),color="#1E4174", linewidth=4)
plt.show()
would like to find x,y values along red arrows
Advertisement
Answer
You can find the maximum from the underlying plot data.
First, let’s change your plotting commands to explicitly define the axes:
fig, ax = plt.subplots(figsize=(6,4)) _ = ax.scatter(X_gall,Y_gall, c="#1E4174", s=100.0, alpha=0.4) poly = ax.plot(X_seqGall,polyregGall.predict(X_seqGall),color="#1E4174", linewidth=4) plt.show()
Now you can access the line data:
lines = poly[0].axes.lines
for line in lines:
    max_y = np.max(line.get_ydata())
    print(f"Maximum y is: {max_y}")
    x_of_max_y = line.get_xdata()[np.argmax(line.get_ydata())]
    print(f"x value of maximum y is: {x_of_max_y}")
Output:
Maximum y is: 3.1515605364361114 x value of maximum y is: 2.8127090301003346
