簡體   English   中英

ggplot2 堆疊直方圖 - 轉換為密度圖

[英]ggplot2 stacked histogram - convert to density plot

我可以使用 ggplot2 輕松制作堆疊直方圖,y 軸上有計數。 我想要的是根據密度轉換這個圖。 我可以通過將 aes(y=..density..) 添加到 geom_histogram 層來做到這一點; 但是 ggplot 所做的是繪制每個單獨數據系列的密度,使其總面積為 1。 因此,如果您在一個直方圖中堆疊 4 個數據系列,則條形的總面積將為 4。

我所追求的是根據密度繪制堆疊直方圖,但在計算密度時考慮所有數據系列。 換句話說......我希望密度堆疊直方圖與計數直方圖具有相同的比例條。

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

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

我找到了一種方法來執行此操作,例如計算 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)

現在,每個 bin 根據每個類中包含的點的比例着色,並符合由黑線給出的密度定義。

多類直方圖

如前所述,您可以自己計算頻率密度,但您可以計算 ggplot 中總計數 n 和 bin 寬度的變量。 計數 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 包(v0.3.0) 於 2020 年 4 月 30 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM