matplotlib 如何画一条触底曲线

wkyowqbh  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(132)

我想画一条趋势线,它很好地跟随几个点。它应该是一种“平均值”,所以它不必精确击中点,但形状必须是一个平滑的弧线。我很难让Python或Excel得到我想要的东西。这是我正在使用的一个示例代码,

x = np.array([6,8,10,12,16,24,32])
y = np.array([934,792,744,710,699,686,681])

#create scatterplot
plt.scatter(x, y)

#calculate equation for quadratic trendline
z = np.polyfit(x, y, 2)
p = np.poly1d(z)

#add trendline to plot
plt.plot(x, p(x))

它给出了一个类似

的输出
而我要找的是像

这样的东西,这是另一个例子,这里的线更尖锐,不像前面的

那样触底
有人知道这是怎么做到的吗?当我在Excel上尝试它时,似乎需要一个“等式”,但我不知道如何获得这个等式。
编辑:我正在寻找的曲线必须是单调递减和凹

nfzehxib

nfzehxib1#

若要拟合具有所需形状的曲线,请使用scipy.optimize.curve_fit。由于需要通用的1/x曲线,可以使用a/(x+b) + c,其中a调整曲率,b调整左右位置,c调整上下位置。您可以使用this Desmos图查看这些参数如何更改形状。

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

plt.close("all")

def func(x, a, b, c):
    return a/(x+b) + c

x = np.array([6,8,10,12,16,24,32])
y = np.array([934,792,744,710,699,686,681])

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

xfine = np.linspace(x.min(), x.max(), 50)
yfit = func(xfine, *popt)

fig, ax = plt.subplots()
ax.plot(x, y, ".")
ax.plot(xfine, yfit)
fig.show()

相关问题