用连续变量绘制组比例

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()