【发布时间】:2019-09-08 11:05:18
【问题描述】:
我正在为我的 Python 实验室工作制作模板。总结一下它的目的,就是绘制数据点,用 scipy curve_fit 拟合一个预定义的模型。通常我拟合多项式或指数曲线。我设法在绘图上动态打印拟合参数,但我每次都必须手动输入相关方程。我想知道,有没有一种优雅的方式来动态地做到这一点?我读过关于 sympy 的文章,但暂时我做不到。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from datetime import datetime
#two example functions
def f(x, p0, p1):
return p0 * x + p1
def g(x, p0, p1):
return p0 * np.exp(x * p1)
#example data
xval = np.array([0,1,2,3,4,5,6])
yval = np.array([0, 2,3.95,5.8,8.1, 10.2, 12.4])
#curve fitting
popt, pcov = curve_fit(f, xval, yval)
plt.rcParams.update({'font.size': 12})
plt.figure(figsize=(9,7))
plt.plot(xval, yval,'ko', label = 'Data points', markersize = 7)
plt.title('TITLE', fontsize = 15)
plt.grid()
plt.plot(xval, f(xval, *popt),'r-', label = 'Fit')
#printing the params on plot
for idx in range(len(popt)):
plt.text(0.8,0.05+0.05*(idx+1), 'p'+str(idx)+' = {0:.5f}'.format(popt[idx]), transform=plt.gca().transAxes)
#manually writing the equation, that's what I want to print dynamically
plt.text(0.8, 0.05, '$y = p0 \cdot x + p1 $' , transform=plt.gca().transAxes)
plt.text(0.86, 1.01, datetime.today().strftime('%Y.%m.%d.'), transform=plt.gca().transAxes)
plt.text(0 ,1.01, 'NAME', transform=plt.gca().transAxes)
plt.ylabel('Y axis title')
plt.xlabel('X axis title')
plt.legend()
plt.show()
预期结果是:
如果我使用拟合函数 - 假设 g(x, p0, p1) 返回 p0 * np.exp(x * p1) 然后返回的公式本身应该打印在图上,就像示例代码中的另一个一样:
plt.text(0.8, 0.05, '$y = p0 \cdot x + p1 $' , transform=plt.gca().transAxes)
除非它是手动解决方案。
我非常感谢任何建议。
【问题讨论】:
-
您需要在某些时候输入公式。可能你想把它存储在它所属的函数附近?
-
是的,也许我会将公式存储在变量中,并在需要时使用它们。数量不多。
标签: python matplotlib scipy