用连续变量绘制组比例
Plotting group proportions with continuous variable
我想绘制一组水平的比例以及一个连续变量。由于 x 轴是连续的,因此实际上不可能计算每个点的比例(因为它们的数量是无限的)。因此,通常情况下,人们会将连续变量分成 bin,然后绘制它们。另一种解决方案是使用密度,但我想要 y 轴上的比例(因此,百分比),我很确定密度与比例无关。
例如,让我们使用 iris
并尝试绘制每个物种在 Sepal.Length
中的份额。可以使用 Hmisc::cut2
创建 bin,然后计算每组的比例:
library(tidyverse)
library(Hmisc)
dat <- iris %>%
mutate(Sepal.Length = Sepal.Length + rnorm(n()),
cut = cut2(Sepal.Length, g = 30, levels.mean = T)) %>%
group_by(cut) %>%
summarise(set = sum(Species == "setosa") / n(),
vir = sum(Species == "virginica") / n(),
ver = sum(Species == "versicolor") / n()) %>%
pivot_longer(-cut)
# A tibble: 90 x 3
cut name value
<fct> <chr> <dbl>
1 3.0126 set 0.6
2 3.0126 vir 0
3 3.0126 ver 0.4
4 3.7616 set 0.8
5 3.7616 vir 0
6 3.7616 ver 0.2
7 3.9898 set 0.8
8 3.9898 vir 0
9 3.9898 ver 0.2
10 4.1577 set 0.2
# ... with 80 more rows
情节看起来像这样,例如name == "ver"
dat %>%
filter(name == "ver") %>%
ggplot(aes(x = cut, y = value)) +
geom_col()
现在,有什么方法可以使这更容易、更美观吗?
特别是,使 x 轴再次连续向后,这样就可以例如在绘图的每一列之间创建一个 geom_line(也许是滚动方式?)。或者这是一种不好的做法,这就是为什么我看不到任何关于此的文档的原因?
将变量 cut
设置为数字就可以了,但可能还有更好的选择。
dat %>%
filter(name == "ver") %>%
ggplot(aes(x = as.numeric(as.character(cut)), y = value)) +
geom_col()
或者用一行:
dat %>%
filter(name == "ver") %>%
ggplot(aes(x = as.numeric(as.character(cut)), y = value)) +
geom_line()
我想绘制一组水平的比例以及一个连续变量。由于 x 轴是连续的,因此实际上不可能计算每个点的比例(因为它们的数量是无限的)。因此,通常情况下,人们会将连续变量分成 bin,然后绘制它们。另一种解决方案是使用密度,但我想要 y 轴上的比例(因此,百分比),我很确定密度与比例无关。
例如,让我们使用 iris
并尝试绘制每个物种在 Sepal.Length
中的份额。可以使用 Hmisc::cut2
创建 bin,然后计算每组的比例:
library(tidyverse)
library(Hmisc)
dat <- iris %>%
mutate(Sepal.Length = Sepal.Length + rnorm(n()),
cut = cut2(Sepal.Length, g = 30, levels.mean = T)) %>%
group_by(cut) %>%
summarise(set = sum(Species == "setosa") / n(),
vir = sum(Species == "virginica") / n(),
ver = sum(Species == "versicolor") / n()) %>%
pivot_longer(-cut)
# A tibble: 90 x 3
cut name value
<fct> <chr> <dbl>
1 3.0126 set 0.6
2 3.0126 vir 0
3 3.0126 ver 0.4
4 3.7616 set 0.8
5 3.7616 vir 0
6 3.7616 ver 0.2
7 3.9898 set 0.8
8 3.9898 vir 0
9 3.9898 ver 0.2
10 4.1577 set 0.2
# ... with 80 more rows
情节看起来像这样,例如name == "ver"
dat %>%
filter(name == "ver") %>%
ggplot(aes(x = cut, y = value)) +
geom_col()
现在,有什么方法可以使这更容易、更美观吗?
特别是,使 x 轴再次连续向后,这样就可以例如在绘图的每一列之间创建一个 geom_line(也许是滚动方式?)。或者这是一种不好的做法,这就是为什么我看不到任何关于此的文档的原因?
将变量 cut
设置为数字就可以了,但可能还有更好的选择。
dat %>%
filter(name == "ver") %>%
ggplot(aes(x = as.numeric(as.character(cut)), y = value)) +
geom_col()
或者用一行:
dat %>%
filter(name == "ver") %>%
ggplot(aes(x = as.numeric(as.character(cut)), y = value)) +
geom_line()