繁体   English   中英

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

[英]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的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")

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

有什么帮助吗?

没有可重现的数据集,我无法证明您正在使用什么,但是我怀疑您正在寻找从头开始创建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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM