感觉我在这里犯了一个非常愚蠢的错误..因为我之前在另一个项目上做过这个(也许运气好吗?)
目标是通过使用函数在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)
谢谢你的帮助.
你做错了几件事.
首先,内部指定的所有内容都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)