我有一个样本数据集
d=data.frame(n=rep(c(1,1,1,1,1,1,2,2,2,3),2),group=rep(c("A","B"),each=20),stringsAsFactors = F)
我想基于组变量绘制两个单独的直方图。
我在@jenesaisquoi尝试了这个方法,在另一篇文章中 Generating Multiple Plots in ggplot by Factor
ggplot(data=d)+geom_histogram(aes(x=n,y=..count../sum(..count..)),binwidth = 1)+facet_wrap(~group)
这样做了但如果你仔细观察,比例是错误的。它没有计算每个组的比例,而是一个很大的比例。我希望每组的数字1的比例为0.6,而不是0.3。
然后我尝试了dplyr包,它甚至没有创建两个图。它忽略了group_by
命令。除了比例是正确的。
d%>%group_by(group)%>%ggplot(data=.)+geom_histogram(aes(x=n,y=..count../sum(..count..)),binwidth = 1)
最后,我尝试使用color
ggplot(data=d)+geom_histogram(aes(x=n,y=..count../sum(..count..),color=group),binwidth = 1)
但结果远非理想。我打算接受一个输出,但是并排放置垃圾箱,而不是彼此叠加。
总之,我想绘制两个单独的直方图,每组中计算出正确的比例。如果没有简单的方法可以做到这一点,我可以使用一个图表但是并排放置垃圾箱,并且每个组的比例都是正确的。在这个例子中,数字1的比例应该是0.6。
答案 0 :(得分:2)
通过将..count ../ sum(.. count ..)更改为..density ..,它可以为您提供所需的比例
ggplot(data = d)+ geom_histogram(aes(x = n,y = .. density ..),binwidth = 1)+ facet_wrap(~group)
答案 1 :(得分:0)
你实际上通过变量正确分离图表!特别是对于ggplot,您有时需要将图形的比例与形状分开考虑。无论规模如何,Facet_wrap
都会为您的数据应用新图层。无论你的轴是什么,它都会表现得一样。您也可以尝试添加scale_y_log10()
作为图层,您会注意到图表的整体形状和样式是相同的,您刚刚更改了轴。
您实际需要的是修正您的秤。可以理解 - 频率图可能令人困惑。 ..count../sum(..count..))
将每个bin视为独立单元,无论其值如何。在这里看到一个很好的解释:Show % instead of counts in charts of categorical variables
你想要的是..density..
,基本上是计数除以总数。差异在原则上是微妙的,但重要的是x轴上的值很重要。对于极端情况,请参见此处:Normalizing y-axis in histograms in R ggplot to proportion,其中微小的x轴值产生巨大的密度。
您的原始代码仍可使用,只需替换上述美学。
ggplot(data=d)+geom_histogram(aes(x=n,y=..density..,)binwidth = 1)+facet_wrap(~group)
如果你仍然对密度感到困惑,很多人也是如此。 Hadley Wickham写了一篇关于它的长篇文章,你可以在这里找到:http://vita.had.co.nz/papers/density-estimation.pdf