从Python绘制函数
这是我最近一个问题的直接延续,之前的问题在这里已经解决了。为了保持完整性,我在这里重新发布代码:
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
我通常会参考这个链接来绘制函数,或者参考这个链接来处理数据文件。不过现在,我需要用popt
给出的数据来绘制这个函数(a+b*x+c*x**3
)。我还需要把它们保存为pdf或png格式。
请帮我实现这个功能。
2 个回答
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版本下,得到的结果是:
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])
,不过前者是更符合 Python 风格的写法,能达到同样的效果。
如果你需要将当前的图像保存为图片,可以使用 plt.savefig
。