我有一个这样的数据框:
date_list = seq(ymd('2000-01-01'),ymd('2000-12-31'),by='day')
testframe = data.frame(Date = date_list)
testframe$ABC = rnorm(366)
testframe$DEF = rnorm(366)
testframe$GHI = seq(from = 10, to = 25, length.out = 366)
testframe$JKL = seq(from = 5, to = 45, length.out = 366)
我想自动执行以下操作。我想针对时间(日期)绘制从2:4开始的每一列。绘图应以p_columnname之类的格式保存。
p_ABC = ggplot(data = testframe, aes(x = Date, y = ABC)) +
geom_line(color = "grey", size = 1)
p_DEF = ggplot(data = testframe, aes(x = Date, y = DEF)) +
geom_line(color = "grey", size = 1)
p_GHI = ggplot(data = testframe, aes(x = Date, y = GHI)) +
geom_line(color = "grey", size = 1)
p_JKL = ggplot(data = testframe, aes(x = Date, y = JKL)) +
geom_line(color = "grey", size = 1)
我试图创建一个循环:
library(ggplot2)
theme_set(theme_gray())
for (i in colnames(testframe[2:ncol(testframe)])) {
paste("p", i, sep = "_") = ggplot(data = testframe, aes(x = Date, y = i)) +
geom_line(color = "grey", size = 1)
}
那行不通!有什么建议吗?
答案 0 :(得分:1)
使用lapply
和aes_string
的组合,我们可以生成图表列表。然后,您可以根据需要按名称提取列表的每个组成部分。
plot_list <- lapply(names(testframe)[-1],
FUN = function(n)
ggplot(testframe, aes_string("Date", n))+geom_line())
names(plot_list) <- paste0("p_", names(testframe)[-1])
plot_list$p_ABC
如果您要坚持使用for
循环框架,我们可以使用assign
函数:
for(n in names(testframe)[-1]){
assign(paste0("p_", n),
ggplot(testframe, aes_string("Date", n))+
geom_line())
}
答案 1 :(得分:0)
这可能不是最好的方法,但是您可以尝试递归。
f <- colnames(testframe)
sotc <- function(x){
if(is.na(f[x])){return()}
else
{ assign(paste0("p_",f[x]),
ggplot(testframe,aes_string(f[1],f[x]))+geom_line(),envir = globalenv())}
sotc(x+1)
}
sotc(2)
p_ABC