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

如何在ggplot2的geom_text中用bquote(frac)语法正确绘制分数?

在ggplot2中绘制分数形式的标签

原代码的问题在于bquote无法配合after_stat批量生成每个条形对应的数学表达式——bquote是单次求值逻辑,无法循环处理统计层输出的每个数据点,同时原代码中计算组内总和的方式也不符合ggplot统计层的分组逻辑。

以下是两种可行的解决方案:

方法一:提前预处理数据生成表达式

先计算每个分组的计数和组内总和,生成分数表达式字符串后再解析为数学表达式:

library(dplyr)
library(ggplot2)

set.seed(0)
DATA <- data.frame(
  x=sample(0:1,50,T),
  y=sample(LETTERS[1:2],50,T))

# 预处理计算分组计数、组内总和,生成分数表达式字符串
DATA_summary <- DATA %>%
  group_by(y, x) %>%
  summarise(count = n(), .groups = "drop") %>%
  group_by(y) %>%
  mutate(total = sum(count),
         label_expr = paste0("frac(", count, ",", total, ")")) %>%
  ungroup()

# 绘图
ggplot(DATA_summary, aes(x = x, y = count/total)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = parse(text = label_expr)),
            vjust = -.1, color = "black", size = 2) +
  facet_grid(vars(y))

方法二:在统计层动态生成表达式

无需预处理数据,直接在geom_text中利用after_stat生成表达式字符串并解析,同时通过group参数确保组内总和按分面面板计算:

library(ggplot2)

set.seed(0)
DATA <- data.frame(
  x=sample(0:1,50,T),
  y=sample(LETTERS[1:2],50,T))

ggplot(DATA) +
  aes(x = x, y = after_stat(count / sum(count))) +
  geom_bar() +
  geom_text(
    aes(
      y = after_stat(count / sum(count)),
      label = after_stat(parse(text = paste0("frac(", count, ",", sum(count), ")")))
    ),
    vjust = -.1, color = "black", size = 2,
    stat = "count",
    group = after_stat(PANEL) # 确保sum(count)按每个分面面板计算
  ) +
  facet_grid(vars(y))

关键说明

  • parse(text = ...)可以将字符串形式的数学表达式(如"frac(12,25)")转换为ggplot可识别的数学表达式,从而渲染成分数格式。
  • 方法二中的group = after_stat(PANEL)是核心:它让sum(count)的计算范围限定在当前分面面板内,和原代码的逻辑保持一致。

内容的提问来源于stack exchange,提问作者Simon Harmel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:57:34