【问题标题】:Issue with plot and fitting data from a csv file in python using scipy使用 scipy 在 python 中绘制和拟合来自 csv 文件的数据的问题
【发布时间】:2022-01-26 11:54:01
【问题描述】:

我很新学习如何使用 python,我遇到了这个问题。 我需要从 csv 文件中绘制一些数据并对其拟合高斯曲线。但由于某种原因,拟合只是一条直线。

这是我的代码

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import scipy.optimize as opt
from scipy.optimize import curve_fit
data = pd.read_csv('DRXRed.csv',delimiter=",", names=['2T', 'I'])
plt.xlabel('2\u03B8[Grados]')
plt.ylabel('Intensidad[u.a]')
plt.title('Pico Máximo Difractograma Sr\u2082bCoO\u2086')
plt.grid(visible=True)
def Gauss(x, A, B):
    y = A*np.exp(-1*B*x**2)+2000
    return y
parameters, covariance = curve_fit(Gauss, data['2T'],data['I'])
fit_A = parameters[0]
fit_B = parameters[1]
fit_y = Gauss(data['2T'], fit_A, fit_B)
print(fit_A)
print(fit_B)
plt.plot(data['2T'], data['I'],color="r", label='data')
plt.plot(data['2T'], fit_y, '-', label='fit')
plt.savefig('Pico.png', dpi=1080)

这是我的功能

它向我显示了这个警告,但我不知道它是什么意思

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/scipy/optimize/minpack.py:833: OptimizeWarning: Covariance of the parameters could not be estimated
  warnings.warn('Covariance of the parameters could not be estimated',
1.0
1.0

如果有任何帮助,我将不胜感激 :)

【问题讨论】:

  • 也许this post 可以解决您的问题
  • 我认为您的主要问题是您修复了 1) 高斯偏差。 2)中心。您将中心固定为 0。尝试在任何地方使用 data['2T'] -32。这是一个解决方法,看看这是否是问题所在,如果你看到一些曲线接近高斯拟合,那么你将不得不修改你的高斯函数以至少为中心获取一个参数。 A*np.exp(-1*B*(x-C)**2)+2000

标签: python pandas scipy


【解决方案1】:

玩了一会儿可以断定问题是:

  1. 您需要考虑 x 坐标的中心。
  2. 您必须进行一些初步猜测。

创建一个玩具数据可以用来玩它以获得良好的结果:


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

# toy data
x = np.arange(28,36,0.01)
y = 5600 * np.exp(-2*(x-32)**2) + 1900 + 80*np.random.randn(len(x))
#plt.plot(x,y)


plt.xlabel('2\u03B8[Grados]')
plt.ylabel('Intensidad[u.a]')
plt.title('Pico Máximo Difractograma Sr\u2082bCoO\u2086')
#plt.grid(visible=True)

#acá agregué un parámetro C
def Gauss(x, A, B,C):
    y = A*np.exp(-1*B*(x-C)**2)+2000
    return y


#condiciones iniciales
#a0 es la amplitud, 
#b0 sería el ancho como desvío estandar, 
#c0 el centro en x

a0 = y.max()-y.min()

max_idx = np.argmax(y)
b0 = abs(max_idx - np.argmin((y-0.7*y.max())**2)) #i'm not sure this is a good guess but  it works

c0 = x[max_idx]

par0 = [a0,b0,c0]


parameters, covariance = curve_fit(Gauss, x,y,p0=par0)
#fit_A = parameters[0]
#fit_B = parameters[1]
fit_y = Gauss(x, *parameters)
#print(fit_A)
#print(fit_B)
plt.plot(x, y,color="r", label='data')
plt.plot(x,a0*np.exp(-b0*(x-c0)**2)+2000,color="b", label='initial_guess')

plt.plot(x, fit_y, '--k', label='fit')
plt.legend()

这样得到这个结果:

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2012-02-09
    • 2011-12-22
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    相关资源
    最近更新 更多