2016-07-31 15 views
0

Ich habe eine Zeitreihe Datei mit der Konzentration von 4 Metaboliten A, B, AE und E im Laufe der Zeit. Ich habe viele Datendateien dieses Typs (etwa 100). Ich möchte die Zeitreihe für alle vier Metaboliten in allen Dateien in einem Diagramm darstellen. Jedem Metaboliten ist eine bestimmte Farbe zugeordnet.Plot Daten in mehreren Dateien mit ggplot

Ich habe den folgenden Code kompiliert, aber es zeichnet Daten in nur einer Datei (der letzte). Ich denke, das kommt daher, dass ich, wenn ich ggplot() anrufe, eine neue Handlung erstelle. Ich habe versucht, die Handlung außerhalb der vier Schleife zu erstellen und es hat nicht funktioniert.

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) 

Unten ist die grafische Darstellung enter image description here

Beispieldateienhere

Antwort

2

Ich nehme in der Regel die folgenden Ansatz (ungetestet, mangels eines reproduzierbaren Beispiel) gefunden werden kann

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") 
+0

danke für die Antwort. Ich versuche, meinen Kopf um deine Lösung zu wickeln. Es sieht etwas kompliziert für mich aus. Außerdem habe ich einige Beispieldateien beigefügt. – SriniShine

0

Seit plot(p) ist außerhalb der lo op, es wird nur die letzte Grafik plotten. Verschieben Sie plot(p) innerhalb der Schleife.

Hinweis: Während die Frage etwas mehrdeutig ist, gehe ich davon aus, dass Sie ein Diagramm pro Eingabedatei wünschen.

BEARBEITEN: Um alle Daten in einem einzigen Diagramm zu speichern, vorausgesetzt, alle Ihre Dateien haben die gleichen Spalten in der gleichen Reihenfolge.

all_data <- lapply(filesToProcess, read.csv) 
fileContent <- do.call(rbind, all_data) 

Dann können Sie den ggplot-Code genau wie oben (ohne Schleife) ausführen.

+0

@Marchand Ich brauche ein Diagramm für Daten in allen Dateien. – SriniShine

+0

@Marchand danke für den Vorschlag. Ja, alle Dateien haben die gleichen Spalten in der gleichen Reihenfolge (Zeit, A, A | E, B, E). Ich habe deine Methode ausprobiert und die Handlung sieht nicht so aus, wie sie aussehen soll. Außerdem habe ich einige Beispieldateien beigefügt. – SriniShine

0

Ich denke, dass ich das Problem gelöst habe. Die Antwort ist ein bisschen grob ich gebe zu. Wenn ich jedoch die Variable "p" außerhalb der for-Schleife initialisieren könnte, löst sie das Problem.

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