我正在使用ggplot2
,默认情况下会创建具有固定bin宽度的直方图,并且bin标签会在每个bin的中心绘制。
我想要的是一个可变宽度的直方图,其bin标签代表每个bin的终点,如下图:
为了生成这个示例图,我手动输入了bin参数并移动了bin以使它们与它们的端点对齐:
income=data.frame(lx=c(0,10,25,50,100),rx=c(10,25,50,100,150),y=c(20,28,27,18,7))
income$width = income$rx-income$lx
ggplot(income, aes(lx+width/2,y/width)) + geom_bar(aes(width=rx-lx), color='black', stat='identity') +
scale_x_continuous(breaks=unique(c(income$lx,income$rx))) + labs(x='Income (thousands of $)', y='% per thousand $')
但我想从原始数据中自动执行此操作。 (原始数据可以使用以下代码进行近似):
incomes=unlist(sapply(1:nrow(income), function(i) sample(income$lx[i]:(income$rx[i]-1),income$y[i],replace=TRUE)))
widths=unlist(sapply(1:nrow(income), function(i) rep(income$rx[i]-income$lx[i],income$y[i])))
incomes=data.frame(incomes, widths)
答案 0 :(得分:2)
您可以通过在breaks
中指定所需的geom_histogram
来生成可变宽度直方图。使用y=..density..
(而不是基于计数的默认值),以便将条形标准化为它们在总条形区域中的比例。
breaks = c(0,10,25,50,100,150)
ggplot(incomes, aes(incomes)) +
geom_histogram(aes(y=..density..),
color="black", fill="grey40", breaks=breaks) +
scale_x_continuous(breaks=breaks)