如何从ggplot组件包装器访问数据框?能否让geom_mean直接获取x映射列
无需传参即可访问x映射列的geom_mean()实现
当然可以实现,核心是利用ggplot默认的图层aes继承机制,结合after_stat()函数来获取x轴的映射变量,无需额外传递参数。
修改后的函数代码
geom_mean <- function() { list( # 利用after_stat(x)获取x映射的分组值,自动应用到填充属性 stat_summary( aes(fill = after_stat(x)), fun = "mean", geom = "bar" ), stat_summary(fun.data = "mean_cl_normal", geom = "errorbar", width = 0.4) ) }
原理说明
- ggplot的图层默认开启
inherit.aes = TRUE,意味着自定义图层会自动继承主绘图中设置的aes映射(比如这里的x轴变量)。 after_stat(x)可以在统计计算完成后,直接访问到x轴对应的分组变量值,这样不用额外传参,就能让geom_mean()获取到mpg$class或mpg$drv这类x映射的列数据。- 如果需要在函数内部对原始列数据做更复杂的操作,还可以通过
ggplot_build()从绘图对象中提取完整数据集,但after_stat()是更贴合ggplot语法的常规做法。
测试代码
library(ggplot2) # 基于class列的绘图 ggplot(mpg, aes(class, cty)) + geom_mean() # 基于drv列的绘图 ggplot(mpg, aes(drv, cty)) + geom_mean()
运行后你会看到,柱状图的填充色会自动根据x轴的分组(class或drv的不同取值)变化,证明geom_mean()已经成功访问到了x映射的列数据。
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

