自定义R Box-Plot

时间:2016-11-15 15:32:28

标签: r max customization min boxplot

我想绘制一些Box-Plot,它显示了我的数据的中位数。与常规Box-Plot相比,我想将框扩展为我的数据的最小值和最大值,而不是四分位数。 例如:

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

x的常规Boxplot将具有以下统计数据:

  • 1:较低的胡须
  • 3:方框的下端
  • 5:中位数
  • 7:方框的上端
  • 9:上层威士忌

我想得到:

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

任何可以帮助我的人?​​

1 个答案:

答案 0 :(得分:4)

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

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

enter image description here

如果您有多个组,则可能需要先分别计算这些点。在这里,使用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"
  )

enter image description here

如果你想添加一个&#34;传奇&#34;你可能需要做一些调整。但是,使用cowplot,只需创建一个以您希望的方式标记的图表,然后将其用作图例,相对容易。下面,我创建与上面相同的boxplot(但将其保存到变量)并创建一个新的图作为图例(根据需要进行修改)。

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

给出

enter image description here