Как использовать cut_width с квазиквотацией в ggplot? - PullRequest
0 голосов
/ 25 июня 2018

Я хотел бы превратить этот код в функцию:

diamonds %>%
ggplot() +
geom_boxplot(aes(x = carat, y = price, group = cut_width(carat, 0.1)))

Вывод кода: Полученный ggplot

Моя попытка:

pair_relationship_plot = function(df, x, y) {
  quo_x = enquo(x)
  quo_y = enquo(y)

  df %>%
    ggplot(aes_(x = quo_x, y = quo_y)) +     
    geom_boxplot(aes_(group = cut_width(enquo(x), 0.1)))
}

pair_relationship_plot(diamonds, carat, price)

Однако, cut_width внутри geom_boxplot () давал мне Error in cut_width(enquo(x), 5) : 'pairlist' object cannot be coerced to type 'double'

Если я изменю код на cut_width(~x, 0.1), он все равно выдаст ту же ошибку.

Как мне заставить функцию работать как задумано?

1 Ответ

0 голосов
/ 25 июня 2018

Если вы согласны с тем, что входные данные для вашей функции являются строками символов, вы можете легко сделать это, используя функцию aes_string с ggplot2, которая принимает эстетику в качестве строк. Функция ниже делает то, что вы хотите

make_boxplot = function(df, x_ax, y_ax){
group_text = paste0("cut_width(",x_ax,", 0.1)")

df %>%
    ggplot(aes_string(x=x_ax, y=y_ax)) +
    geom_boxplot(aes_string(group = group_text))
}

И вызов функции для получения того же результата, что и в вашем примере графика, будет make_boxplot(diamonds, "carat", "price")

Или, если вы хотите сохранить несколько нажатий клавиш и действительно не хотите вводить символьные строки для своей функции, вы можете просто использовать deparse(substitute()) внутри функции. то есть

make_boxplot = function(df, x_ax, y_ax){
  x_ax=deparse(substitute(x_ax))
  y_ax=deparse(substitute(y_ax))
  group_text = paste0("cut_width(",x_ax,", 0.1)")

  df %>%
    ggplot(aes_string(x=x_ax, y=y_ax)) +
    geom_boxplot(aes_string(group = group_text))
}

А теперь вы можете просто позвонить make_boxplot(diamonds, carat, price)

...