如何从 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_by
和 dplyr::summarise
(包含在 tidyverse
中)。您应该按您感兴趣的两个变量(cty_interval
和 cyl
)分组,并用 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")
您可能可以通过更改条形的宽度来改进它(我认为容器中的组与下一组太接近,看起来很混乱)
我是 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_by
和 dplyr::summarise
(包含在 tidyverse
中)。您应该按您感兴趣的两个变量(cty_interval
和 cyl
)分组,并用 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")
您可能可以通过更改条形的宽度来改进它(我认为容器中的组与下一组太接近,看起来很混乱)