我想将此代码变成一个函数:
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)
,它仍然会产生相同的错误。
如何使功能按预期工作?
答案 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)