使用ggplot在多个文件中绘制数据

时间:2016-07-31 10:46:49

标签: r ggplot2

我有一个时间序列数据文件,其随着时间的推移具有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)

下面是图enter image description here

可以找到示例文件 here

3 个答案:

答案 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)

enter image description here