【问题标题】:Customize R Box-Plot自定义 R 箱线图
【发布时间】:2016-11-15 15:32:28
【问题描述】:

我想画一些箱线图,显示我的数据的中位数。与常规箱线图相比,我想将箱扩展到我的数据的最小值和最大值,而不是四分位数。 示例:

x <- c(1,3,5,7,9)

x 的常规箱线图将具有以下统计信息:

  • 1:下晶须
  • 3:盒子的下端
  • 5:中位数
  • 7:盒子上端
  • 9:上胡须

我想得到:

  • 1:盒子的下端
  • 5:中位数
  • 9:盒子的上端

谁能帮帮我?

【问题讨论】:

    标签: r max customization min boxplot


    【解决方案1】:

    ggplot 中,您可以通过在调用中设置这些截止值来明确控制它们。

    ggplot() +
      geom_boxplot(
        aes(x = 1
            , lower = min(x)
            , middle = median(x)
            , upper = max(x)
            , ymin = min(x)
            , ymax = max(x))
        , stat = "identity"
      )
    

    如果您有多个组,您可能希望先分别计算这些点。在这里,使用dplyr

    iris %>%
      group_by(Species) %>%
      summarise(min = min(Petal.Length)
                , max = max(Petal.Length)
                , median = median(Petal.Length)
                ) %>%
      ggplot() +
      geom_boxplot(
        aes(x = Species
            , lower = min
            , middle = median
            , upper = max
            , ymin = min
            , ymax = max)
        , stat = "identity"
      )
    

    如果您想添加“图例”,您可能需要进行更多调整。但是,使用cowplot 相对容易地创建一个以您想要的方式标记的图,然后将其用作图例。下面,我创建与上面相同的箱线图(但将其保存到变量中)并创建一个新图作为图例(根据需要进行修改)。

    basePlot <-
      iris %>%
      group_by(Species) %>%
      summarise(min = min(Petal.Length)
                , max = max(Petal.Length)
                , median = median(Petal.Length)
      ) %>%
      ggplot() +
      geom_boxplot(
        aes(x = Species
            , lower = min
            , middle = median
            , upper = max
            , ymin = min
            , ymax = max)
        , stat = "identity"
      )
    
    
    legendPlot <-
      data.frame(lower = 1, middle = 2, upper = 3) %>%
      ggplot(
        aes(x = 1
            , lower = lower
            , middle = middle
            , upper = upper
            , ymin = lower
            , ymax = middle
        )
      ) +
      # ggtitle("Legend") +
      geom_boxplot(stat = "identity") +
      scale_y_continuous(
        name = ""
        , breaks = 1:3
        , labels = c("Minimum", "Median", "Maximum")
      ) +
      scale_x_continuous("Legend", position = "top") +
      theme(axis.text.x = element_blank()
            , axis.title.x = element_text(face = "bold"))
    

    然后,加载cowplot(请注意,我正在重置主题,因为cowplot 会自动加载自己的主题,我不关心它)并使用plot_grid 创建布局。请注意,我在这里创建了两个单独的列,以使图例更小并垂直居中。如果你想调整细节,你可以玩rel_widthsrel_heights。 (scale 也是一个选项,但我不喜欢它与 rel_widths 一起使用的方式。)

    library(cowplot)
    theme_set(theme_minimal())
    
    
    plot_grid(
      basePlot
      , plot_grid(
        ggplot()
        , legendPlot
        , ggplot()
        , ncol = 1
      )
      , rel_widths = c(1, 0.33)
    )
    

    给予

    【讨论】:

    • 除了使用 dplyr 和 %>% 之外,还有其他方法可以提前计算值吗?似乎对我不起作用...
    • 可能。这可能是一个单独的问题,但by 可能会让您入门。 “似乎不起作用”是什么意思?
    • 这很好用。有没有办法将自定义框打印到边距并在最小/中值/最大值处添加一些注释。由于它是一个定制的盒子,我想添加一些信息以使其他人可以理解。
    • 查看编辑。此外,如果这有效并回答了您的问题,则通常接受该答案是合适的。
    • 嘿,马克。出于某种原因,当我执行代码的 cowplot 部分时,R 返回以下错误: x - from[1] 中的错误:二进制运算符的非数字参数。你有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    相关资源
    最近更新 更多