ggplot - написание функции для создания ggplot - как правильно назначить параметр? - PullRequest
0 голосов
/ 12 апреля 2020

Я не могу найти ответ на эту простую проблему:

Я хочу создать ggplot. Параметр aes частично взят из вектора и частично назначен напрямую.

names(mydt)
"gender"     "cat1"        "category_b"    "value"


category_a <- "cat1"

plot.sum <- mydt %>%
  dplyr::group_by(category_a, category_b) %>%
  ggplot(aes(x = category_a, y = N, fill = category_b)) +
  geom_bar(position="stack", stat="identity") 
plot.sum

Это не работает, и я получаю ошибку:

Ошибка: столбец category_a неизвестен

Я предполагаю, что это потому, что R ожидает category_a в быть столбцом в mydt, и вместо этого он получает элемент символа из вектора "cat1", которого нет в mydt - исправьте меня, если я ошибаюсь?

Как это может быть исправлено?

Конечная цель - сделать это функцией:

make.plot.sum <- function (data, group_by1, group_by2, position){

data %>%
  dplyr::group_by(group_by1, group_by2) %>%
  ggplot(aes(x = group_by1, y = N, fill = group_by2)) +
    geom_bar(position="position", stat="identity") 
  plot.sum

  return(plot.sum)

}

make.plot.sum(mydt, category_a, category_b, stack)

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020
Ответ

chemdorks123 отличный, но стоит отметить, что aes_string считается мягко уменьшенным в пользу новых идиом.

В вашей ситуации, когда вы хотите, чтобы пользователь передавал столбец в aes, вы можете использовать фигурные скобки ({{}}).

make.plot.sum <- function (data, group_by1, group_by2, position){

data %>%
  dplyr::group_by(group_by1, group_by2) %>%
  ggplot(aes(x = {{group_by1}}, y = N, fill = {{group_by2}})) +
    geom_bar(position="position", stat="identity") 
  plot.sum

  return(plot.sum)

}

В одном из ggplot2 виньетки - Использование ggplot2 в пакетах

0 голосов
/ 13 апреля 2020

Вы правы: проблема, вероятно, связана с передачей символа "cat1" в aes(), когда aes() ожидает, что вы передадите имя столбца (то есть cat1 без кавычек). Если вы хотите передать информацию в aes(... как символ, вы можете использовать aes_string(...) вместо aes(): просто убедитесь, что при использовании aes_string() все параметры являются символьными векторами, а для aes() все параметры являются ссылками на имена столбцов в вашем фрейме данных.

Примечание. На самом деле я не уверен, что вы можете комбинировать aes() и aes_string(...), если вам интересно ... Я никогда не пробовал это. Итак, как вы можете сказать aes(x=cat1), тогда aes_string(y='cat2')? Не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...