如何有选择地将美学(凸包)映射到ggplot2?

时间:2018-07-06 17:30:52

标签: r ggplot2

我正在尝试将凸包覆盖在嘈杂的数据之上。我只想要主群集上的船体(而不是红色离群值)。

Toy data

在绘制所有点时我如何绘制其他所有船体?

在尝试解决方法时,我不小心使所有异常值消失了。此外,在Shiny应用程序中绘制实际数据时,形状(21-25)变形。

通过构建统计信息或修改映射可以解决此问题吗?

要求:我还想将内容保留在ggplot2中,因为这些内容都将包裹在ShinyApp中,如果用户单击复选框,则将绘制船体。每个图的簇数不同,但第一个总是离群值。

数据生成

library(dbscan)
library(ggplot2)
data("DS3")
DS3_cl <- hdbscan(DS3, minPts = 25)
DS3_comb <- DS3
DS3_comb$cluster <- as.character(DS3_cl$cluster)

图形函数/参数

cols <- c('#e41a1c','#377eb8','#4daf4a','#984ea3','#ff7f00','#a65628','#f781bf','#999999','#ffff33') 
cols_2 <-  c(NA,'#377eb8','#4daf4a','#984ea3','#ff7f00','#a65628','#f781bf','#999999','#ffff33') 

StatChull <- ggproto("StatChull", Stat, 
                     compute_group = function(data, scales) {
                       data[chull(data$x, data$y), , drop = FALSE]
                     },
                     # Do the outlier removal around here?
                     required_aes = c("x", "y")
)

stat_chull <- function(mapping = NULL, data = NULL, geom = "polygon",
                       position = "identity", na.rm = FALSE, show.legend = NA, 
                       inherit.aes = TRUE, ...) {
  layer(
    stat = StatChull, data = data, mapping = mapping, geom = geom, 
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, ...)
  )
}

plot_1 <- ggplot(data = DS3_comb, aes(X, Y, color = cluster)) + 
  geom_point(alpha = 0.4) + 
  scale_color_manual(values = cols) +
  theme_bw()

plot_2 <- plot_1 + stat_chull(fill = NA)

解决方法尝试:

plot_3 <- ggplot(data = DS3_comb, aes(X,Y, fill = cluster, color = cluster)) +
  geom_point(shape = 21, alpha = 0.4) +
  scale_fill_manual(values = cols) +
  scale_color_manual(values = cols_2) +
  theme_bw()

咨询的来源:

1 个答案:

答案 0 :(得分:1)

仅对该层的数据进行子集化。例如

plot_1 + stat_chull(fill = NA, data=subset(DS3_comb,cluster!=0))

enter image description here