5

我正在尝试使用 ggplot2 以编程方式绘制分布。

我无法弄清楚如何在这里使用非标准评估(NSE)(即使在阅读了 Hadley 的 NSE 书籍章节等之后)。

考虑以下代码:

library(ggplot2)


gg_dens <- function(x){
  eval(ggplot(data.frame(x), aes_string(x = substitute(x))) + geom_density() +
         ggtitle(substitute(x)), data.frame(x))
}


lapply(mtcars, function(x) gg_dens(x))

这段代码确实产生了许多密度图,每列一个,好的。但是,它不会打印正在绘制的变量的名称。而是打印占位符变量x(参见图)。

由上面的代码产生的图

我的目标是x用真实变量名替换引号,例如mpg.

4

2 回答 2

1

你可以试试:

gg_dens <- function(x, y){
  ggplot(y, aes_(x = as.name(colnames(y)[x]))) + geom_density() + ggtitle(colnames(y)[x])
}

lapply(1:ncol(mtcars), gg_dens, mtcars)

这个想法是循环遍历列索引。将aes_字符串转换为名称以及as.name.

于 2016-07-08T11:58:08.257 回答
1

lapply将无法使用您现在拥有的功能来解决此问题。x传递给该函数时只是一个向量,它不是该变量的名称,lapply也没有传递任何名称。换句话说,该函数的范围内没有任何东西可以确定什么应该是正确的 x 轴标签。

一种解决方案类似于@Jimbou:

gg_dens <- function(name, dat) {
  ggplot(dat, aes_string(x = name)) + geom_density() + ggtitle(name)
}    
lapply(names(mtcars), gg_dens, mtcars)

或者只使用方面:

mtcars2 <- tidyr::gather(mtcars)
ggplot(mtcars2, aes(value)) + geom_density() + facet_wrap(~key, scales = 'free')
于 2016-07-08T12:54:01.620 回答