R语言ggplot2中使用facet_wrap时如何访问当前分面的因子
解决方法
场景1:每个数据点显示对应分面的am值
直接将label = am放入aes()映射中即可。因为分面是按am分组的,每个分面内的am值统一,所以所有标签都会显示对应分面的0或1:
ggplot(mtcars, aes(x = as.factor(cyl), y = hp)) + geom_boxplot() + facet_wrap( ~ am) + geom_text(aes(label = am))
场景2:每个分面仅显示一个统一标签
如果不需要每个点都显示标签,只想在分面的固定位置放一个统一的am值标签,可以单独构造标签数据集:
# 构造标签数据,指定显示位置(可根据需求调整x/y值) label_df <- mtcars %>% dplyr::group_by(am) %>% dplyr::summarize( x = as.factor(median(cyl)), # 选x轴中间位置 y = max(hp) + 15 # 选y轴上方,避免遮挡箱线图 ) ggplot(mtcars, aes(x = as.factor(cyl), y = hp)) + geom_boxplot() + facet_wrap(~ am) + geom_text(data = label_df, aes(x = x, y = y, label = am), size = 5)
替代方案:用stat_summary自动分组
不想额外构造数据集的话,也可以用stat_summary按分面分组获取am值:
ggplot(mtcars, aes(x = as.factor(cyl), y = hp)) + geom_boxplot() + facet_wrap(~ am) + stat_summary( geom = "text", fun = function(x) max(x) + 10, # 设定标签的y坐标 aes(label = am), size = 5 )
为什么直接传am或.$am不行?
当你写geom_text(label = am)时,label是作为固定参数传入的,不会关联数据集的变量;只有将label放入aes()内部,ggplot才会把它映射为数据变量,配合分面的分组逻辑,自动在每个分面显示对应的值。
内容的提问来源于stack exchange,提问作者Pablo Pretzel
相关产品推荐
相关产品推荐

