我有以下数据
dati <- read.table(text="
class num
1 0.0 63530
2 2.5 27061
3 3.5 29938
4 4.5 33076
5 5.6 45759
6 6.5 72794
7 8.0 153177
8 10.8 362124
9 13.5 551051
10 15.5 198634
")
我想生成一个具有可变大小区间的直方图,以便每个条形图的区域反映每个区间的总数(num)。我试过了
bins <- c(0,4,8,11,16)
p <- ggplot(dati) +
geom_histogram(aes(x=class,weight=num),breaks = bins)
然而,这会产生一个直方图,其中每个条的长度等于每个bin的总数。因为箱宽度是可变的,所以区域与数量不成比例。 我无法在 ggplot2 中解决这个显而易见的问题。任何人都可以帮助我吗?
答案 0 :(得分:4)
我想你正在寻找密度图 - this closely related question有大部分答案。您在y = ..density..
中致电geom_histogram()
。
这是有效的,因为stat_bin
(回忆geom_histogram()
为geom_bar()
+ stat_bin()
,而stat_bin()
构建了一个包含count
列和{{}}的数据框{1}}。因此,调用density
会拉出右列的密度,而默认值(计数)就像调用y = ..density..
一样。
y = ..count..
##OP's code
ggplot(dati) + geom_histogram(aes(x=class, weight=num),
breaks = bins)
您可以在##new code (density plot)
ggplot(dati) + geom_histogram( aes(x=class,y = ..density.., weight=num),
breaks = bins, position = "identity")
的{{3}}中找到更多示例。
答案 1 :(得分:0)
听起来像是在询问如何制作可变尺寸的条宽。如果是这样,你只需要在你的ggplot美学中调用'width'参数:
ggplot(data, aes(x = x, y = y, width = num))
此方法在以下问题中进行了更多讨论: Variable width bars in ggplot2 barplot in R