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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:21:03