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

如何在R语言中基于12扇区风速数据绘制风玫瑰图(不使用plot_ly)

嘿,这事儿好办!你有12个扇区的风速参数(看起来是威布尔分布的A和k参数)和频率数据,不想用plot_ly的话,我给你两种靠谱的R语言方案:基础绘图系统手动实现,或者用专门做大气数据可视化的openair包,后者更省心。先把你的数据补全(你给的frequency没写完,我补了示例值,记得换成你真实的数据哈):

第一步:补全并整理数据
# 补全frequency列的示例数据,替换成你的真实值即可
DF <- structure(list(
  Sector = c("0-N", "1-NNE", "2-ENE", "3-E", "4-ESE", "5-SSE", 
             "6-S", "7-SSW", "8-WSW", "9-W", "10-WNW", "11-NNW"),
  A_parameter = c(4.84, 5.04, 5.05, 4.7, 4.41, 4.66, 5.76, 7.44, 6.92, 4.87, 4.39, 4.13),
  k_Parameter = c(2.24, 2.271, 2.115, 1.959, 1.779, 1.943, 2.01, 2.393, 2.326, 1.971, 1.908, 1.904),
  frequency = c(0.057, 0.08, 0.086, 0.071, 0.05, 0.062, 0.091, 0.123, 0.115, 0.098, 0.074, 0.093)
), class = "data.frame")
方案1:基础R绘图系统手动绘制风玫瑰图

如果不想额外装包,用基础R就能搞定,核心是把扇区转换成极坐标角度,用条形图的极坐标模式实现:

# 将扇区转换为极坐标弧度(注意R的极坐标默认正东为0,我们调整为正北开始逆时针旋转)
angles <- seq(90, 90 - 330, by = -30) * pi / 180

# 设置绘图边距,避免标签被截断
par(mar = c(3, 3, 2, 2))

# 绘制玫瑰图:条形长度对应频率,颜色对应A参数(威布尔尺度参数,和平均风速正相关)
barplot(DF$frequency, 
        width = rep(2*pi/12, 12),  # 每个扇区占30度
        space = 0,  # 扇区间不留空隙
        col = heat.colors(12)[order(DF$A_parameter)],  # 颜色区分A参数大小
        border = "white",  # 隐藏条形边框
        main = "风玫瑰图(频率+威布尔A参数)",
        polar = TRUE,  # 开启极坐标
        axes = FALSE)  # 隐藏默认坐标轴

# 添加扇区标签,放在每个扇区外侧
text(angles, max(DF$frequency)*1.1, labels = DF$Sector)

# 添加颜色图例,说明每个扇区的A参数值
legend("topright", 
       legend = paste0(DF$Sector, ": ", round(DF$A_parameter, 2)),
       fill = heat.colors(12)[order(DF$A_parameter)],
       cex = 0.7)  # 缩小图例文字,避免占空间
方案2:用openair包绘制专业风玫瑰图

openair是专门处理大气环境数据的R包,它的windRose函数做风玫瑰图特别顺手,自定义选项超多,不用手动处理角度:

# 先安装并加载openair包(如果没装过的话)
if (!require(openair)) install.packages("openair")
library(openair)

# 用威布尔参数计算每个扇区的平均风速:平均风速 = A * gamma(1 + 1/k)
DF$mean_wind <- DF$A_parameter * gamma(1 + 1/DF$k_Parameter)

# 构造openair需要的数据格式:指定每个扇区的中心风向、平均风速和频率
wind_data <- data.frame(
  ws = DF$mean_wind,
  wd = c(0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330),  # 12个扇区的中心风向角度(正北为0)
  freq = DF$frequency * 1000  # 放大频率值,方便openair处理汇总数据
)

# 绘制风玫瑰图:条形长度对应频率,颜色对应平均风速
windRose(wind_data, 
         ws = "ws", 
         wd = "wd",
         freq = "freq",
         main = "风玫瑰图(频率+平均风速)",
         col = viridis::viridis(12),  # 用viridis调色板,颜色更友好
         key.header = "平均风速(m/s)",
         key.footer = NULL,
         angle = 30)  # 每个扇区的角度宽度

你可以根据需求调整颜色、标题、图例位置等,比如想展示k参数的话,只需要把mean_wind换成k_Parameter就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:57:30