如何用Matplotlib绘制起始时间不同的两条曲线
问题解决:调整干预曲线的起始时间至500处
要实现红色干预曲线从时间500开始,需基于无干预模型在t=500时的状态作为干预模型的初始条件,而非使用初始的U0、I0等值,同时调整红色曲线的时间轴范围。以下是具体修改步骤和代码:
修改思路
- 将时间轴拆分为两段:
t1(0到500)用于计算无干预模型的演化,t2(500到1000)用于计算干预模型的演化 - 提取无干预模型在
t=500时的状态,作为干预模型的初始输入 - 分别计算两段模型的积分结果,再对应绘制曲线
修改后的完整代码
import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # Total population, N. N = 1 # Initial number of infected and recovered individuals, I0 and R0. I0, R0 = 0.001, 0 # Everyone else, S0, is susceptible to infection initially. U0 = N - I0 - R0 J0 = I0 Lf0, Ls0 = 0, 0 # Contact rate, beta, and mean recovery rate, gamma, (in 1/days). beta, gamma = 8, 0.4 int_gamma = 0.8 mu, muTB, sigma, rho = 1/80, 1/6, 1/6, 0.03 u, v, w = 0.88, 0.083, 0.0006 # 拆分时间轴:第一段0-500,第二段500-1000 t1 = np.linspace(0, 500, 500 + 1) t2 = np.linspace(500, 1000, 500 + 1) # 无干预模型微分方程 def deriv(y, t, N, beta, gamma, mu, muTB, sigma, rho, u, v, w): U, Lf, Ls, I, R, cInc = y b = (mu * (U + Lf + Ls + R)) + (muTB * I) lamda = beta * I clamda = 0.2 * lamda dU = b - ((lamda + mu) * U) dLf = (lamda*U) + ((clamda)*(Ls + R)) - ((u + v + mu) * Lf) dLs = (u * Lf) - ((w + clamda + mu) * Ls) dI = w*Ls + v*Lf - ((gamma + muTB + sigma) * I) + (rho * R) dR = ((gamma + sigma) * I) - ((rho + clamda + mu) * R) cI = w*Ls + v*Lf + (rho * R) return dU, dLf, dLs, dI, dR, cI # 计算无干预模型到t=500的结果 solve = odeint(deriv, (U0, Lf0, Ls0, I0, R0, J0), t1, args=(N, beta, gamma, mu, muTB, sigma, rho, u, v, w)) U, Lf, Ls, I, R, cInc = solve.T # 获取t=500时的状态,作为干预模型的初始条件 initial_int_state = solve[-1] # 干预模型微分方程 def derivint(y, t, N, beta, int_gamma, mu, muTB, sigma, rho, u, v, w): U, Lf, Ls, I, R, cInc = y b = (mu * (U + Lf + Ls + R)) + (muTB * I) lamda = beta * I clamda = 0.2 * lamda dU = b - ((lamda + mu) * U) dLf = (lamda*U) + ((clamda)*(Ls + R)) - ((u + v + mu) * Lf) dLs = (u * Lf) - ((w + clamda + mu) * Ls) dI = w*Ls + v*Lf - ((int_gamma + muTB + sigma) * I) + (rho * R) dR = ((int_gamma + sigma) * I) - ((rho + clamda + mu) * R) cI = w*Ls + v*Lf + (rho * R) return dU, dLf, dLs, dI, dR, cI # 基于t=500的状态计算干预模型在500-1000的结果 solveint = odeint(derivint, initial_int_state, t2, args=(N, beta, int_gamma, mu, muTB, sigma, rho, u, v, w)) Uint, Lfint, Lsint, Iint, Rint, cIncint = solveint.T # 计算差分 J_diff = cInc[1:] - cInc[:-1] J_diffint = cIncint[1:] - cIncint[:-1] # 绘图 fig = plt.figure(facecolor='w') ax = fig.add_subplot(111, facecolor='#dddddd', axisbelow=True) # 绘制无干预曲线(0-500) ax.plot(t1[1:], J_diff*100000, 'blue', alpha=1, lw=2, label='incidence') # 绘制干预曲线(500-1000) ax.plot(t2[1:], J_diffint*100000, 'red', alpha=1, lw=2, label='intervention incidence') ax.set_xlabel('Time in years') ax.set_ylabel('Number') ax.grid(b=True, which='major', c='w', lw=2, ls='-') legend = ax.legend() legend.get_frame().set_alpha(0.5) plt.show()
说明
- 红色曲线现在从时间500开始,并且继承了无干预模型在该时间点的所有状态,符合“平稳状态后开始干预”的需求
- 两段时间轴的长度均为500个时间单位,和需求一致
内容的提问来源于stack exchange,提问作者Landon
相关产品推荐
相关产品推荐

