ggplot2中具有可变大小binwidth的直方图

时间:2013-10-15 19:30:42

标签: r ggplot2 histogram

我有以下数据

 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 中解决这个显而易见的问题。任何人都可以帮助我吗?

2 个答案:

答案 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..

Count Histogram

##OP's code
ggplot(dati) +  geom_histogram(aes(x=class, weight=num),
 breaks = bins)

Density Histogram

您可以在##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