如何在ggplot2饼图外侧添加刻度与标注文本
解决ggplot2饼图外侧添加刻度与标注的问题
以下是调整后的代码,能实现你想要的外侧刻度+对应标注的效果:
library(ggplot2) library(dplyr) # 准备数据,计算每个类别的位置参数 cars <- data.frame(category = c("civic", "MG", "Suzuki", "Tesla"), count = c(14810, 6457, 18233, 571), percentage = c(37,16,46,1)) %>% arrange(desc(category)) %>% # 排序保证累积计算正确 mutate( y_start = cumsum(lag(count, default = 0)), # 每个类别起始位置 y_mid = y_start + count/2, # 每个类别中点位置(用于对齐刻度和标签) y_end = y_start + count # 每个类别结束位置 ) ggplot(cars, aes(x = 1, y = count, fill = category)) + # 绘制饼图主体 geom_bar(stat = "identity", width = 1, alpha = 0.5, color = "black") + # 绘制外侧径向刻度线 geom_segment(aes(x = 1, xend = 1.1, y = y_mid, yend = y_mid), color = "black") + # 绘制外侧百分比标签 geom_text(aes(x = 1.2, y = y_mid, label = paste0(percentage, "%")), size = 4.5, family = "serif", color = "black") + # 转换为极坐标(饼图) coord_polar("y", start = 0) + # 设置填充色(替换原无效的scale_color_gradientn) scale_fill_manual(values = rainbow(4)) + # 调整标签和图例 labs(fill = "Category") + # 清理主题并调整图例位置 theme_void() + theme( legend.position = "right", text = element_text(family = "serif", colour = "black") )
关键修改说明:
- 数据预处理:通过
dplyr计算每个类别的起始、中点位置,确保刻度和标签能精准对齐到每个扇形的中心线上 - 替换标注方式:去掉
ggrepel的自动偏移,改用固定x位置的geom_text,让标签稳定在刻度外侧 - 添加刻度线:用
geom_segment手动绘制径向短线,对应每个扇形的中线 - 修正配色:把无效的
scale_color_gradientn换成针对fill美学的scale_fill_manual,匹配饼图的填充色
内容的提问来源于stack exchange,提问作者Mendel
相关产品推荐
相关产品推荐

