我正在绘制许多类似的图,所以我想我写了一个函数来简化任务。我想传递一个data.frame
和要绘制的列的名称。这是我尝试过的:
plot_individual_subjects <- function(var, data)
{
require(ggplot2)
ggplot(data, aes(x=Time, y=var, group=Subject, colour=SubjectID)) +
geom_line() + geom_point() +
geom_text(aes(label=Subject), hjust=0, vjust=0)
}
现在,如果var
是一个字符串,它将无效。如果将aes
命令的ggplot
部分更改为y=data[,var]
,它将无法工作,并且会抱怨无法对闭包进行子集化。
那么解决这个问题和类似问题的正确方法/最佳实践是什么?如何轻松安全地将列名称传递给想要对data.frames进行处理的函数?
答案 0 :(得分:10)
Bad Joran,在评论中回答!
您想使用aes_string
,它允许您将变量名称作为字符串传递。在您的特定情况下,由于您似乎只想修改y
变量,因此您可能希望重新组织在哪些geoms中映射哪些美学。例如,可能是这样的:
ggplot(data, aes_string(y = var)) +
geom_line(aes(x = Time,group = Subject,colour = SubjectID)) +
geom_point(aes(x = Time,group = Subject,colour = SubjectID)) +
geom_text(aes(x = Time,group = Subject,colour = SubjectID,label = Subject),hjust =0,vjust = 0)
或者反过来,取决于你的口味。