r - 如何在 R 中使用折线图表示变量上的簇内的子簇

标签 r ggplot2 hierarchical-clustering melt facet-wrap

我想使用折线图在变量上表示簇内的子簇。我正在使用 R。

我有两个分类变量(聚类;下面表示为 a、b、c),它们是嵌套的,每个聚类内都有多个子聚类(a1、a2、a3、b1、b2 等)。

我还有多个数值变量,我想按簇和子簇显示它们。我想使用折线图来显示数值变量的平均值。我已经成功地显示了使用 summarise()、melt() 和 ggplot 与 facet_wrap 来分离簇的方法。但是,我不知道如何显示子集群。

我想用粗黑线显示聚类均值,同时在同一个图表上显示子聚类均值,但“变灰”并变细以弱化它们。我已经成功地使用facet_wrap来分离簇,但我不知道如何在同一个图上获取子簇均值。

我生成了这个数据集来说明问题:

library(reshape)
library(tidyverse)

cases <- c(1:27)
cluster1 <- sort(rep(c("a","b","c"),9))
cluster2 <- sort(rep(c("a1","a2","a3","b1","b2","b3","c1","c2","c3"),3))

v1 <- runif(27,min = -2, max = 2)
v2 <- runif(27,min = -3, max = 1)
v3 <- runif(27,min = -4, max = 0)

df <- data.frame(cases,cluster1,cluster2,v1,v2,v3)

means.df <- subset(df) %>%
  group_by(cluster1)%>%
  summarise_at(vars(c(3:5)),mean)
means.df <- as.data.frame(means.df)

melt.df <- melt(means.df,id ="cluster1")

ggplot(data = melt.df,aes(x = variable, y = value, group = cluster1))+
  geom_line()+
  geom_point()+
  ylab("Mean")+
  theme(axis.text.x = element_text(angle = 90,hjust = 1,vjust=0.3))+
  facet_wrap(facets="cluster1")

提前谢谢您。如果我可以提供更多详细信息,请告诉我。

最佳答案

您可以通过以下方式达到您想要的结果

  1. 使用 cluster1 和 cluster2 的方法创建数据框
  2. 将此数据帧传递给第二个 geom_linedata 参数
library(reshape)
library(tidyverse)

set.seed(123)

means.df <- df %>%
  group_by(cluster1) %>%
  summarise(across(starts_with("v"), mean)) %>% 
  as.data.frame()

melt.df <- melt(means.df, "cluster1")

means.df2 <- df %>%
  group_by(cluster1, cluster2) %>%
  summarise(across(starts_with("v"), mean))%>% 
  as.data.frame()

melt.df2 <- melt(means.df2, c("cluster1", "cluster2"))

ggplot(data = melt.df, mapping = aes(x = variable, y = value, group = cluster1)) +
  geom_line(data = melt.df2, aes(group = cluster2), color = "grey", alpha = .6) +
  geom_line(color = "black") +
  geom_point() +
  ylab("Mean") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.3)) +
  facet_wrap(facets = "cluster1")

编辑要标记子集群,您可以使用geom_text。因为我猜你只需要一个标签,所以我过滤了映射到 x 上的最后一个类别的数据集。这样标签就会添加到该行的右侧。

base +
  geom_text(data = filter(melt.df2, variable == "v3"), aes(label = cluster2), hjust = -.1, color = "black")

但是,根据使用 geom_text 的重叠情况,恕我直言,这不是添加标签的最佳方法。至少对于随机示例数据,我建议切换到 ggrepel::geom_text_repel ,它会自动移动标签以避免标签重叠:

base +
  ggrepel::geom_text_repel(data = filter(melt.df2, variable == "v3"), aes(label = cluster2), nudge_x = .25, hjust = 0, color = "black", segment.size = .25)

关于r - 如何在 R 中使用折线图表示变量上的簇内的子簇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71210624/

相关文章:

r - xtable中的Cox回归输出-选择行/列并添加置信区间

r - 在 xyplot 中用误差线绘制 SE

r - 使用 R 代码在 A4 纸上放置多个绘图

python - HDBSCAN Python 选择簇数

python - 将 SciPy 层次树状图切割成多个阈值的簇

cluster-analysis - 二进制数据的聚类技术

r - 从 Zelig sim() 对象中提取一阶差分均值的函数调用是什么?

python - 在 Python 中使用 Rpy2 对具有翻转坐标的 ggplot2 条形图进行排序

r - 使用 ggplot2/Rstudio 进行缓慢的图形渲染 - GPU 问题?

r - ggplot2 中的离散图例中断