R 使用ggplot2 geom_tile()高亮显示由簇定义的tile组

R 使用ggplot2 geom_tile()高亮显示由簇定义的tile组,r,ggplot2,visualization,R,Ggplot2,Visualization,我使用ggplot2检查数据集的一些聚类。如果我能够通过在节点组周围画一个方框或其他方式来突出显示属于同一集群的节点组,那就太好了。在下面,您将找到一些示例代码,这些代码再现了我试图做的事情,但实际数据一如既往地更加混乱。:) 我四处寻找,找到了一个稍微不同的问题的解决方案。理想情况下,在我的例子中,边界将仅围绕集群的外部绘制 set.seed(1916) # what cluster do each user belong to? cl_df = tibble(user = 1:100, cl

我使用ggplot2检查数据集的一些聚类。如果我能够通过在节点组周围画一个方框或其他方式来突出显示属于同一集群的节点组,那就太好了。在下面,您将找到一些示例代码,这些代码再现了我试图做的事情,但实际数据一如既往地更加混乱。:)

我四处寻找,找到了一个稍微不同的问题的解决方案。理想情况下,在我的例子中,边界将仅围绕集群的外部绘制

set.seed(1916)
# what cluster do each user belong to?
cl_df = tibble(user = 1:100, cl = rep(1:3, c(20,30,50)))

df_example = 
  # create the grid
  expand.grid(user_1 = 1:100, user_2 = 1:100) %>% as_tibble %>%
  mutate(cl_1 = plyr::mapvalues(user_1, cl_df$user, cl_df$cl), 
         cl_2 = plyr::mapvalues(user_2, cl_df$user, cl_df$cl),
         same_cl = cl_1 == cl_2, 
         value = ifelse(same_cl, rnorm(sum(same_cl),1,1), rnorm(sum(!same_cl),2,1)))

df_example %>%
  ggplot(data = ., aes(x = reorder(user_1, cl_1),
                     y = reorder(user_2, cl_2), 
                     fill = value)) +
  geom_tile() + 
  scale_fill_gradientn(colours = terrain.colors(10)) +
  xlab('') + 
  ylab('') + 
  theme(axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank())
在上面的例子中,沿着对角线有三个簇,我想在每个簇周围加一个框来突出显示

提前感谢(我正走到舞台上,我可能只需要我们MS绘画!)


来自
ggforce
geom\u mark*
功能有助于完成此任务。在这种情况下,我们可以为每个
cl\u 1
组指定一个,并且我们只希望突出显示具有
same\u cl
的数据

 ...
 ggforce::geom_mark_rect(aes(group = cl_1, filter = same_cl), 
                         expand = 0, radius = 0)

您可以尝试
ggforce::geom_mark_eliple
()我不喜欢我的方法的一点是,矩形是围绕基础点绘制的,但是
geom_tile
延伸得更远。手动摆弄
展开
很简单,但我还没有找到一个好的自动方法来实现完美的对齐。谢谢!我添加了一个软糖因素,使它漂亮!这真的很好,因为我正在尝试自动生成这些数据集,并且集群端可以在数据集之间进行更改。令人惊叹的;谢谢谢谢,今天早上我真的在摆弄这台geom,但需要它更自动化一点,但geom___\n是一个方便的注意事项!值得注意的是,将
xmin
xmax
等调整0.5将使矩形边框与瓷砖间距完美对齐:
aes(xmin=19.5,xmax=50.5,ymin=19.5,ymax=50.5)
 ...
 ggforce::geom_mark_rect(aes(group = cl_1, filter = same_cl), 
                         expand = 0, radius = 0)