函数内的ggplot2变量

tas*_*alk 1 r

感觉我在这里犯了一个非常愚蠢的错误..因为我之前在另一个项目上做过这个(也许运气好吗?)

目标是通过使用函数在ggplot中构建几个图.我最终希望所有图表都显示在一个页面上,等等......

以下是一个有效的单个ggplot示例:

if (require("ggplot2") == FALSE) install.packages("ggplot2")

data_df = data.frame(matrix(rnorm(200), nrow=20))
time=1:nrow(data_df)

ggplot(data=data_df, aes(x=time, y=data_df[,1])) + 
        geom_point(alpha=1/4) + 
        ggtitle(deparse(substitute(data_df[1])))
Run Code Online (Sandbox Code Playgroud)

请注意,在此范围内将调用其他函数,这些函数将根据调用的dataframe列进行更改.我按照我做的另一个工作示例,但这只是给了我一个错误.我觉得我犯了一个基本错误,但不能指责它!

if (require("ggplot2") == FALSE) install.packages("ggplot2")

data_df = data.frame(matrix(rnorm(200), nrow=20))
time=1:nrow(data_df)

graphit <- function(sample_num){
        ggplot(data=data_df, aes(x=time, y=data_df[,sample_num])) + 
                geom_point(alpha=1/4) + 
                ggtitle(deparse(substitute(data_df[sample_num])))
}

graphit(1)

#Error in `[.data.frame`(data_df, , sample_num) : 
#  object 'sample_num' not found
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

jor*_*ran 8

你做错了几件事.

首先,内部指定的所有内容都aes()应该是数据框中的列.不要引用单独的向量,也不要通过冗余方式调用列data_df[,1].指定的全部内容data = data_df是,然后该数据框内aes()评估内部的所有内容.

其次,要编写函数以ggplot根据参数在不同的列上创建s,您应该使用aes_string这样的方法,以便您可以将美学映射明确地作为字符传递,并避免非标准评估的问题.

同样,我不会依赖deparse(substitute())情节标题.使用内置于数据框中的一些其他变量或其他一些数据结构.

例如,我会做更像这样的事情:

data_df = data.frame(matrix(rnorm(200), nrow=20))
time=1:nrow(data_df)
data_df$time <- time

graphit <- function(data,column){
    ggplot(data=data, aes_string(x="time", y=column)) + 
        geom_point(alpha=1/4) + 
        ggtitle(column)
}

graphit(data_df,"X1")
Run Code Online (Sandbox Code Playgroud)