r - 如何在lapply期间将ggplot x-label设置为等于变量名称?

标签 r ggplot2 lapply tidyeval nse

我正在绘制一个 y 变量对多个 x 变量的图。
我有一个使用 lapply 的工作解决方案。但是,我无法将 x 变量的名称写为每个图的 x 标签。这是我所拥有的一个简化示例:

目标是针对每个 x 变量绘制 y 变量,产生三个图,并将每个 x 变量的名称添加为 x 轴标签。

用一个 y 变量和三个 x 变量生成一个数据框:

df <- data.frame(y.variable=c(11:20), x1=c(21:30),x2=c(1:10),x3=c(31:40))

应该以字符串形式检索变量名称的函数:
get_name <- function(v1) {deparse(substitute(v1))}

生成 y 对 x 变量的图的函数:
generate_plot <- function(x.variable) {ggplot(data = df, aes(x.variable, y.variable )) +geom_point()  + xlab(get_name(variable.name))}

调用 lapply 以在 df 的每一列上执行 generate_plot:
lapply(df, generate_plot)

这会产生三个图,每个图都将“variable.x”作为其 x 标签,而不是所需的变量名称 x1、x2 和 x3。

最佳答案

我修改你的generate_plot一点点使用 ggplot2 的版本( > v3.0.0 ) 支持 tidy evaluation
解释:

  • 在函数内部,我们使用 rlang::sym将字符串转换为符号然后 unquote它里面aes使用 !! (砰砰)
  • 要调用该函数,请使用 purrr::map循环遍历 df列名

  • 查看更多:
  • https://dplyr.tidyverse.org/articles/programming.html
  • http://rlang.r-lib.org/reference/quotation.html


  • library(tidyverse)
    
    df <- data.frame(y.variable=c(11:20), 
                     x1=c(21:30), x2=c(1:10), x3=c(31:40))
    
    generate_plot2 <- function(df, x.variable) {
      x.variable <- rlang::sym(x.variable)
    
      ggplot(data = df, aes(!! x.variable, y.variable )) +
        geom_point() + 
        xlab(x.variable)
    }
    
    names(df)[-1] %>% 
      map(~ generate_plot2(df, .x))
    

    enter image description here

    创建于 2018-04-20 由 reprex package (v0.2.0)。

    关于r - 如何在lapply期间将ggplot x-label设置为等于变量名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49943092/

    相关文章:

    将 Shiny 的单选按钮重置为空值

    r - 在 Rmarkdown knitr 输出中指定 ggplot 图形的高度和宽度

    r - 按类别和计数的直方图

    r - 在函数内部使用 get inside lapply

    r - 如何将嵌套循环转换为r中的lapply

    R - 通过匹配名称将 lapply 输出与数据帧列表绑定(bind)

    R:选择每行的前 N ​​个项目

    r - 是否有允许我创建根据一个或多个条件匹配的组的附加组件?

    r ggplot更改图例顺序以匹配数据的最终顺序

    r - 将相关性测试结果添加到 ggplot