ggplot2堆积直方图 - 转换为密度图

时间:2016-04-19 14:26:05

标签: r ggplot2 histogram probability-density

我可以使用ggplot2轻松制作堆积直方图,并在y轴上进行计数。我想要的是用密度来转换这个图。我可以通过将aes(y = .. density ..)添加到geom_histogram图层来完成此操作;但ggplot所做的是绘制每个单独数据系列的密度,每个数据系列的总面积为1。因此,如果您在一个直方图中堆叠4个数据系列,则条形图的总面积将为4。

我所追求的是根据密度绘制堆积直方图,但在计算密度时考虑所有数据系列。换句话说......我希望密度堆积直方图具有与计数直方图相同的比例条。

3 个答案:

答案 0 :(得分:1)

library(ggplot2)
dtDataset = data.frame(
   V1 = c('a','b'),
   V2 = runif(20)
)

ggplot(dtDataset) + 
   geom_density(aes(x = V2, group = V1), position = 'stack')

答案 1 :(得分:0)

我找到了一种方法来执行此操作,包括计算binwidth = bw,并将y变量设置为(..count..)/(n*bw),其中n是数据点。

生成一些玩具数据

    require(ggplot2)

    set.seed(1234)
    x1 <- rnorm(10000, 0, 1)
    x2 <- rnorm(90000, 1, 1)
    X <- data.frame(x = c(x1, x2), 
                    Class = as.factor(c(rep(1, length(x1)), rep(2, length(x2)))))

计算n和binwidth

    n <- dim(X)[1]
    bw <- 3.49 * sd(X[, "x"]) * dim(X)[1]^(-1/3)  ## binwidth using Scott's rule.

生成情节

    p1 <- ggplot(data = X, aes(x = x, bw = bw, n = n)) + 
            geom_histogram(aes(y = (..count..)/(n * bw), fill = Class), 
                           binwidth = bw) + 
            geom_density()

    print(p1)

现在每个箱子根据每个类别中包含点的比例着色,并且符合黑色线条给出的密度定义。

multi-class histogram

答案 2 :(得分:0)

如上所述,您可以自己计算频率密度,但是可以计算ggplot中的总数n和bin宽度的变量。 count n只是计数之和,对于bin宽度,您可以使用内部变量宽度。如果您想要相对频率而不是频率密度,请不要除以宽度。

library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, y = stat(count / sum(count) / width), fill = Species)) +
  geom_histogram()
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

reprex package(v0.3.0)于2020-04-30创建