使用 dplyr 管道的 ggplot2 中的动态 ylim

Dynamic ylim in ggplot2 using dplyr pipe

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

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

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

工作非通用代码:

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))

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

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))

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

如果您可以接受使用 <<- 并且不介意使用一个额外的变量,则以下内容将保留管道并为您提供一个动态的 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))

如果您调用 max(x$value[1,2]),您可以避免让 ggplot 将 arg 解析为 max()。 另外你的代码没有解释 comma 所以我把它排除在答案之外。

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

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

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)

尝试了这两种解决方案

arrange(x[1:3, ], value) %>%
    ggplot(data=.,
           aes(x=factor(name),
               y=value)) +
    geom_bar(stat="identity") +
    scale_y_continuous()
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()

好像是自动调整的?

原文来自代码二