使用 stat_summary_bin 获取 ggplot 中摘要的水平线

Nic*_*CHK 5 r ggplot2

我想绘制一个 ggplot 散点图,并在其上覆盖 x 轴上均匀间隔的箱内 y 变量的平均值。

到目前为止我所拥有的是这样的:

library(tidyverse)
data(midwest)
ggplot(arrange(midwest,percollege),aes(x=percollege,y=percbelowpoverty))+
    geom_point()+ 
    stat_summary_bin(aes(x=percollege,y=percbelowpoverty),
        bins=10,fun.y='mean',geom='point',col='red')
Run Code Online (Sandbox Code Playgroud)

哪个产生 在此输入图像描述

这基本上是完美的,除了而不是红点,我想要从垃圾箱的开头延伸到垃圾箱的结尾的水平红线。

我可以模仿我想要的东西

library(tidyverse)
data(midwest)
ggplot(arrange(midwest,percollege),aes(x=percollege,y=percbelowpoverty))+
    geom_point()+ 
    stat_summary_bin(aes(x=percollege,y=percbelowpoverty),
        bins=10,fun.y='mean',geom='point',col='red',shape="-",size=50)
Run Code Online (Sandbox Code Playgroud)

这使

在此输入图像描述

这正是我想要的,除了

  1. 每次制作这样的新图表时,我都必须手动设置大小
  2. 呃,呃。

我尝试过的另一种方法是 with geom='bar',fill=NA,如果我能以某种方式让它只显示顶部栏而不显示栏的侧面或底部,这似乎很有希望。

有什么建议吗?pointrange我在将 geom 设置为or linerangeor 方面运气不佳line(前两个我还没有开始工作,最后一个只是用非水平线连接每个点)。老实说,这不是默认行为,有点令人惊讶stat_summary_bin

谢谢!

小智 3

这应该有效。我认为该rownames_to_column行可能不是必需的,而modify_if参数是必需的,因为该cut函数生成字符串而不是数值。

midwest_sum <- midwest %>%
  mutate(coll_bins = cut(percollege, breaks = 10)) %>%
  group_by(coll_bins) %>%
  summarise(bin_mean = mean(percbelowpoverty)) %>%
  rownames_to_column(var = "bin_num") %>%
  tidyr::extract(coll_bins, c("min", "max"), "\\((.*),(.*)]") %>%
  modify_if(is.character, as.numeric)


ggplot()+
    geom_point(data = midwest, aes(x=percollege,y=percbelowpoverty)) +
    geom_errorbarh(data = midwest_sum, aes(xmin = min, xmax = max, y = bin_mean), 
                   col = "red", size = 1)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!