专门的箱线图:绘制错误条线以突出显示 R 中的数据范围

Specialised Boxplot: Plotting Lines to the Error Bars to Highlight the Data Range in R

概览

我有一个名为 ANOVA.Dataframe.1 的数据框(见下文) 包含 因变量 称为 'Canopy_Index',独立变量称为“Urbanisation_index”。

我的目标是为每个 Canopy Cover (%) 制作一个箱线图 (与下面的预期结果完全相同) 城市化指数 的类别,标绘线指向误差条的底部和顶部以突出显示数据范围。

我进行了大量搜索以找到生成所需箱线图的代码 (请查看所需结果),但我没有成功,而且我也不确定如果这些箱线图有专门的名称。

也许这可以在 ggplotBase R

中实现

如果有人能提供帮助,我将不胜感激。

期望的结果 ( Reference)

我可以用下面的 R 代码生成一个普通的箱线图,但我不知道如何实现指向误差线末端的线条。

R-code

Boxplot.obs1.Canopy.Urban<-boxplot(ANOVA.Dataframe.1$Canopy_Index~ANOVA.Dataframe.1$Urbanisation_index,
                               main="Mean Canopy Index (%) for Categories of the Urbansiation Index",
                               xlab="Urbanisation Index",
                               ylab="Canopy Index (%)")

从 R 代码生成的箱线图

数据框1

structure(list(Urbanisation_index = c(2, 2, 4, 4, 3, 3, 4, 4, 
4, 2, 4, 3, 4, 4, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 
2, 2, 2, 4, 4, 3, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 4, 4, 4, 
4, 4, 4, 4), Canopy_Index = c(65, 75, 55, 85, 85, 85, 95, 85, 
85, 45, 65, 75, 75, 65, 35, 75, 65, 85, 65, 95, 75, 75, 75, 65, 
75, 65, 75, 95, 95, 85, 85, 85, 75, 75, 65, 85, 75, 65, 55, 95, 
95, 95, 95, 45, 55, 35, 55, 65, 95, 95, 45, 65, 45, 55)), row.names = c(NA, 
-54L), class = "data.frame")

数据帧 2

structure(list(Urbanisation_index = c(2, 2, 4, 4, 3, 3, 4, 4, 
4, 3, 4, 4, 4, 4, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 
2, 2, 2, 4, 4, 3, 2, 2, 2, 2, 2, 2, 1, 1, 4, 4, 4, 4, 4, 4, 4
), Canopy_Index = c(5, 45, 5, 5, 5, 5, 45, 45, 55, 15, 35, 45, 
5, 5, 5, 5, 5, 5, 35, 15, 15, 25, 25, 5, 5, 5, 5, 5, 5, 15, 25, 
15, 35, 25, 45, 5, 25, 5, 5, 5, 5, 55, 55, 15, 5, 25, 15, 15, 
15, 15)), row.names = c(NA, -50L), class = "data.frame")

爱丽丝,这是你要找的吗?

你可以用 ggplot2 做任何事情,但对于非标准的东西你必须玩一会儿。我的代码:

library(tidyverse)
library(wrapr)

df %.>%
  ggplot(data = ., aes(
    x = Urbanisation_index,
    y = Canopy_Index,
    group = Urbanisation_index
  )) +
  stat_boxplot(
    geom = 'errorbar',
    width = .25
  ) +
  geom_boxplot() +
  geom_line(
    data = group_by(., Urbanisation_index) %>%
      summarise(
        bot = min(Canopy_Index),
        top = max(Canopy_Index)
      ) %>%
      gather(pos, val, bot:top) %>% 
      select(
        x = Urbanisation_index,
        y = val
      ) %>%
      mutate(gr = row_number()) %>%
      bind_rows(
        tibble(
          x = 0,
          y = max(.$y) * 1.15,
          gr = 1:8
        )
      ),
    aes(
      x = x,
      y = y,
      group = gr
    )) +
  theme_light() +
  theme(panel.grid = element_blank()) +
  coord_cartesian(
    xlim = c(min(.$Urbanisation_index) - .5, max(.$Urbanisation_index) + .5),
    ylim = c(min(.$Canopy_Index) * .95, max(.$Canopy_Index) * 1.05)
  ) +
  ylab('Company Index (%)') +
  xlab('Urbanisation Index')