R - loop adding points to graph -
i have problem loop in r. have written simple program load spectra, rewrite data separate file, plot them , mark position of peaks. unfortunately when run last loop, outcome strange. data points beeing marked cicrcles. when run commands loop manually ok.
below code (i know "dirty" code, need write simple program understand pass course, , beginner r) , data working with.files
any appreciated. michal
#podaj katalog, w którym są dane. potem skopiuj, wklej już csv_list=list.files(path=".", pattern="*.csv") ##wyszukuje pliki z rozszerzeniem ".csv" csv_list <- csv_list[which(csv_list!="tabela.csv")] ##usuwa z listy plik "tabela.csv" (na wypadek ponownego uruchomienia programu w tym samym katalogu) a=seq(along=csv_list) ##tworzy sekwencję o długości równej liczbie wczytanych plików b=seq(along=csv_list) files=max(a) ##liczba wczytywanych plików (pomoc tworzenia tabeli) file_names=sub(pattern=".csv",replacement="",x=csv_list) ##usuwa rozszerzenia z nazw plików ##tworzy tabele na wyniki wyniki bez szumu tabela=matrix(ncol=files+1,data=rep(1:1867,each=(files+1))) no_noise=matrix(ncol=files+1,data=rep(1:1867,each=(files+1))) ##zbiera wyniki z plików w jedną tabelę, szuka wartości minimalnych maksymalnych (do wykresu): (i in 1:files) {spectra=read.table(csv_list[i],header=false,sep=",",dec=".",skip=1,nrows=1868) tabela[,1]=spectra$v1 tabela[,i+1]=spectra$v2 a[i]=max(spectra$v2) b[i]=min(spectra$v2)} ##odszumia dane poniżej 10*mediana (i in 1:files) {spectra=read.table(csv_list[i],header=false,sep=",",dec=".",skip=1,nrows=1868) no_noise[,1]=spectra$v1 no_noise[,i+1]=spectra$v2} (i in 1:files+1){ no_noise[,c(i)][no_noise[,c(i)]< 10*median(tabela[,c(i)])] <- 0} df=as.data.frame(no_noise) rm(no_noise) ##zapisuje tabelkę z liczbami w pliku .csv, separator kolumn ",", nagłowki kolumn nazwy plików write(c("wawelength",csv_list),file="tabela.csv",ncolumns=files+1, append=true, sep=",") write.table(tabela,file="tabela.csv",append=false,quote=true, sep=",",row.names=false,col.names=false) ##rysuje osie dopasowuje skalę wyników; dopasowanie skali -wartości w nawiasie przy xlim, ylim; funkcja kasuje poprzedni wykres plot(x=0,y=0,xlim=c(min(tabela[,1]),max(tabela[,1])),ylim=c(min(b),max(a)),xlab=expression(paste("raman shift /", cm^-1, "", sep = "")),ylab='absorbance') ##rysuje wykresy z tej tabeli z danymi w różnych kolorach z legendą (i in 1:files) lines(x=tabela[,1],y=tabela[,i+1],type="l",lwd=0.5,col=i) legend("topright",legend=file_names,lwd=0.5,col=c(1:files)) ##funkcje szukające maksimów peaks <- function(series, span = 3, do.pad = true) { if((span <- as.integer(span)) %% 2 != 1) stop("'span' must odd") s1 <- 1:1 + (s <- span %/% 2) if(span == 1) return(rep.int(true, length(series))) z <- embed(series, span) v <- apply(z[,s1] > z[, -s1, drop=false], 1, all) if(do.pad) { pad <- rep.int(false, s) c(pad, v, pad) } else v } ##wyszukanie maksimów w zaimportowanych plikach m=as.matrix(df) (i in 2:files+1) { d.peaks <- peaks(m[,c(i)], 5) peak_idx <- which(d.peaks) points(m[,c(i)] ~ m[,c(1)], data=m[peak_idx, ], col = i-1, cex = 1.5) } rm(m) dev.copy(png,'graph.png') dev.off()
Comments
Post a Comment