在R中创建按组绘制的图

时间:2019-07-19 09:47:13

标签: r ggplot2 plot facet-wrap

如何使用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)

1 个答案:

答案 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)

注释。

  1. 具有数字值的因子很危险。在上面,我对因子水平进行了重新排序。因此,现在“ 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))))
    
  2. 上述方法的替代方法是将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())
    

enter image description here