2012-09-10 4 views
3

일부 값을 클러스터링 한 다음 그룹화했습니다. 그런 다음 ggplot2을 사용하여 일부 밀도 플롯을 플롯하고 클러스터를 오버레이합니다. 다음은 예시 이미지입니다. enter image description here클러스터 그룹별로 ggplot2의 색 농도 플롯

클러스터의 각 그룹에 대해 밀도 플롯을 플롯하고 오버레이합니다. 밀도 플롯의 색상은 클러스터링의 그룹화와 일치합니다.

내 문제는 그룹화를 기반으로 데이터를 수동으로 분리하여 개별 텍스트 테이블에 저장한다는 것입니다 (아래 코드 참조). 이는 매우 비효율적이며 대규모 데이터 세트의 경우 매우 지루할 수 있습니다. 클러스터를 개별 텍스트 테이블로 분리하지 않고 밀도 플롯을 ggplot2에 동적으로 플로팅 할 수 있습니까?

scores <- read.table(textConnection(" 
file  max  min  avg    lowest 
132   5112.0  6520.0  5728.0   5699.0 
133   4720.0  6064.0  5299.0   5277.0 
5   4617.0  5936.0  5185.0   5165.0 
1   4384.0  5613.0  4917.0   4895.0 
1010  5008.0  6291.0  5591.0   5545.0 
104   4329.0  5554.0  4858.0   4838.0 
105   4636.0  5905.0  5193.0   5165.0 
35   4304.0  5578.0  4842.0   4831.0 
36   4360.0  5580.0  4891.0   4867.0 
37   4444.0  5663.0  4979.0   4952.0 
31   4328.0  5559.0  4858.0   4839.0 
39   4486.0  5736.0  5031.0   5006.0 
32   4334.0  5558.0  4864.0   4843.0 
"), header=TRUE) 

내가 줄거리를 생성하는 데 사용되는 코드 :

원래의 입력 테이블

는이 분할되기 전에 다음과 같습니다 그리드와 기본 그래픽을 결합주의를 여전히 제대로

library(ggplot2) 
library(grid) 

layout(matrix(c(1,2,3,1,4,5), 2, 3, byrow = TRUE)) 

# define function to create multi-plot setup (nrow, ncol) 
vp.setup <- function(x,y){ 
grid.newpage() 
pushViewport(viewport(layout = grid.layout(x,y))) 
} 

# define function to easily access layout (row, col) 
vp.layout <- function(x,y){ 
viewport(layout.pos.row=x, layout.pos.col=y) 
} 

vp.setup(2,3) 

file_vals <- read.table(textConnection(" 
file  avg_vals 
133   1.5923 
132   1.6351 
1010  1.6532 
104   1.6824 
105   1.6087 
39   1.8694 
32   1.9934 
31   1.9919 
37   1.8638 
36   1.9691 
35   1.9802 
1   1.7283 
5   1.7637 
"), header=TRUE) 

red <- read.table(textConnection(" 
file  max  min  avg    lowest 
31   4328.0  5559.0  4858.0   4839.0 
32   4334.0  5558.0  4864.0   4843.0 
36   4360.0  5580.0  4891.0   4867.0 
35   4304.0  5578.0  4842.0   4831.0 
"), header=TRUE) 

blue <- read.table(textConnection(" 
file  max  min  avg    lowest 
133   4720.0  6064.0  5299.0   5277.0 
105   4636.0  5905.0  5193.0   5165.0 
104   4329.0  5554.0  4858.0   4838.0 
132   5112.0  6520.0  5728.0   5699.0 
1010  5008.0  6291.0  5591.0   5545.0 
"), header=TRUE) 

green <- read.table(textConnection(" 
file  max  min  avg    lowest 
39   4486.0  5736.0  5031.0   5006.0 
37   4444.0  5663.0  4979.0   4952.0 
5   4617.0  5936.0  5185.0   5165.0 
1   4384.0  5613.0  4917.0   4895.0 
"), header=TRUE) 


# Perform Cluster 
d <- dist(file_vals$avg_vals, method = "euclidean") 
fit <- hclust(d, method="ward") 
plot(fit, labels=file_vals$file) 
groups <- cutree(fit, k=3) 

cols = c('red', 'blue', 'green', 'purple', 'orange', 'magenta', 'brown', 'chartreuse4','darkgray','cyan1') 
rect.hclust(fit, k=3, border=cols) 


# Desnity plots 
dat = rbind(data.frame(Cluster='Red', max_vals = red$max), data.frame(Cluster='Blue', max_vals = blue$max), data.frame(Cluster='Green', max_vals = green$max)) 
max = (ggplot(dat,aes(x=max_vals))) 
max = max + geom_density(aes(fill=factor(Cluster)), alpha=.3) + xlim(c(3500, 5500)) + scale_fill_manual(values=c("red",'blue',"green")) 
max = max + labs(fill = 'Clusters') 
print(max, vp=vp.layout(1,2)) 

dat = rbind(data.frame(Cluster='Red', min_vals = red$min), data.frame(Cluster='Blue', min_vals = blue$min), data.frame(Cluster='Green', min_vals = green$min)) 
min = (ggplot(dat,aes(x=min_vals))) 
min = min + geom_density(aes(fill=factor(Cluster)), alpha=.3) + xlim(c(5000, 7000)) + scale_fill_manual(values=c("red",'blue',"green")) 
min = min + labs(fill = 'Clusters') 
print(min, vp=vp.layout(1,3)) 

dat = rbind(data.frame(Cluster='Red', avg_vals = red$avg), data.frame(Cluster='Blue', avg_vals = blue$avg), data.frame(Cluster='Green', avg_vals = green$avg)) 
avg = (ggplot(dat,aes(x=avg_vals))) 
avg = avg + geom_density(aes(fill=factor(Cluster)), alpha=.3) + xlim(c(4000, 6000)) + scale_fill_manual(values=c("red",'blue',"green")) 
avg = avg + labs(fill = 'Clusters') 
print(avg, vp=vp.layout(2,2)) 

dat = rbind(data.frame(Cluster='Red', lowest_vals = red$lowest), data.frame(Cluster='Blue', lowest_vals = blue$lowest), data.frame(Cluster='Green', lowest_vals = green$lowest)) 
lowest = (ggplot(dat,aes(x=lowest_vals))) 
lowest = lowest + geom_density(aes(fill=factor(Cluster)), alpha=.3) + xlim(c(4000, 6000)) + scale_fill_manual(values=c("red",'blue',"green")) 
lowest = lowest + labs(fill = 'Clusters') 
print(lowest, vp=vp.layout(2,3)) 
작동하지 않습니다

답변

1

이렇게하면 4 개의 패널로 원하는 플롯을 자동으로 만들 수 있습니다.

첫째, 데이터 :

scores <- read.table(textConnection(" 
file  max  min  avg    lowest 
132   5112.0  6520.0  5728.0   5699.0 
133   4720.0  6064.0  5299.0   5277.0 
5   4617.0  5936.0  5185.0   5165.0 
1   4384.0  5613.0  4917.0   4895.0 
1010  5008.0  6291.0  5591.0   5545.0 
104   4329.0  5554.0  4858.0   4838.0 
105   4636.0  5905.0  5193.0   5165.0 
35   4304.0  5578.0  4842.0   4831.0 
36   4360.0  5580.0  4891.0   4867.0 
37   4444.0  5663.0  4979.0   4952.0 
31   4328.0  5559.0  4858.0   4839.0 
39   4486.0  5736.0  5031.0   5006.0 
32   4334.0  5558.0  4864.0   4843.0 
"), header=TRUE) 

file_vals <- read.table(textConnection(" 
file  avg_vals 
            133   1.5923 
            132   1.6351 
            1010  1.6532 
            104   1.6824 
            105   1.6087 
            39   1.8694 
            32   1.9934 
            31   1.9919 
            37   1.8638 
            36   1.9691 
            35   1.9802 
            1   1.7283 
            5   1.7637 
            "), header=TRUE) 

두 데이터 프레임은 하나 하나에 병합 할 수 있습니다 :

dat <- merge(scores, file_vals, by = "file") 

맞춤 :

d <- dist(dat$avg_vals, method = "euclidean") 
fit <- hclust(d, method="ward") 
groups <- cutree(fit, k=3) 
cols <- c('red', 'blue', 'green', 'purple', 'orange', 'magenta', 'brown', 'chartreuse4','darkgray','cyan1') 

는 색 이름으로 열을 추가 (적합 기준) :

넓은 긴 형식에서

모양 변경 데이터 :

dat_re <- reshape(dat, varying = c("max", "min", "avg", "lowest"), direction = "long", drop = c("file", "avg_vals"), v.names = "value", idvar = "group", times = c("max", "min", "avg", "lowest"), new.row.names = seq(nrow(scores) * 4)) 

플롯 : 대답에 대한

p <- (ggplot(dat_re ,aes(x = value))) + 
geom_density(aes(fill = group), alpha=.3) + 
scale_fill_manual(values=cols) + 
labs(fill = 'Clusters') + 
facet_wrap(~ time) 

print(p) 

enter image description here

+0

감사합니다,하지만 어떻게 확장과에 x 축를 추가하려면 그래프? 그래프는 반드시 동일한 x 축 스케일에 맞을 필요는 없습니다. – Harpal

+0

'facet_wrap'에 대한 추가 인수를 사용하여 각 패널의 데이터 범위에 따라 x 축 범위를 허용 할 수 있습니다 : 'facet_wrap (~ time, scales = "free_x")'. ggplot2를 사용하여 패널에 다른 x 축을 지정할 수는 없습니다. 모든 패널에 대해 동일한 x 축을 갖는 것으로 충분하다면, 플롯에'+ coord_cartesian (xlim = c (3500, 7000))'을 추가 할 수 있습니다. –