如何在ggplot2的scale_y_continuous中动态访问数据框变量实现比例次轴
问题
- 在ggplot2的
scale_y_continuous中无法解析传入的数据框变量
目标
- 动态实现带比例的次坐标轴
当前临时解决方法:手动写入总和,或将数据框保存到变量后通过df$count访问。
疑问
- 如何通过
.$count的方式动态访问该数据框变量?
可复现代码示例
mtcars %>% group_by(gear) %>% summarise(count = n()) %>% { ggplot(data = . , aes(x = gear, y = count)) + geom_col() + coord_flip() + scale_y_continuous(labels = comma_format(), sec.axis = sec_axis(~./32, #sum(.$count), labels = scales::percent, name = "proportion") ) }
解决方法
核心问题在于sec_axis的表达式无法直接访问ggplot传入的数据框.,因为它的求值环境和大括号内的数据环境不共享。可以通过在大括号作用域内先计算并存储总和变量的方式解决:
修改后的可运行代码:
library(dplyr) library(ggplot2) library(scales) mtcars %>% group_by(gear) %>% summarise(count = n()) %>% { # 先在当前数据环境中计算总数,存为变量 total_count <- sum(.$count) ggplot(data = . , aes(x = gear, y = count)) + geom_col() + coord_flip() + scale_y_continuous(labels = comma_format(), sec.axis = sec_axis(~./total_count, labels = scales::percent, name = "占比") ) }
原理说明
大括号{}创建了一个局部作用域,在这里可以直接用.访问经过dplyr处理后的数据框,先把总和计算出来存为total_count变量,之后sec_axis的表达式就能正常引用这个变量,实现动态计算比例的次坐标轴,无需手动硬编码总数。
内容的提问来源于stack exchange,提问作者Mohamed Mostafa El-Sayyad
相关产品推荐
相关产品推荐

