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
相关产品推荐
相关产品推荐

