用 R 中相应变量的名称标记 x 轴和 y 轴

Labelling x- and y-axis by the corresponding variable's name in R

起初这听起来像是一个非常微不足道的问题,但到目前为止还没有人设法帮助我,因此我向大家伸出援手。

我想做以下事情:

我正在编写一个简单的函数,允许我绘制两个变量的对比图,第三个变量为观察点着色(取决于颜色变量的相应值)。代码如下所示:

scatterplot <- function(data_used, x.variable, y.variable, color.variable) {
  
  ggplot(data_used, aes(x=x.variable, y = y.variable)) +
    geom_point(aes_string(color = color.variable)) 
  
}

scatterplot(data_used = example_data, x.variable = example_data$education, 
            y.variable = example_data$wages, 
            color.variable = example_data$sex)

我现在想让 R 做的是用我决定绘制的相应变量的名称(分别)标记 x 轴和 y 轴。在此示例中,x 轴为 'education',y 轴为 'wages'.

我试着简单地输入 + labs (x = x.variable, y = y.variable) 但它不起作用(这样做时,R 用变量值标记轴!)。默认情况下,R 仅将轴命名为“x.variable”和“y.variable”。

有人可以帮助我实现我想要做的事情吗?

此致,

xifrix

事后看来,我不确定准引用的内容是否 100% 必要,但这是我用于类似需求的模式:

my_scatterplot <- function(data, x, y){
  .x = rlang::enquo(x)
  .y = rlang::enquo(y)
  data %>%
    ggplot(aes(x = x, y = y))+
    geom_point()+
    labs(x = .x, 
         y = .y)
}

如果它对您不起作用,请告诉我,但应该可以。编辑:应该在 DaveArmstrong 的回答之后添加,该函数将在不带 x / y 变量引号的情况下调用,例如

diamonds %>% my_scatterplot(price, table)

jpenzer 的回答很好。这里没有准引用的东西。

scatterplot <- function(data_used, x.variable, y.variable, color.variable) {
  
  ggplot(data_used, aes_string(x=x.variable, y = y.variable)) +
    geom_point(aes_string(color = color.variable)) +
    labs(x=x.variable, y=y.variable, colour=color.variable)
  
}
mtcars %>% 
  mutate(am = as.factor(am)) %>% 
scatterplot(., x.variable = "hp", 
            y.variable = "mpg", 
            color.variable = "am")

要在函数中传递列名,您可以在函数体中的所需列名周围使用双花括号 {{...}}

library(dplyr)
library(ggplot2)

scatterplot <- function(data_used, x.variable, y.variable, color.variable) {
  
  ggplot(data_used, aes_string({{x.variable}}, {{y.variable}})) +
    geom_point(aes_string(color = {{color.variable}})) +
    labs(x=x.variable, y=y.variable, colour=color.variable)
  
}


scatterplot(mtcars %>% mutate(am = as.factor(am)), x.variable = "mpg", 
            y.variable = "hp", 
            color.variable = "am")