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

R语言ggplot2中geom_text()结合变量实现斜体的问题

解决ggplot2中geom_text显示斜体'n='+观测数的问题及自动统计优化

一、实现斜体'n='的正确方式

之前用substitute或expression报错,是因为在geom_text的label参数里直接调用这些函数无法正确解析变量。正确做法是用paste0生成带表达式规则的字符串,再开启parse=TRUE参数让ggplot自动解析表达式:

修改原代码中geom_text部分:

geom_text(aes(label = ifelse(v4>0, paste0("italic(n) == ", v4), NA), y=500), 
          position=position_dodge(width=0.75), 
          vjust=-0.25, hjust=0,
          parse=TRUE)  # 关键:开启表达式解析

paste0("italic(n) == ", v4)会生成类似italic(n) == 4的字符串,parse=TRUE会把italic(n)解析成斜体的'n',==显示为等于号,刚好实现「斜体n=+数值」的效果。

二、自动统计观测数的优化方案

手动维护v4效率极低且容易出错,推荐用dplyr按分组自动统计观测数,再整合到绘图流程中:

完整优化代码

library(dplyr)
library(ggplot2)  

# 原始数据
v1 <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2)
v2 <- c(0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2)
v3 <- c(13,67,89,280,40,1,23,99,32,1,75,280,270,200,196,450,320,277,23,4,1,2,5,89,45,23,11,1,3,23,100,100,100,100,100,200,100,11,6,6,123,100,100,100,100,100,12,86,11,390,75,100,110,19,299,100,100,100,100,100,100,100,100,11,100,120,110,100,100,423,100,279,100,100,100,12,100,100,75,5,10,10,10,10,10)

# 生成数据集并转换因子
summary_df <- data.frame(v1, v2, v3) %>%
  mutate(across(c(v1, v2), as.factor))

# 按v1、v2分组自动统计观测数
count_df <- summary_df %>%
  group_by(v1, v2) %>%
  summarise(n = n(), .groups = "drop")

# 绘图:原数据画点图,统计数据加标注文本
ggplot(summary_df, aes(x = v1, y = v3, fill = v2)) + 
  geom_dotplot(binaxis  = "y", stackdir = "center", binwidth = 5, 
               position = position_dodge(0.75), dotsize = 1) +
  geom_text(data = count_df, aes(x = v1, y = 500, label = paste0("italic(n) == ", n)),
            position = position_dodge(width=0.75), vjust=-0.25, hjust=0,
            parse=TRUE)

优化点说明

  • 用group_by(v1, v2) %>% summarise(n = n())自动统计每组观测数,彻底替代手动维护的v4
  • 单独使用统计后的count_df作为geom_text的数据源,避免原数据重复行导致文本重复显示
  • 保持parse=TRUE实现斜体'n='的显示效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:50:00