我想通过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