R 如何用自定义分布绘制直方图?

R 如何用自定义分布绘制直方图?,r,statistics,histogram,R,Statistics,Histogram,在一本旧的统计教科书中,我发现了一个国家人口年龄分布表: Percent of Age population ------------------ 0-5 8 5-14 18 14-18 8 18-21 5 21-25 6 25-35 12 35-45 11 45-55 11 55-65 9 65-75 6 75-85 4 似乎必须有一种

在一本旧的统计教科书中,我发现了一个国家人口年龄分布表:

Percent of Age population ------------------ 0-5 8 5-14 18 14-18 8 18-21 5 21-25 6 25-35 12 35-45 11 45-55 11 55-65 9 65-75 6 75-85 4 似乎必须有一种不那么冗长/刻薄的方式来处理它

# Copy original textbook table into two data structures
ageRanges <- list(0:5, 5:14, 14:18, 18:21, 21:25, 25:35, 35:45, 45:55, 55:65, 65:75, 75:85)
pcPop <- c(8, 18, 8, 5, 6, 12, 11, 11, 9, 6, 4)
# Make up "fake" age data points from the distribution described by the table
ages <- lapply(1:length(ageRanges), function(i) {
    ageRange <- ageRanges[[i]]
    round(runif(pcPop[i] * 100, min=ageRange[1], max=ageRange[length(ageRange)-1]), 0)
})
ages <- unlist(ages)
# Use the endpoints of the age class intervals as breaks for the histogram
breaks <- append(0, sapply(ageRanges, function(x) x[length(x)]))
hist(ages, breaks=breaks)
编辑:FWIW,结果直方图如下:


如评论中所述,使用
条形图。您可以在
条形图中指定宽度

barplot(pcPop,  width = seq(0,85,5),space=0)

这将得到您想要的:

test <- read.table(textConnection("age popperc
0-5 8
5-14 18
14-18 8
18-21 5
21-25 6
25-35 12
35-45 11
45-55 11
55-65 9
65-75 6
75-85 4"),header=TRUE,stringsAsFactors=FALSE)

midval <- sapply(strsplit(test$age,"-"),function(x) mean(as.numeric(x)))
breakval <- strsplit(test$age,"-")
breakval <- as.numeric(c(sapply(breakval,head,1),tail(unlist(breakval),1)))
hist(rep(midval,test$popperc),breaks=breakval)

如果你已经有了频率,并且它们已经被装箱了,那么就做一个条形图。@Marius:条形图的宽度不是一样吗?这种分布具有不等长度的中断。@PaulSmith-这本身并不错误,带有频率的直方图是完全有效的。
hist
函数通过更改
freq=FALSE/TRUE
输入来允许计数或密度。@最近的邮件您完全正确,我删除了我以前的评论并相应地更新了帖子。这不起作用,因为密度也需要分布在整个垃圾箱中。高度不正确。@PaulSmith您所说的密度也需要分布在料仓上是什么意思?对不起,这不是很清楚——如果料仓的间隔长度不同,就像这里的情况一样,那么杆的高度就不等于百分比。条形图的面积应该像百分比均匀分布在每个间隔上一样。我很高兴看到一种构建
直方图
对象的方法,但结果与@agstudy有相同的问题——如果箱子的间隔不同,直方图中条形图的高度不等于百分比,在第一个代码示例中,我在2.1.something和3.0.1中得到了一个OSX错误:plot.window中的错误(xlim,ylim,“”):需要有限的“ylim”值。有什么想法吗?除了稍微更改数据(虽然格式完全相同),我输入的代码完全相同。@SpankyQuigman-我不能确定是否有更多信息。我建议只做
head(test)
summary(test)
,看看有没有什么不正常的地方。谢谢您的回复。我按照你的建议做了,没有发现任何不好的地方:(我运行的确切代码在这里:)。我也在64位Windows7和R3.0.1上运行了这个程序,得到了相同的结果。
# define the histogram object and plot it
histres <- list(
breaks=breakval,
counts=test$popperc,
mids=midval,
xname="ages",
equidist = TRUE
)
class(histres) <- "histogram"
plot(histres)