如何用 R 中的折线图表示变量簇内的子簇
How to represent subclusters within clusters on variables with a line graph in R
我想使用折线图表示变量集群中的子集群。我正在使用 R.
我有两个分类变量(簇;在下面表示为 a、b、c),它们是嵌套的,因此每个簇中都有多个子簇(a1、a2、a3、b1、b2 等)。
我还有多个数值变量,我想按集群和子集群显示。我想用折线图来显示数值变量的均值。我已经成功地显示了使用 summarize()、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")
提前谢谢你。如果我可以提供更多详细信息,请告诉我。
您可以通过
达到您想要的结果
- 使用 cluster1 和 cluster2 的方式创建数据框
- 将此数据帧传递给第二个
geom_line
的 data
参数
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)
您可以使用不同的 data
原点来绘制不同的数据层,如 geom_line(data = plotU, ...)
df <- data.frame(cases,cluster1,cluster2,v1,v2,v3) |>
pivot_longer(cols = starts_with("v"), names_to = "variable")
plotD <- df |>
group_by(variable, cluster1, cluster2) |>
summarize(value = mean(value), .groups = "drop")
plotU <- df |>
group_by(variable, cluster1) |>
summarize(value = mean(value), .groups= "drop")
ggplot(plotD, aes(x = variable, y = value)) +
geom_line(aes(group = cluster2), alpha = 0.5, lty = 2) +
geom_line(data = plotU, color = "black", group = "cluster1", size = 1.4) +
ylab("Mean")+
theme(axis.text.x = element_text(angle = 90,hjust = 1,vjust=0.3))+
facet_wrap(facets="cluster1")
我想使用折线图表示变量集群中的子集群。我正在使用 R.
我有两个分类变量(簇;在下面表示为 a、b、c),它们是嵌套的,因此每个簇中都有多个子簇(a1、a2、a3、b1、b2 等)。
我还有多个数值变量,我想按集群和子集群显示。我想用折线图来显示数值变量的均值。我已经成功地显示了使用 summarize()、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")
提前谢谢你。如果我可以提供更多详细信息,请告诉我。
您可以通过
达到您想要的结果- 使用 cluster1 和 cluster2 的方式创建数据框
- 将此数据帧传递给第二个
geom_line
的
data
参数
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)
您可以使用不同的 data
原点来绘制不同的数据层,如 geom_line(data = plotU, ...)
df <- data.frame(cases,cluster1,cluster2,v1,v2,v3) |>
pivot_longer(cols = starts_with("v"), names_to = "variable")
plotD <- df |>
group_by(variable, cluster1, cluster2) |>
summarize(value = mean(value), .groups = "drop")
plotU <- df |>
group_by(variable, cluster1) |>
summarize(value = mean(value), .groups= "drop")
ggplot(plotD, aes(x = variable, y = value)) +
geom_line(aes(group = cluster2), alpha = 0.5, lty = 2) +
geom_line(data = plotU, color = "black", group = "cluster1", size = 1.4) +
ylab("Mean")+
theme(axis.text.x = element_text(angle = 90,hjust = 1,vjust=0.3))+
facet_wrap(facets="cluster1")