首页 > 解决方案 > ggplot facet_wrap histogram 使用 binwidth 作为列值

问题描述

我有一个要在其上使用 facet_wrap 的 data.frame。我的数据如下所示:

head(anomalize_long_facet_tbl, 18)
# A time tibble: 18 x 4
# Index:  arrival
# Groups: time_segment [9]
   arrival             value time_segment                    bw_value
   <dttm>              <int> <chr>                              <dbl>
 1 2019-01-01 00:00:00   300 arr_to_dta_minutes                 66.4 
 2 2019-01-01 00:00:00    83 dta_to_adm_ord_entry_minutes        9.53
 3 2019-01-01 00:00:00     2 adm_ord_to_adm_confirm_minutes      7.46
 4 2019-01-01 00:00:00     2 adm_confirm_to_tack_minutes         2.39
 5 2019-01-01 00:00:00    17 track_to_adm_bed_minutes            3.42
 6 2019-01-01 00:00:00   346 adm_bed_to_leave_ed_minutes        41.6 
 7 2019-01-01 00:00:00    12 first_non_er_bed_minutes          126.  
 8 2019-01-01 00:00:00   750 arrival_to_leave_ed_minutes       118.  
 9 2019-01-01 00:00:00   762 arr_to_first_non_er_bed_minutes   126.  
10 2019-01-01 00:00:00   156 arr_to_dta_minutes                 66.4 
11 2019-01-01 00:00:00    53 dta_to_adm_ord_entry_minutes        9.53
12 2019-01-01 00:00:00     5 adm_ord_to_adm_confirm_minutes      7.46
13 2019-01-01 00:00:00     0 adm_confirm_to_tack_minutes         2.39
14 2019-01-01 00:00:00     4 track_to_adm_bed_minutes            3.42
15 2019-01-01 00:00:00   239 adm_bed_to_leave_ed_minutes        41.6 
16 2019-01-01 00:00:00     8 first_non_er_bed_minutes          126.  
17 2019-01-01 00:00:00   457 arrival_to_leave_ed_minutes       118.  
18 2019-01-01 00:00:00   465 arr_to_first_non_er_bed_minutes   126.  

我想使用数据创建一个 3x3 facet_wrap geom_histogram 图。我写了以下内容:

anomalize_long_facet_tbl %>%
  ggplot(
    mapping = aes(
      x = value
      , fill = time_segment
      , group = time_segment
    )
  ) +
  facet_wrap(~ time_segment) +
  geom_histogram(binwidth = anomalize_long_facet_tbl$bw_value) +
  theme_tq()

我收到以下错误:

Warning messages:
1: Computation failed in `stat_bin()`:
length(width) == 1 is not TRUE 

所以很明显要么我的语法是错误的,要么我的理解是错误的。这种事情可以通过ggplot来完成吗?我已经设法通过常规的 hist() 循环来做到这一点:

par(mfrow = c(3,3))
for(i in 1:length(cols_to_anomalize)){
  c <- cols_to_anomalize[i]
  title <- str_c("Hist for: ", c %>% str_to_title())
  filt_col <- str_c("anomaly_", c)
  df_tmp <- df_tbl %>%
    filter(!!sym(filt_col) == "No") %>%
    select(contains(c), -contains("anomaly_")) %>%
    pull() %>%
    enframe()
  bw <- optBin(df_tmp$value)
  bw <- bw %>%
    enframe() %>%
    mutate(lag_1 = lag(value, n = 1)) %>%
    mutate(lag_1 = case_when(
      is.na(lag_1) ~ value
      , TRUE ~ lag_1
    )) %>%
    mutate(lag_1_delta = value - lag_1) %>%
    select(lag_1_delta) %>%
    tail(1) %>%
    pull()

  hist(df_tmp$value, main = title, breaks = bw)
}
par(mfrow = c(1,1))

这是使用基本 hist() 函数的图: 在此处输入图像描述

标签: rggplot2

解决方案


推荐阅读