如何在R的ggplot2中为风玫瑰图添加倾斜对齐的独立图例标签
在ggplot2中实现风玫瑰图独立图例的倾斜标签
可以实现。在coord_polar()坐标系下,直接设置axis.text.x的angle参数无法自动匹配每个类别的弧度方向,需要手动计算每个标签的旋转角度,并配合hjust和vjust调整对齐方式,让标签沿着对应类别的径向倾斜,同时避免超出绘图区域。
修改后的完整代码
library(ggplot2) library(RColorBrewer) library(dplyr) nb.cols <- 18 mycolors <- colorRampPalette(brewer.pal(8, "Set2"))(nb.cols) df <- data.frame(x=1, y=1:18) NCP <- c("Maintenance of options", "Food and feed", "Materials, companionship and labor", "Medicinaland genetic resources", "Energy", "Physical and psychological experiences", "Supporting identities", "Learning and inspiration", "Formation of soils and sediments", "Regulation of hazards and extreme events", "Regulation of freshwater quantity", "Regulation of freshwater quality", "Regulation of climate", "Habitat creation and maintenance", "Regulation of biological processes", "Pollination and dispersal of seeds", "Regulation of air quality", "Regulation of ocean acidification") df <- cbind(df, as.data.frame(NCP)) # 计算每个标签的旋转角度、hjust和vjust df <- df %>% mutate( # 每个类别占据的角度(360/18=20度),计算中心角度 angle = (row_number() - 1) * (360 / nb.cols) + (360 / nb.cols)/2, # 调整角度,让文字在不同方向都可读(90-270度区间的文字翻转180度) text_angle = ifelse(angle > 90 & angle < 270, angle + 180, angle), # 对应调整hjust和vjust hjust = ifelse(angle > 90 & angle < 270, 1, 0), vjust = ifelse(angle > 0 & angle < 180, 0.5, 0.5) ) # 绘制带倾斜标签的独立图例 ggplot(df, aes(x = NCP, y = x)) + geom_col(width = 1, fill = mycolors) + coord_polar(start = 0) + theme( panel.grid.major = element_blank(), axis.line = element_blank(), plot.background = element_blank(), panel.background = element_blank(), axis.title = element_blank(), axis.ticks.y = element_blank(), axis.text.y = element_blank(), # 使用计算好的角度、hjust、vjust设置标签 axis.text.x = element_text( colour = "Black", size = 6, angle = df$text_angle, hjust = df$hjust, vjust = df$vjust ), panel.ontop = FALSE )
关键说明
- 角度计算:每个类别对应一个中心角度,基于18个类别平分360度得到。对于处于90-270度区间的标签,将其旋转角度加180度,保证文字正向可读,不会倒转。
- 对齐调整:配合
hjust和vjust参数,让标签沿着径向方向准确对齐到对应类别的外侧,避免偏移或超出绘图区域。
内容的提问来源于stack exchange,提问作者Moa
相关产品推荐
相关产品推荐

