You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:06:02