覆盖多个fviz群集

时间:2018-10-02 08:46:18

标签: r ggplot2 plot

我想在一个图(具有相同数据)中显示几个透明的叠加的“ fviz_cluster”图:

library(ggplot2)
library(dbscan)
library(factoextra)
d = cbind(iris$Sepal.Length, iris$Sepal.Width)
# cluster the data (could be k-means, or any other method)
clus = dbscan(d, eps=0.2, minPts=5)
fviz_cluster(clus, data=iris,
             choose.vars=c("Sepal.Length", "Sepal.Width"),
             ellipse.type="convex", geom="point", show.clust.cent=FALSE)

enter image description here

# cluster again with different parameters
clus2 = dbscan(d, eps=0.3, minPts=5)
# How would I overlay the outlines and shading of the 'clus2' clusters

enter image description here

所以我想要的是这两个图的叠加。我当然会更改第二个的调色板。是否可以通过现成的fviz_cluster来执行此操作,还是必须进入内部?令我惊讶的是fviz_cluster应该基于“ ggplot2”,但不允许分层绘制,除非我错过了一些东西。

1 个答案:

答案 0 :(得分:1)

粗心组合的集群

fviz_cluster()很高兴使用clusterdata绘制任何内容,因此您可以粗略地组合数据并对其进行绘制,但这并没有实现离群值功能,例如:

combined <- data.frame(cluster=clus1$cluster)
combined <- rbind(combined,
                  data.frame(cluster=ifelse(clus2$cluster > 0,
                                            clus2$cluster + max(combined$cluster),
                                            0)))
combined$data <- rbind(iris, iris)

fviz_cluster(combined,
             choose.vars=c("Sepal.Length", "Sepal.Width"),
             ellipse.type="convex",
             geom="point", show.clust.cent=FALSE)

fviz_cluster() plotting two crudely combined clusters

实施dbscan合并

您可以通过编写自己的函数来合并两个或更多dbscan对象,但这可能不会比以前的示例好得多。

从外部组合

ImageMagick可以将图像混合在一起并更改颜色。我认为这不会很好地工作,因为这些点的重叠以及它们的外观会发生变化,从而使图例不完整,等等,但这是一个示例:

convert AWRRa.png -modulate 100,100,120 \
    \( AN4Ng.png -alpha set -channel a -evaluate set 70% +channel \) \
    -compose over -composite blended.convert.png

The two plots from question combined with ImageMagick

动画时间!

该问题的切线答案,但值得通过gganimate或使用ImageMagick组合ggsave()框架来探索(取决于您的媒介),例如:

ggplot png frames combined as an animated gif by ImageMagick

多张图片

使用grid.arrange()放弃并转到多个地块是另一种选择!