【问题标题】:Grouping by two variables in ggplot2在ggplot2中按两个变量分组
【发布时间】:2019-07-23 10:27:57
【问题描述】:

我正在尝试使用ggplot2 创建一个条形图,以显示某些语言数据中不同辅音的出现情况。对于大多数受试者,只有一个时间点采样,但对于某些受试者,有两个时间点。受试者被分为两个不同的组进行比较,他们的辅音产生按type(我的数据中的一个语音变量)分组。

我想在堆叠的条形图中显示每个受试者产生的辅音,然后将来自被录制两次的说话者的数据在 x 轴上彼此相邻显示。目前,ggplot 正在汇总这些数据。我不想将数据分成两个不同的图。

 exampledata <- tribble(~subject, ~group, ~time, ~consonant, ~type,  ~n,
     "1", "A", 1, "p", F, 10,
     "1", "A", 1, "t", T, 12,
     "1", "A", 1, "k", T, 50,
     "2", "A", 1, "p", T, 0,
     "2", "A", 1, "t", T, 45,
     "2", "A", 1, "k", F, 23,
     "2", "A", 2, "p", F, 2,
     "2", "A", 2, "t", T, 34,
     "2", "A", 2, "k", T, 56,
     "3", "B", 1, "p", F, 12,
     "3", "B", 1, "t", T, 13,
     "3", "B", 1, "k", F, 50,
     "4", "A", 1, "p", T, 10,
     "4", "A", 1, "t", F, 12,
     "4", "A", 1, "k", T, 50,
     "5", "B", 1, "p", T, 0,
     "5", "B", 1, "t", T, 24,
     "5", "B", 1, "k", F, 3,
     "5", "B", 2, "p", F, 23,
     "5", "B", 2, "t", F, 12,
     "5", "B", 2, "k", T, 7,
     "6", "A", 1, "p", F, 52,
     "6", "A", 1, "t", F, 12,
     "6", "A", 1, "k", T, 64
     )

我目前正在使用以下代码,生成附图:

 plot1 <- ggplot(data=exampledata, aes(x=subject, y=n, fill=type, colour = group)) +
   geom_bar(stat="identity") +
   scale_fill_manual(values=c("gray97", "gray87")) +
   scale_colour_manual(values = c("royalblue", "navyblue")) +
   theme_bw()
 plot(plot1)
 [![example bar plot][1]][1]

所以我现在要做的就是以某种方式创建一个额外的分组变量,它并排显示time 条。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    这是你想要的吗?

    plot1 <- ggplot(data=exampledata, aes(x=subject, y=n, fill=type, colour = group, group = time)) +
      geom_bar(stat="identity", position = 'dodge') +
      scale_fill_manual(values=c("gray97", "gray87")) +
      scale_colour_manual(values = c("royalblue", "navyblue")) +
      theme_bw()[![enter image description here][1]][1]
    

    【讨论】:

    • 剧情看起来不对吧?缺少主题一的 FALSE 值。
    • 差不多了,但正如@Jimbou 所说,数字堆叠不正确
    【解决方案2】:

    在@JAQuent 的回复中,虽然很优雅,但没有保留堆叠。 我建议:

    exampledata$interaction <- factor(interaction(exampledata$subject, exampledata$time),
                                      levels = sprintf("%d.%d", sort(rep(1:6, 2)), rep(1:2, 6)))
    
    plot1 <- ggplot(data=exampledata, aes(x=interaction, y=n, fill=type, colour = group)) +
      geom_bar(aes(group = subject), stat="identity") +
      scale_fill_manual(values=c("gray97", "gray87")) +
      scale_colour_manual(values = c("royalblue", "navyblue")) +
      theme_bw()
    plot(plot1)
    

    【讨论】:

      【解决方案3】:

      您可以尝试使用刻面,但删除类似面的形状

      ggplot(exampledata, aes(x= time, y=n, fill=type))  +  
        geom_col() +
        facet_grid(~subject, scales = "free_x", switch = "x") + 
        xlab("subject") + 
        theme_bw() + 
        theme(axis.text.x = element_blank(),
              axis.ticks.x = element_blank(),
              panel.border =element_blank(),
              strip.background = element_blank())
      

      【讨论】:

      • 我担心这看起来太全面了,因为我的真实数据集中有很多主题,但它看起来很棒!谢谢!
      【解决方案4】:

      这有点像 hack,但这应该完全符合您的要求。

      首先,您的数据需要包含主题、时间、组和类型的所有组合的零。像这样:

      exampledata <- tribble(~subject, ~group, ~time, ~consonant, ~type,  ~n,
                             "1", "A", 1, "p", F, 10,
                             "1", "A", 1, "t", T, 12,
                             "1", "A", 1, "k", T, 50,
                             "1", "A", 2, "p", F, 0,
                             "1", "A", 2, "t", T, 0,
                             "1", "A", 2, "k", T, 0,
                             "2", "A", 1, "p", T, 0,
                             "2", "A", 1, "t", T, 45,
                             "2", "A", 1, "k", F, 23,
                             "2", "A", 2, "p", F, 2,
                             "2", "A", 2, "t", T, 34,
                             "2", "A", 2, "k", T, 56,
                             "3", "B", 1, "p", F, 12,
                             "3", "B", 1, "t", T, 13,
                             "3", "B", 1, "k", F, 50,
                             "3", "B", 2, "p", F, 0,
                             "3", "B", 2, "t", T, 0,
                             "3", "B", 2, "k", F, 0,
                             "4", "A", 1, "p", T, 10,
                             "4", "A", 1, "t", F, 12,
                             "4", "A", 1, "k", T, 50,
                             "4", "A", 2, "p", T, 0,
                             "4", "A", 2, "t", F, 0,
                             "4", "A", 2, "k", T, 0,
                             "5", "B", 1, "p", T, 0,
                             "5", "B", 1, "t", T, 24,
                             "5", "B", 1, "k", F, 3,
                             "5", "B", 2, "p", F, 23,
                             "5", "B", 2, "t", F, 12,
                             "5", "B", 2, "k", T, 7,
                             "6", "A", 1, "p", F, 52,
                             "6", "A", 1, "t", F, 12,
                             "6", "A", 1, "k", T, 64,
                             "6", "A", 2, "p", F, 0,
                             "6", "A", 2, "t", F, 0,
                             "6", "A", 2, "k", T, 0
      ) 
      

      然后你基本上画了两个条形图。通常你会用position_nudge向左和向右偏移每个主题,以使每个主题彼此相邻。然而,由于位置参数已经被采用(“堆叠”),黑客就是将主题变成一个数字变量,直接用as.numeric(subject) - 0.125as.numeric(subject) + 0.125轻推,然后相应地格式化x轴,这样没人会注意到。

      ggplot(exampledata,
             aes(fill = type, colour = group)) +
          geom_col(
              data = subset(exampledata, time == 1),
              aes(x = as.numeric(subject) - 0.125, y = n),
              width = 0.25
          ) +
          geom_col(
              data = subset(exampledata, time == 2),
              aes(x = as.numeric(subject) + 0.125, y = n),
              width = 0.25
          ) +
          scale_fill_manual(values=c("gray97", "gray87")) +
          scale_colour_manual(values = c("royalblue", "navyblue")) +
          scale_x_continuous(limits = c(0.5, 6.5),
                             breaks = (c(1:6))) +
          xlab("subjects")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-02
        • 2019-05-03
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 2022-07-21
        相关资源
        最近更新 更多