Python中SIR模型ODE求解结果特定时间点单日数据绘图问题
错误原因
plot函数要求输入的x、y序列长度一致,你传入的x是长度为160的完整时间序列t,但y仅传入了第80天的单值,二者维度不匹配因此报错。
实现步骤
1. 计算单日新增康复数据
# 计算全周期每日新增康复,np.diff会计算相邻两个值的差,结果长度为159,对应第1天到第159天的新增 daily_new_recover = np.diff(R) # 单独取第80天的单日新增:注意数组索引从0开始,第79天对应索引78、第80天对应索引79,差值即为第80天的新增 day80_new_recover = R[79] - R[78]
2. 按需求绘制数据
分为两种常用场景:
- 场景1:仅标记第80天的新增康复点
直接用scatter绘制单点即可,也可以用plot传入等长的x、y:# 第80天对应的时间点为t[79],标记为绿色圆点 ax.scatter(t[79], day80_new_recover, c='green', s=60, label='第80天新增康复') - 场景2:绘制全周期每日新增康复曲线
因为差分后的新增序列长度为159,需要把x序列也截断为对应长度:# 新增序列对应t[1:](第1天到第159天) ax.plot(t[1:], daily_new_recover, 'g', lw=2, label='每日新增康复')
优化建议
如果要把新增康复曲线和原有累计曲线放在同一张图,二者数值范围差距较大,建议使用双y轴避免新增曲线被压缩:
# 新增右侧y轴 ax2 = ax.twinx() ax2.plot(t[1:], daily_new_recover, 'g', lw=2, label='每日新增康复') ax2.set_ylabel('每日新增人数') # 合并两个轴的图例 lines1, labels1 = ax.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax.legend(lines1 + lines2, labels1 + labels2, loc='upper right')
内容的提问来源于stack exchange,提问作者Landon
相关产品推荐
相关产品推荐

