在一个图中用指数方程拟合多个独立值

Posted

技术标签:

【中文标题】在一个图中用指数方程拟合多个独立值【英文标题】:Fitting multiple independent values with an exponential equation in one plot 【发布时间】:2021-11-24 16:21:53 【问题描述】:

我一直在尝试用多个独立值拟合曲线。

对于单个绘图,我可以绘图,但对于多个值,我被卡住了。

这是我的数据集:

我在 csv 文件中有数据集,

您可以在此处找到 csv: https://github.com/Laudarisd/csv_data

这是我的单图代码:

# fit a line to the economic data
from numpy import sin
from numpy import sqrt
from numpy import arange
from pandas import read_csv
from scipy.optimize import curve_fit
from matplotlib import pyplot
import numpy as np
import pandas as pd
import csv
from numpy import savetxt
from numpy import asarray

# define the fitting function
def func(x, a, c):
    return  a - 1/2 * np.exp(-(x - 1)/c)

csv = np.genfromtxt ('./10.csv', delimiter=",")

x = csv[1:,1]
y = csv[1:,-1]
popt, pcov = curve_fit(func, x, y)
r2 = round((1 - sum((func(x, *popt) - y) ** 2) / sum((y - np.mean(y)) ** 2)),4)
print("R^2:", r2)
a, c = popt

plt.figure()
plt.plot(x, y, 'ko', label="Raw data")
plt.plot(x, func(x, *popt), 'r-', alpha=.60, label="Fitted Curve")
plt.plot(x, y, color='none', label= "c = %.2f" % c)
plt.xlabel("x label")
plt.ylabel("y label")
plt.legend()
plt.show()

详细说明:

    csv 有 3 列,但我在拟合曲线时只需要 2 列(第二和第三)。 基于第二列,我试图用上面代码中提到的方程拟合第三列 在所有 csv 中,第二列是相同的。我用于“x 标签”的第三列(准确性)与用于“y 标签”的不同。 所以我想分别提取所有准确度并在单个图中根据def fun(x, a, c) 拟合曲线。

所以我将有一个单一的情节:

10.csv - 拟合曲线 20.csv - 拟合曲线 30.csv - 拟合曲线 40.csv - 拟合曲线 50.csv - 拟合曲线

我希望问题得到解决。 任何帮助,将不胜感激。 谢谢

【问题讨论】:

【参考方案1】:

您是否正在努力实现这一目标?

# fit a line to the economic data
from numpy import sin
from numpy import sqrt
from numpy import arange
from pandas import read_csv
from scipy.optimize import curve_fit
from matplotlib import pyplot
import matplotlib.pyplot as plt

import numpy as np
import pandas as pd
import csv
from numpy import savetxt
from numpy import asarray


colors_list = ["black", "green", "red", "purple", "blue"]
types = ['ko', 'go', 'ro', 'mo', 'bo']
# define the fitting function
def func(x, a, c):
    return  a - 1/2 * np.exp(-(x - 1)/c)

plt.figure()
for i, v in enumerate(["10", "20", "30", "40", "50"]):
  csv = np.genfromtxt ('./'+v+'.csv', delimiter=",")

  x = csv[1:,1]
  y = csv[1:,-1]
  popt, pcov = curve_fit(func, x, y)
  r2 = round((1 - sum((func(x, *popt) - y) ** 2) / sum((y - np.mean(y)) ** 2)),4)
  print("R^2:", r2)
  a, c = popt

  
  plt.plot(x, y, types[i], label="Raw data_"+v)
  plt.plot(x, func(x, *popt), 'r-', alpha=.60, label="Fitted Curve_" + v, color=colors_list[i])
  plt.plot(x, y, color='none', label= "c = %.2f" % c)

plt.xlabel("x label")
plt.ylabel("y label")
plt.tight_layout()
plt.legend()
plt.show()

【讨论】:

嗨苏尔曼,感谢您的时间和回答。我试图得到这个。还有一件事,是否可以在盒子内插入“标签”,而不是在大盒子外面插入“标签”。就像每一行`颜色,行名和c = value`,我认为c值会自动打印出来。 请查看更新后的答案,这有帮助吗?

以上是关于在一个图中用指数方程拟合多个独立值的主要内容,如果未能解决你的问题,请参考以下文章

R进阶:缺失值的处理、拟合关系

急!MATLAB中用cftool工具数据拟合之后,拟合结果好坏判断

矩阵指数函数与常微分方程组求解

用python拟合直方图

曲线拟合,输入坐标值得到方程式

曲线拟合,输入坐标值得到方程式