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

matplotlib绘制四季风玫瑰子图出现AttributeError及空白图问题求助

问题说明

你想要在同一张画布上绘制一年四个季节的风玫瑰子图,参考相关方法编写代码后运行报错AttributeError: 'Rectangle' object has no property 'normed',且仅输出四张空白散点图,无法生成目标风玫瑰图,核心原因有两点:

  1. 坐标轴类型不匹配:plt.subplots()默认生成普通笛卡尔坐标系坐标轴,仅支持常规图表参数,无法识别风玫瑰图专属的normed、nsector等参数,调用普通bar方法就会触发属性不存在的报错
  2. 变量覆盖问题:你先声明的WindroseAxes对象被后续plt.subplots()返回的普通坐标轴数组直接覆盖,完全没有生效

修正后的可运行代码

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from windrose import WindroseAxes

# 此处省略你的df读取和日期时间索引设置代码
df = df.between_time('8:00', '21:00') # 筛选白天数据
# 季节筛选改为正向筛选,逻辑更清晰不易出错
spring = df[df.index.month.isin([3,4,5])] 
summer = df[df.index.month.isin([6,7,8])]
fall = df[df.index.month.isin([9,10,11])]
winter = df[df.index.month.isin([1,2,12])]

ws_list = [spring.ws_5408, summer.ws_5408, fall.ws_5408, winter.ws_5408]
wd_list = [spring.dir_5408, summer.dir_5408, fall.dir_5408, winter.dir_5408]
season_names = ['春季', '夏季', '秋季', '冬季']

# 关键:创建子图时指定投影类型为windrose,生成风玫瑰专属坐标轴
fig, axes = plt.subplots(2, 2, subplot_kw={'projection': 'windrose'}, figsize=(12,10))
axes = axes.flatten() # 展平2x2坐标轴数组,方便循环处理

for i in range(4):
    axes[i].bar(wd_list[i], ws_list[i], normed=True, opening=0.8, edgecolor='white', 
                bins=np.arange(0, 15, 3), cmap=cm.rainbow, nsector=20)
    axes[i].set_title(season_names[i], fontsize=14)

# 统一添加图例
axes[-1].set_legend(decimal_places=1, units='m/s', fontsize='x-large', loc='best')
plt.tight_layout() # 自动调整子图间距避免遮挡
plt.show()

补充说明

如果运行时仍提示normed参数不存在,可以将代码中normed=True替换为density=True,适配不同版本的windrose库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:09:03