2017-02-28 1 views
1

ggplot2를 통해 dbscan 클러스터링 결과를 플롯하려고합니다. 올바르게 이해하면 현재 dbscan은 기본 플롯 기능으로 검은 색으로 노이즈를 그립니다. 우선 몇 가지 코드,ggplot2를 통한 DBSCAN 클러스터링

library(dbscan) 
n <- 100 
x <- cbind(
    x = runif(5, 0, 10) + rnorm(n, sd = 0.2), 
    y = runif(5, 0, 10) + rnorm(n, sd = 0.2) 
) 
plot(x) 
kNNdistplot(x, k = 5) 
abline(h=.25, col = "red", lty=2) 

res <- dbscan::dbscan(x, eps = .25, minPts = 4) 

plot(res, x, main = "DBSCAN") 
x <- data.frame(x) 
ggplot(x, aes(x = x, y=y)) + geom_point(color = res$cluster+1, pch = clusym[res$cluster+1]) 
+ theme_grey() + ggtitle("(c)") + labs(x ="x", y = "y") 

나는 두 가지 다른 여기 싶지는 먼저 ggplot() 통해 클러스터링 출력을 플롯하려고합니다. 피하기 위해 res$cluster을 사용한다면, plot()은 0 점 (잡음 점)이있는 점을 무시하고 res$cluster 길이의 오류는 플롯 할 실제 데이터보다 작지만 res$cluster+1을 사용하려고 시도하면됩니다 내가 원하지 않는 잡음 점에 1을 줄 것입니다. 그리고 둘째 가능하다면 clusym[] 패키지 fpc에있는 것을 시도하십시오. 레이블 1, 2, 3, ...이있는 클러스터를 플롯하고 0 개의 레이블을 무시합니다. 소음 포인트에 대한 내 레이블이 여전히 0이고 특정 기호를 지정하면 특정 색상의 노이즈 포인트에 "*"라고 말하면 회색으로 표시됩니다. 난 볼록 선체 음모에 대한 비슷한 일을하려고 스택 오버플로 게시물을 봤지만, 선체를 그려 각 클러스터에 대한 클러스터링 번호를 원한다면이 작업을 수행하는 방법을 알아 내지 못했습니다. 내가 생각한 가능성은 처음에는 노이즈가없는 포인트를 플롯하고 원래의 플롯에 원하는 색상과 기호가있는 노이즈 포인트를 추가하는 것입니다. 그러나 res$cluster 길이가 x와 같지 않으므로 오류가 발생합니다.

ggplot(x, aes(x = x, y=y)) + geom_point(color = res$cluster+1, pch = clusym[res$cluster+1]) 
+ theme_grey() + ggtitle("(c)") + labs(x ="x", y = "y") + adding noise points 

Error: Aesthetics must be either length 1 or the same as the data (100): shape, colour 

답변

0

먼저 DBSCAN의 출력으로부터 세 번째 열에 서브 세트한다 새 열 (즉, 클러스터 등) 등의 원본 데이터 및 요소로 할당하는 것을에 압정.

ggplot을 만들 때 색상 또는 모양을 클러스터에 지정할 수 있습니다. 잡음 점을 무시하는 것과 같이, 나는 다음과 같이 그것을 할 것이다.

data <- dataframe with the cluster column (still in numeric form). 
data2 <- dplyr::filter(data, cluster > 0) 
data2$cluster <- as.factor(data2$cluster) 
ggplot(data2, aes(x = x, y = y) + 
    geom_point(aes(color = `cluster`)) 
관련 문제