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

5 r ggplot2 lapply nse tidyeval

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

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

生成一个包含 1 个 y 变量和 3 个 x 变量的数据框:

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

一个应该以字符串形式检索变量名称的函数:

get_name <- function(v1) {deparse(substitute(v1))}
Run Code Online (Sandbox Code Playgroud)

生成 y 相对于 x 变量的图的函数:

generate_plot <- function(x.variable) {ggplot(data = df, aes(x.variable, y.variable )) +geom_point()  + xlab(get_name(variable.name))}
Run Code Online (Sandbox Code Playgroud)

调用 lapply 对 df 的每一列执行generate_plot:

lapply(df, generate_plot)
Run Code Online (Sandbox Code Playgroud)

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

Tun*_*ung 2

generate_plot稍微修改一下你的并使用ggplot2> v3.0.0)支持的版本tidy evaluation

解释:

  • 在函数内部,我们将rlang::sym字符串转换为符号,然后unquote在内部aes使用!!(bang bang)

  • 要调用该函数,请使用purrr::map循环遍历df列名称

查看更多:

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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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