ggplot函数中如何直接引用传入的绘图数据表无需存储中间结果
问题说明
现有如下R语言ggplot2绘图流程:数据框df按sub_category分组计数、按count降序排列后截取前10行传入ggplot绘图,需要在不提前存储中间处理结果表的前提下,直接在labs()的caption参数中标注这前10行包含的总条目数,实现类似dplyr中.$count、.data[['count']]的语法直接引用传入ggplot的输入数据表。
原有代码如下:
df %>% count(sub_category, name="count") %>% arrange(desc(count)) %>% slice_head(n=10) %>% ggplot(aes(x=reorder(sub_category, count), y=count)) + geom_bar(stat='identity', fill='steelblue') + geom_text(aes(label=count), position=position_stack(vjust=0.5)) + labs(title="Top 10 Sub-Categories", x="Product Sub-Category", caption=paste0('total items=', sum(count)))
实现方案
无需提前赋值存储中间表,直接借助magrittr管道支持的匿名代码块写法即可实现,语法和dplyr中引用.的逻辑完全一致:
- 核心操作:在
slice_head(n=10)处理步骤之后,用大括号{}包裹后续所有ggplot绘图逻辑,此时管道传入的、处理完成的前10行结果数据集会作为块内的.对象,可以在任意绘图组件中直接引用.的字段做计算。
修改后可直接运行的代码:
df %>% count(sub_category, name="count") %>% arrange(desc(count)) %>% slice_head(n=10) %>% { ggplot(., aes(x=reorder(sub_category, count), y=count)) + geom_bar(stat='identity', fill='steelblue') + geom_text(aes(label=count), position=position_stack(vjust=0.5)) + labs( title="Top 10 Sub-Categories", x="Product Sub-Category", caption = paste0('total items=', sum(.$count)) ) }
原写法失效原因:
labs()本身不会自动捕获管道传入的数据集作用域,直接写sum(count)时R会在全局环境检索count对象,会触发找不到对象的报错。用大括号包裹逻辑后,显式将.作为ggplot的数据源,同时在caption计算时调用.$count,就可以直接基于处理完成的前10行数据计算总和,全程不需要额外赋值存储中间结果。
内容的提问来源于stack exchange,提问作者monte
相关产品推荐
相关产品推荐

