ggplot2 - Создает график плотности с накоплением по отношению к общему размеру выборки. - PullRequest
0 голосов
/ 29 апреля 2020

Предположим, у нас есть две группы, "a" и "b", с разным размером выборки.

n = 10000
set.seed(123)
dist1 = round(rnorm(n, mean = 1, sd=0.5), digits = 1)
dist2 = round(rnorm(n/10, mean = 2, sd = 0.2), digits = 1)
df = data.frame(group=c(rep("a", n), rep("b", n/10)), value=c(dist1,dist2))

Я хотел бы перевести следующий столбчатый график с накоплением на график с плотностью с накоплением.

library(ggplot2)
ggplot(data=df, aes(x=value, y=(..count..)/sum(..count..), fill=group)) +
  geom_bar()

enter image description here

Я знаю, что есть опция position="stack" для графиков плотности. Однако результат выглядит следующим образом, поскольку высота плотности зависит от размера выборки группы, а не от общего размера выборки. Следовательно, небольшая группа, в некотором смысле, чрезмерно представлена.

ggplot(data=df, aes(x=value, fill=group)) +
  geom_density(position="stack")

enter image description here

Существует ли способ создания графика плотности, который соответствует над барплотом?

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Делает ли то же самое с графиком плотности, что вы сделали с гистограммой, не то, что вы ищете?

   ggplot(data=df, aes(x=value, fill=group)) +
     geom_density( aes(y = ..count../sum(..count..)),  position="stack", alpha=.7)

, что дает

enter image description here

0 голосов
/ 29 апреля 2020

Если вы строите график плотности, ось Y отличается от той, которую вы получаете от первой гистограммы, где ваша ось Y отражает число, превышающее total . Чтобы получить что-то близкое к этому, вы можете попробовать ниже, где функция гистограммы используется, чтобы получить количество, преобразовать и затем сложить:

library(dplyr)
library(ggplot2)

RN =range(df$value)

df %>% group_by(group) %>%
do(data.frame(hist(.$value,breaks=seq(RN[1],RN[2],
length.out=40),plot=FALSE)[c("mids","counts")])) %>%
mutate(freq=counts/nrow(df)) %>%
ggplot(aes(x=mids,y=freq,col=group)) + geom_line(position="stack")

enter image description here

...