如何修改R语言ggplot饼图的字体族、标签位置及图例排序规则
ggplot饼图需求解决方案
1. 全局字体修改为Arial Narrow
在theme()配置中新增text参数指定字体族即可,所有图表文本(标题、图例、标签等)会统一应用该字体:
theme( # 原有配置保留,新增下面这行 text = element_text(family = "Arial Narrow"), axis.line = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), plot.title = element_text(hjust = 0.5, color = "#666666") )
如果Windows系统识别不到该字体,可以先安装extrafont包导入系统字体后再使用。
2. 百分比标签向外侧移动
原标签x轴位置默认是1(对应饼图圆心到边缘的距离),只需在geom_text的aes中手动设置更大的x值即可向外偏移,同时可搭配xlim()扩大横轴范围避免标签被截断:
# 修改后的geom_text代码,x设为1.2可按需调整大小 geom_text(aes(x = 1.2, label = paste0(round(share), "%")), position = position_stack(vjust = 0.5), size=5, col="white") + # 新增x轴范围限制,避免标签超出画布 xlim(c(0, 1.5)) +
3. 图例默认排序逻辑说明
ggplot的分类变量默认排序规则是按因子水平的先后顺序排列:
- 你的代码中
causes列是字符类型,ggplot会自动将其转换为因子,默认因子水平按字符的字母顺序排序(即a < b < c < d < other),因此图例不会按占比大小排序。 - 如果需要按占比从大到小排序,需手动将
causes转换为有序因子,水平按share降序排列即可:
# 数据预处理阶段新增这行即可 mydf$causes <- factor(mydf$causes, levels = mydf$causes[order(-mydf$share)])
注意你原代码中的guides(fill = guide_legend(reverse = TRUE))会反转图例顺序,调整排序后可以按需删除或保留该行。
修改后完整可运行代码
library(ggplot2) mydf <- data.frame( causes=c("a", "b", "c", "d", "other"), freq=c(100, 80, 78, 75, 120), share= 100*c(100/sum(freq), 80/sum(freq), 78/sum(freq), 75/sum(freq), 120/sum(freq)) ) # 按占比降序设置因子水平,调整图例顺序 mydf$causes <- factor(mydf$causes, levels = mydf$causes[order(-mydf$share)]) ggplot(mydf, aes("", share, fill = causes)) + geom_bar(width = 1, size = 1, color = "white", stat = "identity") + coord_polar("y") + # x=1.2将标签向外偏移,按需调整数值 geom_text(aes(x = 1.2, label = paste0(round(share), "%")), position = position_stack(vjust = 0.5), size=5, col="white") + # 扩大x轴范围避免标签截断 xlim(c(0, 1.5)) + labs(x = NULL, y = NULL, fill = NULL, title = "leading causes of death in US") + # 若不需要反转图例可删除下一行 guides(fill = guide_legend(reverse = TRUE)) + scale_fill_manual(values = c("#003B6D", "#6699CC", "#BDBDBD", "#676767", "#EBEDF3")) + theme_classic() + theme( # 全局设置字体为Arial Narrow text = element_text(family = "Arial Narrow"), axis.line = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), plot.title = element_text(hjust = 0.5, color = "#666666") )
内容的提问来源于stack exchange,提问作者Mathica
相关产品推荐
相关产品推荐

