You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:51:08