2017-02-28 64 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个标签(即噪点)的点,并且ggplots()将尽管出错,因为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`))