如何在ggplot中使用带有准引号的cut_width?

时间:2018-06-25 03:56:50

标签: r ggplot2 lazy-evaluation

我想将此代码变成一个函数:

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),它仍然会产生相同的错误。

如何使功能按预期工作?

1 个答案:

答案 0 :(得分:1)

如果您可以接受函数的输入为字符串,则可以通过将aes_string函数与ggplot2一起使用来轻松实现此目的,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)