ggplot按变量的级别绘制多个图

时间:2018-04-26 17:37:59

标签: r ggplot2 dplyr histogram data-visualization

我有一个样本数据集

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)

Histogram output

这样做了但如果你仔细观察,比例是错误的。它没有计算每个组的比例,而是一个很大的比例。我希望每组的数字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)

dplyr output

最后,我尝试使用color

进行保理
ggplot(data=d)+geom_histogram(aes(x=n,y=..count../sum(..count..),color=group),binwidth = 1)

但结果远非理想。我打算接受一个输出,但是并排放置垃圾箱,而不是彼此叠加。

color=group output

总之,我想绘制两个单独的直方图,每组中计算出正确的比例。如果没有简单的方法可以做到这一点,我可以使用一个图表但是并排放置垃圾箱,并且每个组的比例都是正确的。在这个例子中,数字1的比例应该是0.6。

2 个答案:

答案 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