【问题标题】:Plot boxplots over time using multiple categories使用多个类别随时间绘制箱线图
【发布时间】:2020-12-08 21:26:47
【问题描述】:

对于标题我很抱歉,我不太确定如何询问它。 我有一个看起来像这样的数据框。

Sample=c("A","A", "A", "B","B","B","A","A", "A", "B","B","B","A","A", "A", "B","B","B","A","A", "A", "B","B","B")
Treatment=c("twiter","twiter","twiter","twiter","twiter","twiter","facebook","facebook","facebook","facebook","facebook","facebook",
            "twiter","twiter","twiter","twiter","twiter","twiter","facebook","facebook","facebook","facebook","facebook","facebook")
replicate=c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3)
time=c( 10,10,10,10,10,10,10,10,10,10,10,10,20,20,20,20,20,20,20,20,20,20,20,20)
points=c(20,40,80,20,60,120, 30,100,55, 28, 45,90, 80,20,100, 40,90,56,20,30,12,3,5,8)
length(points)

   Sample Treatment replicate time points
1       A    twiter         1   10     20
2       A    twiter         2   10     40
3       A    twiter         3   10     80
4       B    twiter         1   10     20
5       B    twiter         2   10     60
6       B    twiter         3   10    120
7       A  facebook         1   10     30
8       A  facebook         2   10    100
9       A  facebook         3   10     55
10      B  facebook         1   10     28
11      B  facebook         2   10     45
12      B  facebook         3   10     90
13      A    twiter         1   20     80
14      A    twiter         2   20     20
15      A    twiter         3   20    100
16      B    twiter         1   20     40
17      B    twiter         2   20     90
18      B    twiter         3   20     56
19      A  facebook         1   20     20
20      A  facebook         2   20     30
21      A  facebook         3   20     12
22      B  facebook         1   20      3
23      B  facebook         2   20      5
24      B  facebook         3   20      8

我想在每个时间点使用箱线图绘制我的数据。 我想要一个箱形图,显示带有“twitter”的示例 A 带有“facebook”的示例 A 在时间点 10 和在时间点 20 的样本“B”和“twitter”和样本 B 和“facebook”相同。

到目前为止,我可以做这样的事情。

ggplot(data,aes(x=time, y=points,color=Sample, fill=Sample, group=interaction(Sample,Treatment)), alpha=0.1) +
  geom_boxplot(alpha=0.1) +
  geom_point(position = position_dodge(width=0.75), alpha=0.2)+
  theme_bw() 

但这是错误的,我想让两个不同处理的样本 A 和 B 在每个时间点彼此相邻,以查看差异。我不想使用 facet_wrap。这对我来说是一个挑战。感谢您的宝贵时间

【问题讨论】:

  • 您的group = interaction(Sample,Treatment) 也覆盖了time 的分组。您可以通过更改为 group = interaction(Sample,Treatment, time) 来获得您所描述的内容,但这让您无法区分哪个盒子与哪个治疗搭配 - 也许标签也是按顺序排列的。
  • 谢谢,伙计,这很酷。我花了一些时间。感谢您的关注

标签: r ggplot2 dplyr


【解决方案1】:

将我的评论变成答案:您的问题是group=interaction(Sample,Treatment) 覆盖了通常会按 x 轴(时间)进行的分组。要将time 包含在分组中,请将其添加到interaction

ggplot(data,
       aes(
         x = time,
         y = points,
         color = Sample,
         fill = Sample,
         group = interaction(Sample, Treatment, time)
       ),
       alpha = 0.1) +
  geom_boxplot(alpha = 0.1) +
  geom_point(position = position_dodge(width = 0.75), alpha = 0.2) +
  theme_bw()

当然,问题仍然是无法确定哪个盒子适合哪种治疗,但我会留给你解决。

【讨论】:

    【解决方案2】:

    试试这个:

    library(dplyr)
    library(ggplot2)
    #Plot
    data %>%
      arrange(Sample) %>%
      mutate(Var=paste(Sample,Treatment),
             Var=factor(Var,levels = unique(Var),ordered = T)) %>%
      ggplot(aes(x=time,
                 y=points,
                 color=Var, fill=Var,
                 group=Var), alpha=0.1) +
      geom_boxplot(alpha=0.1)+
      geom_point(position = position_dodge(width=0.75), alpha=0.2)+
      theme_bw()+
      scale_color_manual(values=c('tomato','tomato','cyan3','cyan3'))+
      scale_fill_manual(values=c('tomato','tomato','cyan3','cyan3'))
    

    输出:

    【讨论】:

      【解决方案3】:

      如果您不介意将时间作为一个因素,您可以执行以下操作。请注意,我将您的数据转换为名为“dat”的数据框。

      dat <- data.frame(Sample=c("A","A", "A", "B","B","B","A","A", "A", "B","B","B","A","A", "A", "B","B","B","A","A", "A", "B","B","B"),
      Treatment=c("twiter","twiter","twiter","twiter","twiter","twiter","facebook","facebook","facebook","facebook","facebook","facebook",
                  "twiter","twiter","twiter","twiter","twiter","twiter","facebook","facebook","facebook","facebook","facebook","facebook"),
      replicate=c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
      time=c( 10,10,10,10,10,10,10,10,10,10,10,10,20,20,20,20,20,20,20,20,20,20,20,20),
      points=c(20,40,80,20,60,120, 30,100,55, 28, 45,90, 80,20,100, 40,90,56,20,30,12,3,5,8))
      
      dat %>%
        mutate(time = factor(time)) %>%
        ggplot(aes(x=time, y=points, color=Sample, fill=Sample), alpha=0.1) +
        geom_boxplot(alpha=0.1) +
        geom_point(position = position_dodge(width=0.75), alpha=0.2)+
        theme_bw() 
      

      【讨论】:

        猜你喜欢
        • 2021-01-25
        • 1970-01-01
        • 2021-09-30
        • 2017-11-17
        • 2021-05-19
        • 2013-01-14
        • 1970-01-01
        • 2023-04-03
        相关资源
        最近更新 更多