Matplotlib-如何通过误差线绘制最小和最大梯度线?

时间:2018-10-28 11:05:35

标签: python matplotlib plot graph

我的代码:

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model

def bestfit(x, m, c):
    return m * x + c

x = [2.8672E-02, 2.2199E-02, 1.8180E-02, 1.5410E-02, 1.3325E-02]
y = [8.64622E-03, 7.07473E-03, 6.13109E-03, 5.46607E-03, 4.90341E-03]
xerror =[8.2209E-07, 4.9280E-07, 3.3052E-07, 2.3748E-07, 1.7756E-07]
yerror = [1.62083E-04, 1.45726E-04, 1.38127E-04, 1.26587E-04, 1.22042E-04]

mod = Model(bestfit)
params = mod.make_params(m = 0.2421, c = 0.0017)
result = mod.fit(y, params, x = x)
print(result.fit_report())
print(1 - result.residual.var() / np.var(y))

matplotlib.rcParams['font.serif'] = "Times New Roman"
matplotlib.rcParams['font.family'] = "serif"
plt.plot(x, y, 'bo', markersize = 1.5)
plt.plot(x, result.best_fit, color = 'red', linewidth = 0.5)
plt.xlabel(r'Inverse Mass $g^{-1}$')
plt.ylabel('Damping Coefficient $s^{-1}$')


plt.errorbar(x, y, xerror, yerror)
plt.show()

我希望创建最小和最大梯度线以及它们的等式:

enter image description here

我能够在Excel中完成此操作,但这需要手动输入4个极限数据点。

我如何自动执行此操作?

1 个答案:

答案 0 :(得分:1)

我不清楚其他程序显示的曲线是什么。看起来好像只是在点上画一条线

  (x[0], y[0]-yerror[0]), (x[-1], y[-1]+yerror[-1])
  (x[0], y[0]+yerror[0]), (x[-1], y[-1]-yerror[-1])

使用matplotlib进行绘制应该很容易。但这对我来说似乎并不特别有意义。

另一方面,如果您想在绘图中包括某种拟合结果不确定性的度量,则有两种选择。首先,您可以使用从best_fit值中获取的参数值以及这些值的不确定性来评估模型。例如,您可以这样做(一旦拥有result):

pars = result.params

curve1 = bestfit(x, pars['m'].value+pars['m'].stderr, pars['c'].value)
curve2 = bestfit(x, pars['m'].value-pars['m'].stderr, pars['c'].value)
curve3 = bestfit(x, pars['m'].value, pars['c'].value+pars['c'].stderr)
curve4 = bestfit(x, pars['m'].value, pars['c'].value-pars['c'].stderr)
curve5 = bestfit(x, pars['m'].value+pars['m'].stderr, pars['c'].value+pars['c'].stderr)
curve6 = bestfit(x, pars['m'].value+pars['m'].stderr, pars['c'].value-pars['c'].stderr)
curve7 = bestfit(x, pars['m'].value-pars['m'].stderr, pars['c'].value+pars['c'].stderr)
curve8 = bestfit(x, pars['m'].value-pars['m'].stderr, pars['c'].value-pars['c'].stderr)

,然后绘制其中一些。

要制作的更简单且可能更有用的图将是使用eval_uncertainties的{​​{1}}方法。看到 https://lmfit.github.io/lmfit-py/model.html#calculating-uncertainties-in-the-model-function一个简单的用法是:

ModelResult

此外,由于您在dely = result.eval_uncertainty() plt.fill_between(x, result.best_fit-dely, result.best_fit+dely, color="#ABABAB") 中存在不确定性,因此可以根据自己的需要使用这些不确定性。为此,您需要将y作为lmfit.Model传递给1.0/yerror方法:

weight

(注意:数据和不确定性实际上应该是numpy数组,而不是列表)。我认为对于您的数据(不确定性在大小上相似),它与最佳拟合值和不确定性不会有多大区别,但在报告的统计数据(如卡方)中却有区别。

最后,对于一个简单的线性模型(即,参数线性的模型,就像这样的模型),您实际上并不需要使用像fit这样的迭代方法,而是可以使用线性方法。回归方法。