如何使用ggplot创建群集的群集图,每个群集中都有几个人。
例如:
df <- structure(list(ID = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L,
5L, 5L, 6L, 6L), .Label = c("1", "2", "3", "4", "5", "6"), class = "factor"),
cluster = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L,
3L, 3L, 3L), .Label = c("1", "2", "3"), class = "factor"),
val = c(1.2581800436601, 6.79055672604591, 9.77732860250399,
3.60806297743693, 1.14399523707107, 7.9990872181952, 3.16242988454178,
5.64627967076376, 8.82345798192546, 4.29119206266478, 8.62997844815254,
6.46683012368158), date = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
1, 2)), class = "data.frame", row.names = c(NA, -12L))
ID cluster val date
1 1 1 1.258180 1
2 1 1 6.790557 2
3 2 1 9.777329 1
4 2 1 3.608063 2
5 3 2 1.143995 1
6 3 2 7.999087 2
7 4 2 3.162430 1
8 4 2 5.646280 2
9 5 3 8.823458 1
10 5 3 4.291192 2
11 6 3 8.629978 1
12 6 3 6.466830 2
我想创建一个2x3的绘图,每个群集有3列群集,每列中有2行绘图。
我正在使用的当前代码给出了绘图的一般结构,但是有很多空白绘图:
ggplot(df, aes(date,val)) + geom_bar(stat='identity') + facet_grid(ID~cluster)
答案 0 :(得分:0)
要按群集对它们进行分组,您必须在数据中施加正确的顺序。现在,facet_wrap
将其照搬了。一种方法是重新排列df,另一种方法是创建一个虚拟变量(群集+ ID)并按所需顺序排列级别。
因此,您想在第一行中找到ID 1、3和5,在最下面一行中看到ID 2、4和6,对吗?这是一种方法:
df$ID <- factor(df$ID, levels=as.character(c(1, 3, 5, 2, 4, 6)))
ggplot(df, aes(date,val)) + geom_bar(stat='identity') +
facet_wrap(~ID + cluster, ncol=3)
注释。
具有数字值的因子很危险。在上面,我对因子水平进行了重新排序。因此,现在“ 3”(ID 3)具有因子级别“ 3”和数值 2 。由于factor有时会转换为字符串,有时会转换为数字值,因此在某些情况下可能导致混乱。另外,在分面包装图上,您无法区分与ID对应的数字和与簇对应的数字。
我的建议是始终使用显式ID,例如
df <- df %>% mutate(ID=paste0("ID.", ID), cluster=paste0("CL.", cluster))
df$ID <- factor(df$ID, levels=paste0("ID.", (c(1, 3, 5, 2, 4, 6))))
上述方法的替代方法是将facet_grid
与虚拟变量一起使用:
df$row <- factor(rep(rep(c("top", "bottom"), each=2), 3),
levels=c("top", "bottom"))
ggplot(df, aes(date,val)) + geom_bar(stat='identity') +
facet_grid(rows=vars(row), cols=vars(cluster)) +
theme(strip.text.y = element_blank())