2017-05-06 7 views
1

Ich habe eine Reihe von 2D-Datenframe-Dateien in meine R-Umgebung gelesen und möchte deren Inhalt plotten.Wie man eine x-Achse basierend auf Dateiname dynamisch annotiert

Ein Beispiel Dateiname ist:

MEF_85686672-85692745_orientation _ + _ overlap_2073_regulation_.txt

head(MEF_85686672-85692745_orientation_+_overlap_2073_regulation_.txt) 
    1  85686673   97.51475 
    2  85686674   98.51475 
    3  85686675   100.51475 
    4  85686676   44.51542 
    5  85686677   97.50000 

der Lage sein, diese Dateien zu durchlaufen ich eine Liste dieser Dateien machen:

MEF=ls()[grep(ls(), pattern='MEF')] 

Dann plotten ich den Inhalt der Dateien eins nach dem o ther

plot_files=function(MEF){ 
     mef=get(MEF[i]) 
     tryCatch(
     plot(mef[,1], (mef[,2]/mean(mef[1:1000,2])), 
     main = gsub('.txt','',gsub('MEF_nuc_occupancy_region','',paste(MEF[i]))), xlab="bp", 
     ylab="Occupancy", type='l', ylim=c(min(mi),max(ma)), col='red'), 
     error=function() next); 

Alle der oben genannten ist in Ordnung, es ist, wenn ich versuche, um die Funktion zu beenden, um weiter die Plots mit Anmerkungen versehen auf der Basis der Datei-Variablennamen, Probleme auftreten. Ich möchte die x-Achse hervorheben, basierend auf der Anwesenheit oder Abwesenheit eines '+' - Zeichens zwischen den regulären Mustern 'Orientierung' und 'Überlappung' in den Dateinamen.

if(substr(paste(MEF[i]), regexpr(paste(MEF[i]), pattern='_orientation_')+13, regexpr(paste(MEF[i]), pattern='_overlap_')-1)=='+'){ 
    rect(xleft=85692000, xright=nrow(mef), ybottom=par("usr")[3], ytop=par("usr")[4], density=NA, col="lightgray") 
    } 
} 

wenn ein '+' Zeichen vorhanden ist. Die Nummer im Dateinamen, die zwischen "Überlappung" und "Regulierung" auftritt, wird genommen und von dieser Zahl (subtrahiert von der Anzahl der Zeilen) bis zum Ende der x-Achse.

und so, wenn ich diese Plot-Funktion und durchlaufen jeweils zu den Dateien:

for(i in seq(length(MEF))){ 
    tryCatch(plot_files(MEF,ESC), error=function(e) e) 
} 

Das erste Problem ist, dass nichts in einem der Grundstücke hervorgehoben ... ich zuerst vermutet, dass dies auch sein mag aufgrund der Überlappungen der Bereiche zu klein, um im Kontext der gesamten x-Achse sichtbar zu sein. Allerdings sind einige der Überschneidungen recht groß und noch keiner der x-Achsen resultierenden Plots wird hervorgehoben:

enter image description here

Also, wenn ich versuche, es mit einer künstlichen Zahl zu debuggen (85.692.000) und versuchen, das erweitern zum rechten Ende der Achse hervorheben, wie zum Beispiel:

if(substr(paste(MEF[i]), regexpr(paste(MEF[i]), pattern='_orientation_')+13, regexpr(paste(MEF[i]), pattern='_overlap_')-1)=='+'){ 
rect(xleft=85692000, xright=nrow(mef), ybottom=par("usr")[3], ytop=par("usr")[4], density=NA, col="lightgray") 
} 

folgendes Grundstück Ergebnisse: enter image description here

nur so nicht ist das Highlight vom falschen Ende der x- erstreckt Achse, aber es bedeckt auch nicht die gesamte Handlung - ich möchte nur die x-Achse mit einer Linie markieren ...(Anmerkung: Ich werde die Farbe und Dichte später aussortieren)

Alles, was ich will, ist eine grafische Darstellung der Highlights die x-Achse wie folgt:

enter image description here

Eines, das die x-Achse vom Ende Highlights der Achse auf die Zahl, die der Überlappung im Variablennamen entspricht, subtrahiert von der Länge der X-Achse (HINWEIS: Ich werde an dem alternativen Fall arbeiten, in dem es ein '-' und nicht '+' gibt, später - Falls die Hervorhebung von der linken Seite der Achse statt von rechts verläuft)

+0

Verwenden Sie nicht 'assign'. Benutze stattdessen Listen und 'lapply()'. – Uwe

Antwort

0
library(ggplot2) 
for(i in seq(length(MEF))){ 
    x1=get(MEF[i]) 
    x2=get(ESC[i]) 
    #png(filename=paste('PNG/', MEF[i], '.png', sep='')); 
    p=ggplot(data=x1, aes(V1,V2)) 
    xmin=x1[1,1]+(nrow(x1)-as.numeric(substr(paste(MEF[i]), regexpr(paste(MEF[i]), pattern='_overlap_')+9, regexpr(paste(MEF[i]), pattern='_regulation_')-1))) 
    xmax=x1[nrow(x1),1] 
    p=p+geom_line(aes(colour='black'))+geom_line(data=x2, aes(V1,V2, colour='red'))+scale_colour_manual(labels = c("MEF", "ESC"),values = c("black","red"))+theme_bw()+labs(x='bp', y='Occupancy')+geom_rect(aes(xmin=xmin, xmax=xmax, ymin=-10, ymax=0), color="blue",fill='blue', alpha=0.01, inherit.aes = FALSE) 
    print(p) 
    #dev.off(); 
} 

enter image description here

Verwandte Themen