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

如何将日度河流流量数据按年份绘制月度均值对比折线图

问题原因

你两次运行未得到预期结果的核心问题如下:

  • 第一次报错是x轴只有12个月份值,而传入的y是对应年份365/366天的日度流量,二者维度不匹配
  • 第二次绘图异常是因为你把布尔判断结果(DAT.index.year==1980返回的是True/False的布尔数组)作为y值传入,并非实际流量数据

解决方案

不需要手动拆分每年的数据集,直接用pandas的分组聚合能力计算每年各月的平均流量,再批量绘图即可,完整代码如下:

第一步:数据聚合(计算月均流量)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 你的原有数据读取代码不变
DAT = pd.read_excel('Modelled Discharge_UIB_1980-2013_Daily.xlsx',
                   sheet_name='Karhmong', header=None, skiprows=1,
                    names=['year', 'month', 'day', 'flow'],
                    parse_dates={ 'date': ['year', 'month', 'day'] },
                   index_col='date') 

# 按年、月分组计算流量平均值,得到每一年每一月的平均流量
monthly_flow = DAT.groupby([DAT.index.year, DAT.index.month])['flow'].mean().unstack(level=0)
# 处理后monthly_flow的行是1-12月,列是1980-2013各年份,值为对应月均流量

第二步:绘图代码

fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(12,6))

# 循环遍历每一年,批量绘制折线,不需要逐个年份手写plot代码
for year in monthly_flow.columns:
    ax.plot(monthly_flow.index, monthly_flow[year], label=str(year))

# 配置图表样式
ax.grid(True)
ax.set_title('Monthly River Indus Discharge Comparison 1980-2013')
ax.set_ylabel('Discharge (m³/s)')
ax.set_xlabel('Month')
ax.set_xlim(1, 12)
# 设置x轴刻度为1-12月
ax.set_xticks(range(1,13))
# 图例放在图外避免遮挡曲线
ax.legend(loc='upper left', bbox_to_anchor=(1, 1), ncol=2, fontsize=8)

plt.tight_layout()
plt.show()

如果你需要单独调整某一年的折线样式(比如颜色、线型),可以在循环里加判断条件单独设置即可。


内容的提问来源于stack exchange,提问作者grace11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 19:36:03