aes_string()

时间:2018-06-06 17:10:02

标签: r ggplot2 nse tidyeval

我希望通过在ggplot中将数字乘以数字(例如10)来扩展我的y-var。问题是这是在一个Shiny应用程序中,变量必须作为字符串传递,即input$variable

如何将aes_string()中的一个变量与aes()中的变量相同?这是一个失败的例子:

 library(ggplot2)
 ggplot(data = subset(mtcars, cyl == 4), aes_string(x = "wt", y = "mpg")) + 
      geom_line(size = 1.5, color = "#00868B") + 
      geom_line(data = subset(mtcars, cyl == 8), aes_string(x = "wt", y = "mpg" * 10))
  

错误" mpg" * 10:二元运算符的非数字参数

2 个答案:

答案 0 :(得分:2)

我更喜欢使用get代替aes_string来调用ggplot2中的变量,并且可以使用值修改,例如:

library(ggplot2)
X <- "wt"
Y <- "mpg"
ggplot(subset(mtcars, cyl == 4), aes(get(X), get(Y))) + 
    geom_line() + 
    geom_line(data = subset(mtcars, cyl == 8), aes(y = get(Y) * 10)) +
    labs(x = X,
         y = Y)

enter image description here

PS:您不需要在第二个wt中拨打aes,因为它是相同的&#34;变量&#34;与第一个aes一样。

答案 1 :(得分:2)

您可以使用ggplot2 v3.0.0

中介绍的tidyeval方法
# install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)

var1 <- "wt"
var2 <- "mpg"
multiplier <- 10

ggplot(data = subset(mtcars, cyl == 4), 
       aes(x = !! rlang::sym(var1), y = !! rlang::sym(var2))) + 
  geom_line(size = 1.5, color = "#00868B") + 
  geom_line(data = subset(mtcars, cyl == 8), 
            aes(x = !! rlang::sym(var1), y = !! rlang::sym(var2) * multiplier))

或者将所有内容都放在一个函数中

plot_select_vars <- function(var1, var2, multiplier) {

  var1 <- rlang::sym(var1)
  var2 <- rlang::sym(var2)

  ggplot(data = subset(mtcars, cyl == 4), 
         aes(x = !! var1, y = !! var2)) + 
    geom_line(size = 1.5, color = "#00868B") + 
    geom_line(data = subset(mtcars, cyl == 8), 
              aes(x = !! var1, y = !! var2 * multiplier))

}

plot_select_vars(var1, var2, multiplier)

reprex package(v0.2.0)创建于2018-06-06。