我有一个时间序列数据文件,其随着时间的推移具有4种代谢物A,B,AE和E的浓度。我有很多这种类型的数据文件(大约100个)。我想在一个图中的所有文件中绘制所有四种代谢物的时间序列。每种代谢物都分配有特定的颜色。
我编译了下面的代码,但它只在一个文件(最后一个)中绘制数据。我认为这是因为当我调用ggplot()时它会创建一个新的情节。我试过在四个循环之外创建情节,但它没有用。
p = NULL
for(i in 1:length(filesToProcess)){
fileName = filesToProcess[i]
fileContent = read.csv(fileName)
#fileContent$Time <- NULL
p <- ggplot()+
geom_line(data = fileContent, aes(x = Time, y = A, color = "A"), size =0.8) +
geom_line(data = fileContent, aes(x = Time, y = B, color = "B"), size =0.8) +
geom_line(data = fileContent, aes(x = Time, y = AE, color = "AE"), size =0.8) +
geom_line(data = fileContent, aes(x = Time, y = E, color = "E"), size =0.8) +
xlab('Time') +
ylab('Metabolite Concentration')+
ggtitle('Step Scan') +
labs(color="Metabolites")
}
plot(p)
可以找到示例文件 here
答案 0 :(得分:2)
我通常采用以下方法(未经测试,因为缺乏可重现的例子)
read_one <- function(f, ...){
w <- read.csv(f, ...)
m <- reshape2::melt(w, id = c("Time"))
m$source <- tools::file_path_sans_ext(f) # keep track of filename
m
}
plot_one <- function(d){
ggplot(d, aes(x=Time, y=value)) +
geom_line(aes(colour=variable), size = 0.8) +
ggtitle('Step Scan') +
labs(x = 'Time', y = 'Metabolite Concentration', color="Metabolites")
}
## strategy 1 (multiple independent plots)
ml <- lapply(filesToProcess, read_one)
pl <- lapply(ml, plot_one)
gridExtra::grid.arrange(grobs = pl)
## strategy 2: facetting
m <- plyr::ldply(filesToProcess, read_one)
ggplot(m, aes(x=Time, y=value)) +
facet_wrap(~source) +
geom_line(aes(colour=variable), size = 0.8) +
ggtitle('Step Scan') +
labs(x = 'Time', y = 'Metabolite Concentration', color="Metabolites")
答案 1 :(得分:0)
由于 plot(p)
在循环之外,它只会绘制最后生成的图形。在循环内移动plot(p)
。
注意:虽然这个问题有些含糊不清,但我假设您希望每个输入文件都有一个图表。
编辑:要将所有数据放在一个图中,假设所有文件的列数相同且相同。
all_data <- lapply(filesToProcess, read.csv)
fileContent <- do.call(rbind, all_data)
然后你可以像上面那样完全运行ggplot代码(没有循环)。
答案 2 :(得分:0)
我想我解决了这个问题。我承认,答案有点粗糙。但是,如果我可以初始化&#34; p&#34;它在for循环之外的变量解决了这个问题。
filesToProcess = readLines("FilesToProcess.txt")
#initializing the variable with ggplot() object
p <- ggplot()
for(i in 1:length(filesToProcess)){
fileName = filesToProcess[i]
fileContent = read.csv(fileName)
p <- p +
geom_line(data = fileContent, aes(x = Time, y = A, color = "A"), size =0.8) +
geom_line(data = fileContent, aes(x = Time, y = B, color = "B"), size =0.8) +
geom_line(data = fileContent, aes(x = Time, y = AE, color = "AE"), size =0.8) +
geom_line(data = fileContent, aes(x = Time, y = E, color = "E"), size =0.8)
}
p <- p + theme_bw() + scale_x_continuous(breaks=1:20) +
xlab('Time') +
ylab('Metabolite Concentration')+
ggtitle('Step Scan') +
labs(color="Legend text")
plot(p)