如何从 r 中的 binned/interval 数据创建闪避条形图?

How to create dodge bar plot from binned/interval data in r?

我是 r 的新手,正在尝试在 数值变量 上创建 dodge 条形图 。拥有 binned 该变量并尝试根据 target/categorical variable 间隔可视化它的 counts

mpg数据集为例:

代码:

library(tidyverse)

mpg %>% 
  mutate(cty_interval = cut(cty,5)) %>% 
  add_count(cty_interval) %>% 
  
  ggplot(aes(x = cty_interval, y = n, fill = as.factor(cyl))) +
  geom_col(stat="identity", position = "dodge")

在区间中 相同的计数 对于 不同的 cyl 是很尴尬的。我的原始数据集也发生了同样的情况。

我不确定自己犯了什么错误。

查看传递给 ggplot 的数据框以查看数据是否有意义总是一个好主意。

在你的例子中,数据帧是:

mpg %>% mutate(cty_interval = cut(cty,5)) %>% add_count(cty_interval)

   manufacturer model      displ  year   cyl trans      drv     cty   hwy fl    class   cty_interval     n
   <chr>        <chr>      <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr>   <fct>        <int>
 1 audi         a4           1.8  1999     4 auto(l5)   f        18    29 p     compact (14.2,19.4]    105
 2 audi         a4           1.8  1999     4 manual(m5) f        21    29 p     compact (19.4,24.6]     46
 3 audi         a4           2    2008     4 manual(m6) f        20    31 p     compact (19.4,24.6]     46
 4 audi         a4           2    2008     4 auto(av)   f        21    30 p     compact (19.4,24.6]     46
 5 audi         a4           2.8  1999     6 auto(l5)   f        16    26 p     compact (14.2,19.4]    105
 6 audi         a4           2.8  1999     6 manual(m5) f        18    26 p     compact (14.2,19.4]    105
 7 audi         a4           3.1  2008     6 auto(av)   f        18    27 p     compact (14.2,19.4]    105
 8 audi         a4 quattro   1.8  1999     4 manual(m5) 4        18    26 p     compact (14.2,19.4]    105
 9 audi         a4 quattro   1.8  1999     4 auto(l5)   4        16    25 p     compact (14.2,19.4]    105
10 audi         a4 quattro   2    2008     4 manual(m6) 4        20    28 p     compact (19.4,24.6]     46

因此,n 列显示每个箱子中的汽车总数(不管 cyl 的数量)。因此,当您将它除以 cyl 时,它会显示 n 中的值(对于同一 bin 中的所有行都是相同的——比较第 1 行和第 6 行)。

它也可能在同一位置过度绘制了很多条形图(因为它为每一行绘制了一个条形图并且有很多重复)。所以你可以简单地 使用 add_count(cty_interval, cyl)(就像上面评论中建议的@qdread),但这仍然会出现一遍又一遍地过度绘制同一个条的问题。

我认为正确的方法是使用 dplyr::group_bydplyr::summarise(包含在 tidyverse 中)。您应该按您感兴趣的两个变量(cty_intervalcyl)分组,并用 summarise 计算每组中出现的次数。此外,因为这不会显示空组,所以我使用 complete 为空组添加行(否则柱状图看起来很奇怪)。

df.1 <- mpg %>% 
  mutate(cty_interval = cut(cty,5)) %>% 
  dplyr::group_by(cty_interval, cyl) %>%
  summarise(n=n()) %>%
  complete(cty_interval, cyl, fill = list(n = 0))

这导致:

   cty_interval   cyl     n
   <fct>        <int> <dbl>
 1 (8.97,14.2]      6    14
 2 (8.97,14.2]      8    59
 3 (14.2,19.4]      6    65
 4 (14.2,19.4]      8    11
 5 (19.4,24.6]      6     0
 6 (19.4,24.6]      8     0
 7 (24.6,29.8]      6     0
 8 (24.6,29.8]      8     0

情节现在是这样的:

ggplot(data=df.1, aes(x = cty_interval, y = n, fill = as.factor(cyl))) +
  geom_col(position = "dodge")

您可能可以通过更改条形的宽度来改进它(我认为容器中的组与下一组太接近,看起来很混乱)