使用map2(〜ggplot ...时如何设置y轴限制?

时间:2018-11-15 00:53:26

标签: r ggplot2 tidyverse purrr

使用purrr::map2时如何在每个图中设置不同的y轴限制?

我想将y轴下限设置为最大y轴值的一半,例如:max(y-axis value/2)

data(mtcars)

library(tidyverse)

mtcars_split <- 
  mtcars %>%
  split(mtcars$cyl)


plots <- map2(
  mtcars_split,
  names(mtcars_split),
  ~ggplot(data = .x, mapping = aes(y = mpg, x = wt)) + 
    geom_jitter() +
    ggtitle(.y)+
  scale_y_continuous(limits=c(max(.y)/2,NA))

)

plots
  

max(.y)/ 2中的错误:二进制运算符的非数字参数

2 个答案:

答案 0 :(得分:3)

.y是数据框的名称,这就是max(.y)/2给您该错误的原因。这应该给您您想要的东西:

plots <- imap(
  mtcars_split,
  ~ggplot(data = .x, mapping = aes(y = mpg, x = wt)) + 
    geom_jitter() +
    ggtitle(.y) +
    scale_y_continuous(limits=c(max(.x$mpg)/2,NA))
)

请注意,imap(x, ...)只是map2(x, names(x), ...)的简写。

答案 1 :(得分:2)

这不适用于y轴值,但是如果您不介意两次指定y列,则可以完成工作:

plots <- map2(
  mtcars_split,
  names(mtcars_split),
  ~ggplot(data = .x, mapping = aes(y = mpg, x = wt)) + 
    geom_jitter() +
    ggtitle(.y)+
  scale_y_continuous(limits=c(max(.x$mpg)/2,NA))

)

或更安全的选择:

plots <- map2(
    mtcars_split,
    names(mtcars_split),
    ~{
        ploty <- 'mpg'
        plotx <- 'wt'
        ggplot(data = .x, mapping = aes_string(y = ploty, x = plotx)) + 
        geom_jitter() +
        ggtitle(.y)+
        scale_y_continuous(limits=c(max(.x[[ploty]])/2,NA))
    }
)