ggplot2 直方图显示组的比例而不是计数
ggplot2 histogram showing proportion of group by bin instead of count
假设数据集由两组组成:
dataA<-rnorm(200,3,sd=2)
dataB<-rnorm(500,5,sd=3)
all<-data.frame(dataset=c(rep('A',length(dataA)),rep('B',length(dataB))),value=c(dataA,dataB))
我们可以像这样用两组绘制直方图:
ggplot(all,aes(value,fill=dataset))+geom_histogram(bins=50,position='stack')
我想获得相同类型的图,但使用每个组的 比例而不是每个 bin 的计数 。
我通过手动计算每个组的比例找到了以下方法:
ggplot(all,aes(x=value,fill=dataset))+geom_histogram(aes(y=c(..count..[..group..==1]/(..count..[..group..==1]+..count..[..group..==2]),..count..[..group..==2]/(..count..[..group..==1]+..count..[..group..==2]))),position='stack',bins=50)+ylab('proportion')
这给出了预期的结果(如下),但这是一个非常不优雅的解决方案。我可能在这里遗漏了一些东西,是否有更好的方法来获得相同(或相似)的结果?
library(ggplot2)
library(scales)
dataA<-rnorm(200,3,sd=2)
dataB<-rnorm(500,5,sd=3)
all<-data.frame(dataset=c(rep('A',length(dataA)),rep('B',length(dataB))),value=c(dataA,dataB))
ggplot(all, aes(value, fill = dataset)) +
geom_histogram(aes(y = stat(count / sum(count)))) +
scale_y_continuous(labels = scales::percent_format())
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
由 reprex package (v2.0.1)
于 2022 年 1 月 15 日创建
您可能正在寻找 position = 'fill'
而不是 'stack'
。
library(ggplot2)
set.seed(42)
dataA <- rnorm(200, 3, sd = 2)
dataB <- rnorm(500, 5, sd = 3)
all <- data.frame(
dataset = c(rep('A', length(dataA)),rep('B', length(dataB))),
value = c(dataA, dataB)
)
ggplot(all, aes(value, fill = dataset)) +
geom_histogram(bins = 50, position = 'fill')
#> Warning: Removed 14 rows containing missing values (geom_bar).
由 reprex package (v2.0.1)
于 2022 年 1 月 15 日创建
假设数据集由两组组成:
dataA<-rnorm(200,3,sd=2)
dataB<-rnorm(500,5,sd=3)
all<-data.frame(dataset=c(rep('A',length(dataA)),rep('B',length(dataB))),value=c(dataA,dataB))
我们可以像这样用两组绘制直方图:
ggplot(all,aes(value,fill=dataset))+geom_histogram(bins=50,position='stack')
我想获得相同类型的图,但使用每个组的 比例而不是每个 bin 的计数 。
我通过手动计算每个组的比例找到了以下方法:
ggplot(all,aes(x=value,fill=dataset))+geom_histogram(aes(y=c(..count..[..group..==1]/(..count..[..group..==1]+..count..[..group..==2]),..count..[..group..==2]/(..count..[..group..==1]+..count..[..group..==2]))),position='stack',bins=50)+ylab('proportion')
这给出了预期的结果(如下),但这是一个非常不优雅的解决方案。我可能在这里遗漏了一些东西,是否有更好的方法来获得相同(或相似)的结果?
library(ggplot2)
library(scales)
dataA<-rnorm(200,3,sd=2)
dataB<-rnorm(500,5,sd=3)
all<-data.frame(dataset=c(rep('A',length(dataA)),rep('B',length(dataB))),value=c(dataA,dataB))
ggplot(all, aes(value, fill = dataset)) +
geom_histogram(aes(y = stat(count / sum(count)))) +
scale_y_continuous(labels = scales::percent_format())
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
由 reprex package (v2.0.1)
于 2022 年 1 月 15 日创建您可能正在寻找 position = 'fill'
而不是 'stack'
。
library(ggplot2)
set.seed(42)
dataA <- rnorm(200, 3, sd = 2)
dataB <- rnorm(500, 5, sd = 3)
all <- data.frame(
dataset = c(rep('A', length(dataA)),rep('B', length(dataB))),
value = c(dataA, dataB)
)
ggplot(all, aes(value, fill = dataset)) +
geom_histogram(bins = 50, position = 'fill')
#> Warning: Removed 14 rows containing missing values (geom_bar).
由 reprex package (v2.0.1)
于 2022 年 1 月 15 日创建