如何在geom_jitter绘图中添加显示数据点数量的文本标签?
问题描述
我用ggplot绘制了一幅geom_jitter图,x轴是分类变量,y轴是连续变量。想在每个x轴类别对应的y轴最大值上方,标注该类别包含的数据点总数(也就是table(my_df$my_categorical_var)的输出结果)。
我尝试的代码:
+geom_text(aes(x= my_categorical_var), y= max(my_continuous_var), label=as.vector(my_df$my_categorical_var))
运行后报错:
Error in `geom_text()`: ! Problem while computing aesthetics. ℹ Error occurred in the 2nd layer. Caused by error in `check_aesthetics()`: ! Aesthetics must be either length 1 or the same as the data (20996) ✖ Fix the following mappings: `label`
报错提示要么为每个标签单独创建geom_text,要么给数据框加新列存目标数值,但我想找更简便的实现方法。期望效果是每个类别顶部带有数据点数量的标签。
解决方案
方法1:用stat_summary直接计算标注
stat_summary能在ggplot内部按x轴分类自动计算统计量,不用额外处理数据框,直接生成标签:
ggplot(my_df, aes(x = my_categorical_var, y = my_continuous_var)) + geom_jitter() + stat_summary( fun.y = max, # 提取每个类别的y轴最大值 fun.ymax = function(y) max(y) * 1.05, # 把标签放在最大值上方5%的位置,避免和散点重叠 geom = "text", aes(label = after_stat(n)), # after_stat(n)就是该类别的数据点总数 size = 4 )
方法2:用dplyr快速生成统计数据后标注
如果觉得stat_summary不够直观,用dplyr一行代码生成每个类别的最大值和样本量,再传给geom_text:
library(dplyr) ggplot(my_df, aes(x = my_categorical_var, y = my_continuous_var)) + geom_jitter() + geom_text( data = my_df %>% group_by(my_categorical_var) %>% summarise(y = max(my_continuous_var) * 1.05, count = n()), aes(y = y, label = count), size = 4 )
这种方式灵活性更高,方便调整标签的位置和样式。
方法3:统一位置标注(简单快捷)
如果不需要严格对应每个类别的y轴最大值,只是想在每个类别上方统一位置标注数量,可以用stat_count:
ggplot(my_df, aes(x = my_categorical_var, y = my_continuous_var)) + geom_jitter() + stat_count( geom = "text", aes(label = after_stat(count)), y = max(my_df$my_continuous_var) * 1.1, # 固定在全局最大值上方10%处 size = 4 )
内容的提问来源于stack exchange,提问作者Pau Clavell-Revelles
相关产品推荐
相关产品推荐

