![](/img/trans.png)
[英]Frequency Distribution Histogram with Bins with Two Variables on the Y-axis in R
[英]How to make grouped bins in histogram in R with a variable other than frequency on the y axis?
直方图的经典示例是:x =某些连续变量的已定义bin,y =出现这些bin的频率。
我的情况:
我有一个数据集,其中一列是美国邮政编码,而其他列则包含有关这些邮政编码的各种统计信息(其中两个是位数_房屋_收入和人口)。
我想制作一个直方图类型的图,其中x轴是变量binary_household_income的仓位(以$ 10,000为增量),而y轴不仅仅是这些仓位发生的频率,特别是那些仓位的平均值箱。 (即,将$ 40,000- $ 60,000箱中所有拉链的人口平均,而该人口平均数将是y轴上的竖线的高度)。
ggplot2的hist
函数和直方图函数似乎没有选择放置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")
...但是,这不允许我指定垃圾箱大小,因此无法指定邮政编码。 它只为我的数据集中的每个邮政编码产生一个单独的条(这显然使得不可能对箱的总体进行平均,因为首先没有任何箱)。
有什么帮助吗?
没有可重现的数据集,我无法证明您正在使用什么,但是我怀疑您正在寻找从头开始创建barplot的方法。 您需要创建一列必需的箱,可能要对任何要汇总的因素使用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))
将其绘制为平均人口(按垃圾箱)相对于垃圾箱的条形图,然后将每个垃圾箱的中位数收入添加为文本;
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)))
编辑:如果要保留所有合并的组,不仅是那些具有某些数据的组( 因为dplyr::summarise
静默删除那些 ),那么您可以将数据合并回合并列表中
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)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.