r - сделать функцию построения графиков с помощью ggplot2, aes_string и reorder - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь создать функцию, которая будет использовать ggplot2 внутри, aes_string и reorder, но пока безуспешно.

В основном, если у нас есть примерный набор данных, подобный следующему:

library(ggplot2)
library(dplyr)

set.seed(123)
dt <- data.frame(
          id = c(1,1,1,2,2),
          a = c("b", "d", "c", "a", "b"),
          b = sample(1:10, 5, replace = F),
          cat = c(1,1,2,2,2)) %>%
    mutate(a = as.factor(a)) %>% 
    as_tibble()

Я хочу, чтобы функция принимала следующие аргументы: набор данных, фильтрующую переменную и две переменные для построения графика.

Это то, что мне удалось сделать:

myplot <- function(df, filtval, var1, var2) {
    data <- df %>% filter(id == filtval)

    ggplot(data) + 
        geom_point(
            aes_string(
                x = reorder(var1, var2),
                y = var2)
    )
}

К сожалению, при запуске он возвращает ошибку:

myplot(dt, 1, "a", "b")
Warning message:
    In mean.default(X[[i]], ...) :
    argument is not numeric or logical: returning NA

Вот что я хочу, чтобы функция делала:

data <- dt %>% filter(id == 1)
ggplot(data) + 
    geom_col(aes(x = reorder(a, - b), y = b))

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

После обсуждения с г-ном Фликом (см. Ниже), это НЕ должно использоваться:

myplot <- function(df, filtval, var1, var2) {
  data <- df %>% filter(id == filtval)
  data$new_order <- reorder(data[[var1]], data[[var2]])

  ggplot(data) + 
    geom_point(mapping=
      aes_string(
        x = "new_order",
        y = var2)
    )
}

Вместо этого возьмите его решение:)

0 голосов
/ 07 декабря 2018

В последней версии ggplot вы должны использовать aes с !! и sym(), чтобы превратить ваши строки в символы.

myplot <- function(df, filtval, var1, var2) {
  data <- df %>% filter(id == filtval)

  ggplot(data) + 
    geom_point(
      aes(
        x = reorder(!!sym(var1), !!sym(var2)),
        y = !!sym(var2))
    )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...