从Python绘制函数

0 投票
2 回答
1198 浏览
提问于 2025-04-17 22:48

这是我最近一个问题的直接延续,之前的问题在这里已经解决了。为了保持完整性,我在这里重新发布代码:

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

撰写回答