在 ggplot2 的错误栏上为晶须选择过滤数据?

Selecting filtered data for whiskers on an errorbar in ggplot2?

数据集样本:

sample <- structure(list(NAME = c("WEST YORKSHIRE", "WEST YORKSHIRE", "WEST YORKSHIRE", 
"WEST YORKSHIRE", "WEST YORKSHIRE", "WEST YORKSHIRE", "NOTTINGHAMSHIRE", 
"NOTTINGHAMSHIRE", "NOTTINGHAMSHIRE", "NOTTINGHAMSHIRE", "NOTTINGHAMSHIRE", 
"NOTTINGHAMSHIRE"), ACH_DATE = structure(c(17410, 17410, 17410, 
17440, 17440, 17440, 17410, 17410, 17410, 17440, 17440, 17440
), class = "Date"), MEASURE = c("DIAG_RATE_65_PLUS", "DIAG_RATE_65_PLUS_LL", 
"DIAG_RATE_65_PLUS_UL", "DIAG_RATE_65_PLUS", "DIAG_RATE_65_PLUS_LL", 
"DIAG_RATE_65_PLUS_UL", "DIAG_RATE_65_PLUS", "DIAG_RATE_65_PLUS_LL", 
"DIAG_RATE_65_PLUS_UL", "DIAG_RATE_65_PLUS", "DIAG_RATE_65_PLUS_LL", 
"DIAG_RATE_65_PLUS_UL"), VALUE = c(73.6, 66.2, 79.8, 73.7, 66.3, 
80, 77, 69.1, 83.6, 77.5, 69.6, 84.2)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -12L))

我正在尝试可视化此处所见点的误差线:

sample %>% filter(MEASURE == "DIAG_RATE_65_PLUS") %>% ggplot(aes(x=ACH_DATE, y=VALUE, group=ACH_DATE)) +
  geom_dotplot(binaxis = "y", stackdir = "center", dotsize=0.2)

正如您在 df 中看到的那样,下限和上限包含在变量 MEASURE 中,我感兴趣的点值采用长格式。

我遇到的问题是如何进一步过滤 df,以使用 yminymax 参数中的下限值和上限值。

我试过类似的方法:

sample %>% filter(MEASURE == "DIAG_RATE_65_PLUS") %>% ggplot(aes(x=ACH_DATE, y=VALUE, group=ACH_DATE)) +
  geom_dotplot(binaxis = "y", stackdir = "center", dotsize=0.2) +
  geom_errorbar(aes(x = ACH_DATE,
                    ymin = sample %>% filter(MEASURE == "DIAG_RATE_65_PLUS_LL") %>% select(VALUE),
                    ymax = sample %>% filter(MEASURE == "DIAG_RATE_65_PLUS_UL") %>% select(VALUE)),
                data = sample %>% filter(MEASURE != "DIAG_RATE_65_PLUS"),
                colour="red")

抛出错误:Error: Columns `ymin`, `ymax` must be 1d atomic vectors or lists。我试过用 as.vector 将我的输入包装到 yminymax 参数中,但这似乎没有帮助。

ggplot,与其他 tidyverse 库一样,适用于 non-standard evaluation。它期望参数中的数据框列的裸名,例如 ymin。您提供的是只有 1 列的数据框:dplyr::select returns 具有给定列的数据 frame/tibble,因此需要提供向量的错误。

sample %>% filter(MEASURE == "DIAG_RATE_65_PLUS_LL") %>% select(VALUE)
#> # A tibble: 4 x 1
#>   VALUE
#>   <dbl>
#> 1  66.2
#> 2  66.3
#> 3  69.1
#> 4  69.6

如果您真的想使用这种将所有类型的度量放在一列中并针对不同类型进行过滤的方法,dplyr::pull 采用单个列名称,returns 该列中的数据作为向量。

但是,您尝试在此数据框中处理多个问题,您可能应该将它们分开。您有观察值(均值、中位数或其他)、置信区间上限和置信区间下限。虽然 ggplot 问题的答案是 通常 长整形数据,但在这种情况下,这三个不同的问题在你的情节中有不同的位置——因此,你是最好让他们成为单独的专栏。您可以使用 tidyr::spread.

library(dplyr)
library(ggplot2)

sample %>%
  tidyr::spread(key = MEASURE, value = VALUE)
#> # A tibble: 4 x 5
#>   NAME     ACH_DATE   DIAG_RATE_65_PL… DIAG_RATE_65_PLU… DIAG_RATE_65_PLU…
#>   <chr>    <date>                <dbl>             <dbl>             <dbl>
#> 1 NOTTING… 2017-09-01             77                69.1              83.6
#> 2 NOTTING… 2017-10-01             77.5              69.6              84.2
#> 3 WEST YO… 2017-09-01             73.6              66.2              79.8
#> 4 WEST YO… 2017-10-01             73.7              66.3              80

然后使用那些具有不同用途的单独列用于您的 geom 的相应部分。

sample %>%
  tidyr::spread(key = MEASURE, value = VALUE) %>%
  ggplot(aes(x = ACH_DATE, y = DIAG_RATE_65_PLUS, group = ACH_DATE)) +
    geom_dotplot(binaxis = "y") +
    geom_errorbar(aes(ymin = DIAG_RATE_65_PLUS_LL, ymax = DIAG_RATE_65_PLUS_UL))
#> `stat_bindot()` using `bins = 30`. Pick better value with `binwidth`.

reprex package (v0.2.1)

创建于 2018-10-01