我試圖用來ggplot2創建一個加權密度圖,顯示兩組的分布,每個組占某個分布的一小部分。我遇到的困難源于這樣一個事實,盡管兩組在資料中的觀察數量相同,但它們的權重不同,我希望圖表中每個組的區域都能反映這種權重差異。
我的資料看起來像這樣。
var <- sort(rnorm(1000, mean = 5, sd = 2))
df <- tibble(id = c(rep(1, 1000), rep(2, 1000)),
var = c(var,var),
weight = c(rep(.1, 500), rep(.2, 500), rep(.9, 500), rep(.8, 500)))
請注意,第 1 組的權重較低(0.1 或 .2),而第 2 組的權重較高(0.9 或 0.8)。另請注意,對于任何給定的值,var權重加起來為 1。在實際資料中,每個組所占的份額在 的分布中以更復雜的方式不同var。
我嘗試將這些資料繪制如下,盡管使用權重捕獲了每個組內分布變化的方式,但它沒有捕獲組間分布變化的方式。
library(ggplot2)
var <- rnorm(1000, mean = 5, sd = 2)
df %>%
ggplot(aes(x = var, group = id, fill = factor(id), weight = weight))
geom_density(position = 'stack')
結果圖看起來像這樣。

很明顯,這些組不分別占密度曲線下面積的 15% 和 85% 左右,但是當我們使用 時,這個問題就更清楚了position = 'fill'。

每個組似乎占據了相似的區域,顯然是因為在考慮分組之前應用了加權。我希望看到一個解決方案,該解決方案導致與第 1 組相關的區域與其重量相稱(即比與第 2 組相關的區域小得多)。
需要澄清的是,與每個組相關的高度應該不同。在上圖中,第 1 組和第 2 組之間的分界線應該明顯更高,從而使第 1 組占據的區域明顯更小。
uj5u.com熱心網友回復:
處理兩組的相對密度有點模棱兩可。顯然,每個組的密度需要有 1 的整數才能成為真實密度。最接近的可能是兩條曲線的積分總和為 1,我認為這需要您自己進行密度計算,然后繪制為堆疊geom_area:
library(tidyverse)
df %>%
nest(data = -id) %>%
summarize(id = factor(id),
weight = unlist(map(data, ~sum(.x$weight))),
dens = map(data, function(.x) {
x <- density(.x$var, weights = .x$weight/sum(.x$weight))
data.frame(x = x$x, y = x$y)
})) %>%
mutate(weight = weight / sum(weight)) %>%
unnest(dens) %>%
mutate(y = y * weight) %>%
ggplot(aes(x, y, fill = id))
geom_area(position = 'stack', color = 'black')
labs(y = 'density', x = 'var')

uj5u.com熱心網友回復:
我不完全確定我是否正確理解您,但也許您可以根據重量預先計算值,然后像這樣堆疊它:
library(ggplot2)
library(dplyr)
# Stacked
df %>%
mutate(weighted_var = var*weight) %>%
ggplot(aes(x = weighted_var, fill = factor(id), group = id))
geom_density(position = 'stack')

并像這樣檢查填充組:
# Fill
df %>%
mutate(weighted_var = var*weight) %>%
ggplot(aes(x = weighted_var, fill = factor(id), group = id))
geom_density(position = 'fill')

使用reprex v2.0.2創建于 2022-11-01
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/525520.html
標籤:rggplot2
上一篇:R中二維陣列中的條件切片
