Как установить пределы оси Y при использовании map2 (~ ggplot ...? - PullRequest
0 голосов
/ 15 ноября 2018

Как установить различные пределы оси Y на каждом графике при использовании purrr::map2?

Я хотел бы установить нижний предел оси 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 голосов
/ 15 ноября 2018

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

0 голосов
/ 15 ноября 2018

Это не работает, основываясь на значении оси 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))
    }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...