ggplot通过变量水平绘制多个图表

3

我有一个样本数据集

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建议的方法 使用因子生成多个ggplot图

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)

dplyr输出

最后,我尝试使用color进行分解。

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

但结果远非理想。我原本想接受一个输出,但是希望直方图的柱子并排而不是重叠在一起。 color=group output 总之,我想绘制两个独立的直方图,并在每个组内计算正确的比例。如果没有简单的方法可以实现这一点,我可以接受一个图表,但是希望柱子是并排的,并且每个组都有正确的比例。在这个例子中,数字1的比例应该是0.6。

ggplotgroup_by之后不会为每个组制作单独的图表;如果您需要完全分开的图表,可以尝试使用splitmap的组合。但是这可能比它值得的要复杂一些。@Luis Paulo Jorge的答案是一个好的且直接的方法。 - camille
2个回答

2

通过将..count../sum(..count..)替换为..density..,可以得到所需的比例。

ggplot(data=d)+geom_histogram(aes(x=n,y=..density..),binwidth = 1)+facet_wrap(~group)


1
太棒了!你是最棒的。 - Giovana Stein

0

你实际上已经正确地按变量分离了图表!特别是在使用ggplot时,有时候需要将图形的比例尺与形状分开考虑。Facet_wrap会对数据应用一个新的层,而不考虑比例尺。无论你的坐标轴是什么样子,它都会表现相同。你还可以尝试添加scale_y_log10()作为一个层,你会注意到整体的形状和风格保持不变,只是改变了坐标轴。

你实际上需要修正你的比例尺。可以理解的是,频率图可能会让人困惑。..count../sum(..count..))将每个区间视为独立的单位,而不考虑其值。在这里可以看到一个很好的解释:在分类变量的图表中显示百分比而不是计数

你想要的是 ..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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接