Home > Enterprise >  How to plot lower boundary with a scatter plot with curve_fit and a linear line function?
How to plot lower boundary with a scatter plot with curve_fit and a linear line function?

Time:03-09

I use the following code to plot a scatter plot. I have been trying to plot the lower boundary for it. I tried following the other question but I was unable to replicate it for my objective function and data. The code is as follows :

from numpy import arange
import pandas as pd
from pandas import read_csv
from scipy.optimize import curve_fit
from matplotlib import pyplot
 

def objective(x, a, b):
    return a * x   b
 
events = pd.read_excel('values.xlsx')
x = events.loc[:, 'Value']
y = events.loc[:, 'Frame']

popt, _ = curve_fit(objective, x, y)


a, b = popt
pyplot.scatter(x, y)


x_line = arange(min(x), max(x), 1)
y_line = objective(x_line, a, b)
pyplot.plot(x_line, y_line, '--', color='purple')
xmin, xmax = pyplot.xlim() # the limits of the x-axis for drawing the line
ymin, ymax = pyplot.ylim()

pos_min = np.argmin(x)
pos_max = np.argmax(x)

alpha_min = x[pos_min] 
alpha_max = x[pos_max] 

pyplot.show()

I want to plot the lower boundary of the points like lower boundary.

CodePudding user response:

As you have a linear function, your upper and lower bound will have the same slope a but different b-values. So, we calculate them for all points and choose the lowest and highest:

import numpy as np
from scipy.optimize import curve_fit
from matplotlib import pyplot     

def objective(x, a, b):
    return a * x   b
 
#sample data
rng = np.random.default_rng(123)
x = np.linspace(2, 10, 150)
y = objective(x, -2, 3)
y  = 5 * rng.random(len(x))

popt, _ = curve_fit(objective, x, y) 
a, b = popt
pyplot.scatter(x, y, label="raw data")

x_line = np.asarray([np.min(x), np.max(x)])
y_line = objective(x_line, a, b)
pyplot.plot(x_line, y_line, '--', color='purple', label=f"y={a:.2f}x {b:.2f}")

b_values = y - a * x

pyplot.plot(x_line, objective(x_line, a, np.min(b_values)), '--', color='red', label="lower bound")
pyplot.plot(x_line, objective(x_line, a, np.max(b_values)), '--', color='orange', label="upper bound")

pyplot.legend()
pyplot.show()

Sample output: enter image description here

  • Related