如何将日度河流流量数据按年份绘制月度均值对比折线图
问题原因
你两次运行未得到预期结果的核心问题如下:
- 第一次报错是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
相关产品推荐
相关产品推荐

