如何绘制按月份分箱的单站点逐日降水量直方图?
降水量直方图绘制方案
一、基础全年降水量直方图
不管你的precip是numpy数组还是带时间坐标的xarray一维DataArray,都可以用以下两种方法绘制:
方法1:Matplotlib原生绘制
import matplotlib.pyplot as plt # 绘制直方图,可调整bins数量控制区间粒度 plt.figure(figsize=(10, 6)) plt.hist(precip, bins=20, edgecolor='black', alpha=0.7) plt.xlabel('降水量 (mm)') plt.ylabel('天数') plt.title('全年降水量分布直方图') plt.show()
方法2:Xarray内置绘图(保留元数据)
如果precip是从原DataArray提取后保留了坐标的一维数组,用xarray的内置方法更便捷:
import xarray as xr precip.plot.hist(bins=20, edgecolor='black', figsize=(10, 6)) plt.xlabel('降水量 (mm)') plt.title('全年降水量分布直方图') plt.show()
二、按月份分箱的直方图
要实现分月直方图,需要利用原数据的time坐标进行分组,以下两种展示方式供选择:
方式1:分张子图展示各月分布
import matplotlib.pyplot as plt import xarray as xr # 重新提取带time坐标的单站点数据(确保保留时间维度) precip_daily = da.sel(lat=20.12, lon=230.1, method='nearest') # 替换为你的目标经纬度 month_groups = precip_daily.groupby('time.month') # 构建3行4列的子图布局 fig, axes = plt.subplots(3, 4, figsize=(16, 12)) axes = axes.flatten() month_names = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'] # 遍历每个月份的数据绘制直方图 for idx, (month_num, monthly_data) in enumerate(month_groups): ax = axes[idx] ax.hist(monthly_data, bins=15, edgecolor='black') ax.set_title(f'{month_names[idx]} 降水量分布') ax.set_xlabel('降水量 (mm)') ax.set_ylabel('天数') plt.tight_layout() plt.show()
方式2:重叠直方图对比各月分布
import matplotlib.pyplot as plt import xarray as xr precip_daily = da.sel(lat=20.12, lon=230.1, method='nearest') month_groups = precip_daily.groupby('time.month') plt.figure(figsize=(12, 8)) month_names = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'] # 每个月份用不同颜色绘制,alpha控制透明度 for month_num, monthly_data in month_groups: plt.hist(monthly_data, bins=15, edgecolor='black', alpha=0.6, label=month_names[month_num-1]) plt.xlabel('降水量 (mm)') plt.ylabel('天数') plt.title('各月份降水量分布对比') plt.legend(loc='upper right') plt.show()
内容的提问来源于stack exchange,提问作者kjmw
相关产品推荐
相关产品推荐

