使用dplyr管道在ggplot2中动态ylim

Tri*_*mus 5 limits r ggplot2 dplyr

我想在ggplot中创建动态ylim值,以便ylim参数引用dplyr通过管道提供的值.为了说明问题,请查看我想要更改为(当前不是通用的)通用代码的工作(非通用)代码.

require(dplyr)
require(scales)
require(ggplot2)

x <- data.frame(name = c("A","B","C"), 
                value = c(2,4,6))
Run Code Online (Sandbox Code Playgroud)

使用非通用代码:

arrange(x[1:2, ], value) %>%
  ggplot(data=., aes(x=factor(name), y=value)) + 
  geom_bar(stat="identity") +
  scale_y_continuous(labels=comma, 
                     limits=c(0,max(arrange(x[1:2, ], value)$value) * 1.1))
Run Code Online (Sandbox Code Playgroud)

不工作的通用代码(调用找不到值):

arrange(x[1:2, ], value) %>%
  ggplot(data=., aes(x=factor(name), y=value)) + 
  geom_bar(stat="identity") +
  scale_y_continuous(labels=comma, 
                     limits=c(0,max(value) * 1.1))
Run Code Online (Sandbox Code Playgroud)

所以问题是,是否有任何方法可以设置一般限制,即排列后的部分将始终相同(我需要生成许多相同的图形,具有不同的x,即不同的限制).谢谢!

hrb*_*str 5

如果您可以使用<<-并且也不介意使用一个额外的变量,以下将保留管道并为您提供动态ylim:

max_val <- 0
arrange(x[1:2, ], value) %>%
{ max_val <<- max(.$value) 
. } %>% 
  ggplot(data=., aes(x=factor(name), y=value)) + 
  geom_bar(stat="identity") +
  scale_y_continuous(labels=comma, 
                     limits=c(0, max_val * 1.1))
Run Code Online (Sandbox Code Playgroud)

  • 埃.如果你在脚本顶部附近定义它,它将在命名空间/环境中(这对于`<< - `来说真的很重要),然后每次在任何管道中执行`{}`块它只会分配到该范围变量中.每次都不需要做"< - 0". (2认同)

Wal*_*ltS 3

您可以在极限值处绘制一个大小为零的虚拟点。这不是一个特别漂亮的解决方案,但它似乎相当灵活。代码看起来像

arrange(x[1:2, ], value) %>%
  ggplot(data=., aes(x=factor(name), y=value)) + 
  geom_bar(stat="identity") +
  geom_point(aes(x=c(name[1], name[1]), y = c(0, max(value)*1.1)), size=0) +
  scale_y_continuous(labels=comma)
Run Code Online (Sandbox Code Playgroud)