代码之家  ›  专栏  ›  技术社区  ›  Daniel Valencia C.

如何在R中创建分组箱线图?

  •  22
  • Daniel Valencia C.  · 技术社区  · 7 年前

    我想合并三个分组的数据集,得到一个只有两个框的图,一个用于a,一个用于B。你能建议如何得到它吗?

    我试着在R中创建一个分组箱线图。我有两个组: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)
    

    enter image description here

    如何正确地将A和B中的框分组(连接),并在尝试时将轴标题固定为简单的A和B?

    我想要类似的东西

    enter image description here

    3 回复  |  直到 6 年前
        1
  •  27
  •   r2evans    7 年前

    当数据位于 长的 格式虎钳 宽的 . 从向量开始:

    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 .)

    base R boxplot

    你也可以选择 ggplot2 :

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

    ggplot boxplot

        2
  •  3
  •   Kush Patel    7 年前

    你应该使用 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")
    

    enter image description here

        3
  •  2
  •   AAL    5 年前

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

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