如何使用 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 的 ddply
和 geom_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)))
直方图的经典示例是:x = 某些连续变量的已定义分箱,y = 这些分箱出现的频率。
我的情况:
我有一个数据集,其中一列为 U.S。邮政编码和其他包含有关这些邮政编码的各种统计信息的列(其中两个是 median_household_income 和人口)。
我想制作一个直方图类型的图,其中 x 轴是变量 median_household_income 的箱子(以 10,000 美元为增量),而 y 轴不仅仅是那些频率的其他东西箱子发生——特别是这些箱子的平均人口。 (例如,$40,000-$60,000 箱中所有拉链的人口将取平均值,人口平均值将是条在 y 轴上的高度)。
hist
函数以及 ggplot2 的直方图函数似乎没有放置 y 轴的选项。它只是默认为频率。
我在使用 ggplot2 的 ddply
和 geom_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)))