【问题标题】:How to create a grouped boxplot in R?如何在 R 中创建分组箱线图?
【发布时间】:2017-11-24 20:16:46
【问题描述】:

我想合并分组的三个数据集并获得一个只有两个框的图,1 个用于 A,1 个用于 B。您能建议如何获得吗?

我正在尝试在 R 中创建一个分组箱线图。我有 2 个组:A 和 B,在每个组中我有 3 个子组,每个子组有 5 个测量值。

以下是我构建箱线图的方式,但如果有人有更好、更短或更简单的方法,我将不胜感激

A1 <- c(1,2,9,6,4)
A2 <- c(5,1,9,2,3)
A3 <- c(1,2,3,4,5)
B1 <- c(2,4,6,8,10)
B2 <- c(0,3,6,9,12)
B3 <- c(1,1,2,8,7)

DF <- data.frame(A1, A2, A3, B1, B2, B3)

boxplot(DF, col = rainbow(3, s = 0.5))
axis(side = 1, at = c(2,5), labels = c("A","B"))
legend("topleft", fill = rainbow(3, s = 0.5), legend = c(1,2,3), horiz = T)

如何正确分组(联合)A 和 B 中的框,并将轴标题固定为简单的 A 和 B?

我想要类似的东西

【问题讨论】:

    标签: r plot customization boxplot


    【解决方案1】:

    当数据是 long 格式而不是 wide 格式时,这样对它们进行分组会更容易。从你的向量开始:

    DF2 <- data.frame(
      x = c(c(A1, A2, A3), c(B1, B2, B3)),
      y = rep(c("A", "B"), each = 15),
      z = rep(rep(1:3, each=5), 2),
      stringsAsFactors = FALSE
    )
    str(DF2)
    # 'data.frame': 30 obs. of  3 variables:
    #  $ x: num  1 2 9 6 4 5 1 9 2 3 ...
    #  $ y: chr  "A" "A" "A" "A" ...
    #  $ z: int  1 1 1 1 1 2 2 2 2 2 ...
    
    cols <- rainbow(3, s = 0.5)
    boxplot(x ~ z + y, data = DF2,
            at = c(1:3, 5:7), col = cols,
            names = c("", "A", "", "", "B", ""), xaxs = FALSE)
    legend("topleft", fill = cols, legend = c(1,2,3), horiz = T)
    

    使用at手动控制放置,所以“视觉分组”不是很健壮。 (您可以使用width 和/或boxwex 控制它们之间的间距。)

    你也可以选择ggplot2:

    library(ggplot2)
    ggplot(DF2, aes(y, x, fill=factor(z))) +
      geom_boxplot()
    

    【讨论】:

    • 在您的第一种方法(箱线图)中,如何使轴加粗?
    • 这不是粗体,至少不是我明确做过的任何事情。它可能是与ggplot2 不同的默认字体系列等。
    【解决方案2】:

    你应该使用ggplot2

    ggplot() + 
      geom_boxplot(data = df, mapping = aes(col_name, value, fill=index))  + 
      theme( axis.text.x = element_blank()) +
      geom_segment(data=hline1, mapping=aes(x=1, y=-0.5, xend=3, yend=-0.5), size=2) +
      annotate("text", x = 2, y = -1, label = "A") + 
      geom_segment(data=hline1, mapping=aes(x=4, y=-0.5, xend=6, yend=-0.5), size=2) +
      annotate("text", x = 5, y = -1, label = "B")
    

    【讨论】:

      【解决方案3】:

      使用基础 R,我认为 @r2evans 解决方案是最好的。但是,问题中代码的更简单修复方法是使用选项xaxt="n"

      boxplot(DF, col = rainbow(3, s = 0.5), at = c(1:3,5:7), xaxt = "n")
      axis(side = 1, at = c(2,6), labels = c("A","B"))
      legend("topleft", fill = rainbow(3, s = 0.5), legend = c(1,2,3), horiz = T)
      

      这增加了格式化轴的灵活性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-22
        • 1970-01-01
        • 2016-09-14
        • 2017-09-12
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        相关资源
        最近更新 更多