这是我最近的问题here的直接延续,已经解决了。 我在这里重新发布代码以及完整性:
import numpy as np
from scipy.optimize import curve_fit
xdata = np.array([0.1639534, 0.2411005, 0.3130353, 0.3788510, 0.4381247, 0.5373147, 0.6135673, 0.6716365, 0.7506711, 0.8000908, 0.9000000])
ydata =np.array ([7.1257999E-04,9.6610998E-04,1.1894000E-03,1.3777000E-03,1.5285000E-03,1.7297000E-03,1.8226000E-03,1.8422999E-03,1.7741000E-03,1.6574000E-03,1.1877000E-03])
def func (x,a,b,c):
return a+b*x+c*x**3
popt, pcov =curve_fit(func,xdata,ydata,p0=(1,1,1))
with open('5fit','w') as outfile:
outfile.write(' '.join(str(val) for val in popt))
现在,为了绘制这些数据,我使用gnuplot
,因为:
gnuplot> a=-5.20906980e-05
gnuplot> b=4.41458412e-03
gnuplot> c=-3.65246935e-03
gnuplot> p a+b*x+c*x**3 w l
我通常会按this来绘制函数或this来表示数据文件。
但现在,我需要使用a+b*x+c*x**3
给出的数据绘制该函数(popt
)。我还需要以pdf / png格式保存它们。
请帮助我这样做。
答案 0 :(得分:2)
您可以使用以下代码绘制数据和拟合函数。我在顶部导入了matplotlib.pyplot
(作为plt
),并使用了两个简单的图表来显示数据。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
xdata = np.array([0.1639534, 0.2411005, 0.3130353, 0.3788510, 0.4381247, 0.5373147, 0.6135673, 0.6716365, 0.7506711, 0.8000908, 0.9000000])
ydata =np.array ([7.1257999E-04,9.6610998E-04,1.1894000E-03,1.3777000E-03,1.5285000E-03,1.7297000E-03,1.8226000E-03,1.8422999E-03,1.7741000E-03,1.6574000E-03,1.1877000E-03])
def func (x,a,b,c):
return a+b*x+c*x**3
popt, pcov = curve_fit(func,xdata,ydata,p0=(1,1,1))
# Plot your original data
plt.plot(xdata, ydata, linestyle='None', marker='x', label='Data')
# Plot your fit using the xdata as x-values and func() to generate the y-values.
plt.plot(xdata, func(xdata, *popt), label='Fit')
plt.legend()
plt.show()
plt.savefig('image.png') # Save the figure.
func(xdata, *popt)
的使用可以替换为func(xdata, popt[0], popt[1], popt[2])
,但是实现相同目的的pythonic way越多。
plt.savefig
可用于保存当前图形。
答案 1 :(得分:1)
只是因为你提到了gnuplot:这是你如何使用gnuplot进行拟合和绘图:
将数据保存到文件data.txt
:
0.1639534 7.1257999E-04
0.2411005 9.6610998E-04
0.3130353 1.1894000E-03
0.3788510 1.3777000E-03
0.4381247 1.5285000E-03
0.5373147 1.7297000E-03
0.6135673 1.8226000E-03
0.6716365 1.8422999E-03
0.7506711 1.7741000E-03
0.8000908 1.6574000E-03
0.9000000 1.1877000E-03
并使用脚本:
set terminal pdfcairo
set output 'output.pdf'
f(x) = a+b*x+c*x**3
fit f(x) 'data.txt' via a,b,c
plot 'data.txt' with points, f(x) with lines
set output
版本4.6.3的结果是: