[英]How to get data points after plot it? (Python)
我只是用 scipy.odeint 来求解 diff_equation 系统,并使用 matplotlib 到 plot 它。 我得到了图表。 我的问题是我可以得到一些特定的数据点,比如当 t = 1 时,x1、x2、x3 是多少。 我需要当 t = 1,2,3,4... 时,浓度值是多少。 谢谢你。
import matplotlib.pyplot as plt
from scipy.integrate import odeint
Dose = 100
V = 43.8
k12 = 1.2 # rate of central -> peripheral
k21 = 1.4 # rate of peripheral -> central
kel = 0.20 # rate of excrete from plasma
def diff(d_list, t):
x1, x2, x3, = d_list
# X1(t), X2(t), X3(t)
return np.array([(-k12*x1-kel*x1+k21*x2),
(k12*x1-k21*x2),
(kel*x1)])
t = np.linspace(0, 24, 960)
result = odeint(diff, [(Dose/V), 0, 0], t)
plt.plot(t, result[:, 0], label='x1: central')
plt.plot(t, result[:, 1], label='x2: tissue')
plt.plot(t, result[:, 2], label='x3: excreted')
plt.legend()
plt.xlabel('t (hr)')
plt.ylabel('Concentration (mg/L)')
plt.show()
这与 matplotlib 或 scipy 无关。您可以插值或获取最近的数据点。
插值
如果您需要获取不对应于数据点的t
值的x1
、 x2
和x3
(您提到的 1,2,3,4 不在您的t
数组中),您将需要进行插值。 要在t=1
处获取x1
、 x2
和x3
,您可以这样做(在脚本末尾):
valuesAt1 = [np.interp(1, t, result[:,col]) for col in range(result.shape[1])]
print(valuesAt1)
的 output 则为:
[1.1059703843218311, 0.8813129004034452, 0.2958217381057726]
如果你只需要x1
,就做
valuesAt1 = np.interp(1, t, result[:,0])
然后, output 的print(valuesAt1)
是:
1.1059703843218311
最近的数据点
如果您不想进行插值,但想要x1
、 x2
和x3
的值作为最接近 1 的t
数组元素的值,请执行以下操作:
valuesAtClosestPointFrom1 = result[ np.argmin(np.abs(t-1))]
来自print(valuesAtClosestPointFrom1)
的 output 是:
[1.10563546 0.88141641 0.29605315]
这可以通过插值和使用scipy.interpolate.InterpolatedUnivariateSpline
来完成,如下所示:
from scipy.interpolate import InterpolatedUnivariateSpline
splx1 = InterpolatedUnivariateSpline(t, result[:,0])
splx2 = InterpolatedUnivariateSpline(t, result[:,1])
splx3 = InterpolatedUnivariateSpline(t, result[:,2])
首先,您需要传递要插值的 x 和 y 数据。 其次,为 x 创建一个列表,您需要为其获取所需的 y 值。
import numpy as np
desired_time = np.arange(1,25)
x1 = splx1(desired_time)
x2 = splx2(desired_time)
x3 = splx3(desired_time)
最后,将其传递给相应的样条 object 以获得所需的值。 例如,使用np.arange
创建一个从1
到24
的desired_time
数组,并将其传递给上例中的样条对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.