Использование имени столбца в вызове функции ggplot geom_jitter () в формате dplyr - PullRequest
0 голосов
/ 27 февраля 2020

Может быть, есть лучший подход, и я спрашиваю "проблему XY".

Я хочу контролировать количество дрожания на моем графике рассеяния, чтобы быть процентом от общей ширины переменной в это измерение. Я написал функцию scale_jitter (), которая вычисляет сумму в этом измерении на основе предоставленной части p. Это прекрасно работает, пока я явно сбрасываю переменную df $ в моей функции scale_jitter (). Однако мне нравится кодировать вещи способом tidyverse / dplyr, и поэтому, хотя следующий код работает, он рассчитывает диапазон на основе того, что назначено для df $ a и df $ b в текущей области видимости, а не вычисляет диапазон на основе Функция dplyr :: filter (), которая стоит перед ней.

scale_jitter <- function(x,p=0.02) {
  return((max(x)-min(x))*p)
}

df <- tibble(a=rep(rnorm(n=5,mean=50,sd=25),20),
             b=rep(rnorm(n=5,mean=50,sd=25),20))

df %>%
  filter(a < 50) %>%
  ggplot(aes(x=a,y=b)) +
  geom_jitter(
    width=scale_jitter(df$a),
    height=scale_jitter(df$b)
  )

Я бы хотел, чтобы что-то вроде следующего работало, но я получаю ошибки об отсутствии объектов для a и b. Я пробовал. $ A и. $ B, но это тоже не сработало.

df %>%
  filter(a < 50) %>%
  ggplot(aes(x=a,y=b)) +
  geom_jitter(
    width=scale_jitter(a),
    height=scale_jitter(b)
  )

В конечном итоге я установил порцию / процент для параметров высоты и ширины geom_jitter вместо значения у которого есть единицы.

1 Ответ

1 голос
/ 27 февраля 2020

Хитрость здесь заключается в попытке передать данные по конвейеру в ggplot, а затем в заданный c geom. В соответствии с этим blog вы можете использовать пакет wrapr , чтобы использовать модифицированный канал (так называемый 'dot-arrow-pipe') для передачи объектов в ggplot и его последующие geoms. Очевидно, проблема заключается в структуре построения ggplot - путем добавления объектов '+' вместе, где традиционный канал "%>%" обычно связывает функции вместе.

Я изменил представление для использования с 'dot-arrow-pipe'. Важно отметить, что с помощью точки-стрелки-трубы "%.>%" Вам необходимо указать "." для каждого аргумента данных:

library(tidyverse)
library(wrapr) #install this package

scale_jitter <- function(x,p=0.02) {
  return((max(x)-min(x))*p)
}


#tell wrapr how to treat ggplot objects
apply_left.gg <- function(pipe_left_arg,
                          pipe_right_arg,
                          pipe_environment,
                          left_arg_name,
                          pipe_string,
                          right_arg_name) {
  pipe_right_arg <- eval(pipe_right_arg,
                         envir = pipe_environment,
                         enclos = pipe_environment)
  pipe_left_arg + pipe_right_arg 
}



df <- tibble(a=rep(rnorm(n=5,mean=50,sd=25),20),
             b=rep(rnorm(n=5,mean=50,sd=25),20))

#with the %.>% the '.' has to be specified in each call
df %.>%
  filter(., a < 50) %.>%
  ggplot(data = ., aes(x=a,y=b)) %.>%
  geom_jitter(
    width=scale_jitter(.$a),
    height=scale_jitter(.$b)
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...