如何使用 y 轴上的频率以外的变量在 R 的直方图中制作分组箱?

How to make grouped bins in histogram in R with a variable other than frequency on the y axis?

直方图的经典示例是:x = 某些连续变量的已定义分箱,y = 这些分箱出现的频率。

我的情况:

我有一个数据集,其中一列为 U.S。邮政编码和其他包含有关这些邮政编码的各种统计信息的列(其中两个是 median_household_income 和人口)。

我想制作一个直方图类型的图,其中 x 轴是变量 median_household_income 的箱子(以 10,000 美元为增量),而 y 轴不仅仅是那些频率的其他东西箱子发生——特别是这些箱子的平均人口。 (例如,$40,000-$60,000 箱中所有拉链的人口将取平均值,人口平均值将是条在 y 轴上的高度)。

hist 函数以及 ggplot2 的直方图函数似乎没有放置 y 轴的选项。它只是默认为频率。

我在使用 ggplot2 的 ddplygeom_bar 函数时运气不错,这让我可以使用这两行代码将人口放在 y 轴上:

population = ddply(data, "median_household_income", summarise, population = mean(data$population))

ggplot(population, aes(x = factor(data$median_household_income), y = data$population)) + geom_bar(stat = "identity")

...但这不允许我指定垃圾箱大小,从而无法对邮政编码进行分组。它只是为我的数据集中的每个邮政编码生成一个单独的条形图(这显然使得不可能平均垃圾箱的人口,因为首先没有任何垃圾箱)。

有什么帮助吗?

没有可重现的数据集,我无法证明您具体使用的是什么,但我怀疑您正在寻找从头开始创建条形图的方法。您需要创建一列必需的箱子,可能使用 cut 对您想要聚合的任何因素,自己进行聚合,然后绘制它。

这是一个玩具示例,按收入等级汇总,然后计算其中的平均人口和收入中位数;

data <- data.frame(population=c(10,20,14,12,32)*1e5, 
                   income=c(3.1,2.2,1.3,4.1,1.1)*1e5)
data$bins <- cut(data$income, breaks=c(0,1e5,2e5,3e5,4e5,5e5))

library(dplyr) ## I prefer dplyr myself, but note: not compatible with plyr
data2 <- data %>% 
  group_by(bins) %>% 
  summarise(avgpop=mean(population), medinc=median(income))

将其绘制为平均人口(按 bin)与 bin 的条形图,并将每个 bin 的收入中位数添加为文本;

library(ggplot2)
ggplot(data2, aes(x=bins, y=avgpop, group=bins, fill=factor(bins))) + 
  geom_bar(stat="identity") + 
  geom_text(aes(x=bins, y=1e5, label=paste0("$",medinc)))

编辑:如果你想保留所有分箱组,而不仅仅是那些有一些数据的组(since dplyr::summarise silently drops those),那么你可以将数据合并回箱列表

data <- data.frame(population=c(10,20,14,12,32)*1e5, 
                   income=c(3.1,3.2,1.3,4.1,1.1)*1e5) ## modified for empty bin
data2 <- data %>% 
  group_by(bins) %>% 
  summarise(avgpop=mean(population), medinc=median(income))

data2 %>% merge(data, by="bins", all.y=TRUE)

data3 <- data2 %>% 
  merge(data.frame(bins=levels(data$bins)), by="bins", all=TRUE) %>%
  replace(is.na(.), 0)

ggplot(data3, aes(x=bins, y=avgpop, group=bins, fill=factor(bins))) + 
  geom_bar(stat="identity") + 
  geom_text(aes(x=bins, y=1e5, label=paste0("$",medinc)))