2016-01-05 2 views
3

У меня есть кадр данных, который выглядит следующим образом:Создание большого количества линий плотности на одном участке

DF<-as.data.frame(t(replicate(150, sample(seq(100, 1000),15,replace=T))),rownames=T) 

Я хочу построить отдельные строки, как плотность, так что я получаю график с кривыми плотностью множества. Я знаю, что могу это сделать построчно, как показано ниже:

plot(density(DF[,1]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,2]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,3]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,4]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,5]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,6]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,7]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,8]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,9]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,10]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,11]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,12]),col = adjustcolor('black', alpha.f = .5)) 
lines(density(DF[,13]),col = adjustcolor('black', alpha.f = .5)) 
#...and so forth 

Но мне было интересно, если есть автоматизированный способ сделать все строки сразу, в противном случае процесс становится громоздким очень быстро.

+2

У вас есть необходимость различать кривые друг от друга? – Heroka

ответ

6

Вы можете использовать петлю for.

DF<-as.data.frame(t(replicate(150, sample(seq(100, 1000),15,replace=T))),rownames=T) 
plot(density(DF[,1]),col = adjustcolor('black', alpha.f = .5)) 
for (i in 2:ncol(DF)){ 
    lines(density(DF[, i]), col = adjustcolor('black', alpha.f = 0.5)) 
} 

что приводит:

enter image description here

+1

великолепие, вот что мне нужно – Oposum

8

Вы также можете использовать lapply:

plot(density(DF[,1]),col = adjustcolor('black', alpha.f = .5),ylim=c(0,0.0015)) 
lapply(DF[,-1],function(x){lines(density(x),col = adjustcolor('black', alpha.f = .5))} 
) 

enter image description here Если вы хотите использовать цвета, вы могли бы рассмотреть что-то вроде этого:

#making a palette 
mycols <- rainbow(ncol(DF)) 

#plotting, now using numerical column indices to access colour at same time 
plot(density(DF[,1]),col = adjustcolor(mycols[1], alpha.f = .5),ylim=c(0,0.0015)) 
lapply(2:ncol(DF),function(x){lines(density(DF[,x]),col = adjustcolor(mycols[x], alpha.f = .5))} 
) 
#add legend 
legend(x=1100, y=0.0015,col=mycols,lty=1,legend=colnames(DF)) 

enter image description here

5

Использование stack и ggplot2:

library(ggplot2) 

head(stack(DF)) 
# values ind 
# 1 763 V1 
# 2 833 V1 
# 3 620 V1 
# 4 819 V1 
# 5 148 V1 
# 6 549 V1 

ggplot(stack(DF)) + 
    geom_density(aes(x = values, color = ind)) 

Plot 01

Если плотность достаточно близко друг к другу, и вам требуется "хвосты", вы, вероятно, может сойти с рук следующее:

l <- density(DF$V1) 

ggplot(stack(DF)) + 
    geom_density(aes(x = values, color = ind)) + 
    xlim(range(l$x)) 

Plot with tails