如何在 ggplot 中使用 cut_width 和准引号?

How to use cut_width with quasiquotation within ggplot?

我想把这段代码变成一个函数:

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

代码输出: The resulting 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)

然而,geom_boxplot() 中的 cut_width 给了我 Error in cut_width(enquo(x), 5) : 'pairlist' object cannot be coerced to type 'double'

如果我将代码更改为 cut_width(~x, 0.1),它仍然会产生相同的错误。

如何使该功能按预期工作?

如果您接受函数的输入是字符串,您可以通过将 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)