如何在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
相关产品推荐
相关产品推荐

