如何使用相对于每个面的百分比绘制多面直方图(不是条形图)?

虽然有几个关于如何使用在条形图的每个方面内缩放的百分比的SO帖子,但我没有看到任何显示如何在直方图中做到这一点.这样可能吗?

这是我研究过的两篇文章:

SO 1:Obtaining Percent Scales Reflective of Individual Facets with ggplot2这篇文章的最后一个答案表明解决方案不再适用于较新版本的ggplot2,并建议使用stat_count()但不提供示例.

SO post2:percentage on y lab in a faceted ggplot barchart?

以下代码创建一个直方图,其中所有方面的百分比(即所有条形的总和为100%)不是在每个方面内.

ggplot(iris, aes(Sepal.Width, y=(..count..)/sum(..count..))) + geom_histogram(bins=2) +
  facet_grid(~Species) + scale_y_continuous(labels = scales::percent)

《如何使用相对于每个面的百分比绘制多面直方图(不是条形图)?》

有没有办法在每个方面进行扩展?如果没有,那么转换成条形图的有效策略是什么?如果我必须走这条路线,我可以使用cut()来创建bin指标的因子,然后在facet变量的每个级别内计算bin频率(使用dplyr :: count()?),然后使用geom_bar().似乎很复杂.我怀疑有一个geom_histogram()解决方案.

谢谢你的任何想法……

最佳答案 @aosmith指出,其中一个研究帖子中的一个答案使用了..PANEL ..内部变量.考虑到这个建议,下面更新的代码确实有效,尽管有更复杂的y映射.

ggplot(iris, aes(Sepal.Width, y=(..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..])) +
  geom_histogram(bins=2) + facet_grid(~Species) + 
  scale_y_continuous(labels = scales::percent) + labs(y='% within facet')

《如何使用相对于每个面的百分比绘制多面直方图(不是条形图)?》

然而,在this SO post年,Hadley Wickham建议不要以这种方式使用..PANEL ..(以及其他内部变量).他建议在ggplot之外进行聚合.因此,问题的答案可能是您可以使用故意未记录的“..PANEL ..”变量,但要注意使用该类型功能的风险,这种功能很容易在没有解释的情况下在新版本中发生变化.

也许有人可以请求一个控制facet密度缩放的功能为’整体’,’按col’,’by row’,’by facet’.

点赞