首页 > 解决方案 > 如何绘制具有相对于每个方面的百分比的分面直方图(不是条形图)?

问题描述

虽然有几篇关于如何在条形图的每个方面使用按比例缩放的 SO 帖子,但我没有看到任何显示如何在直方图中执行此操作的帖子。有可能这样做吗?

这是我研究的两个帖子:

SO post 1:使用 ggplot2 获得反映单个方面的百分比比例这篇文章的最后一个答案表明解决方案不再适用于 ggplot2 的较新版本,并建议使用 stat_count() 但没有给出示例。

SO post2:多面ggplot条形图中y实验室的百分比?

以下代码创建了一个直方图,其百分比在所有方面(即所有条形的总和为 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 指标因子,然后计算每个层面变量级别内的 bin 频率(使用dplyr::count()?),然后使用geom_bar(). 看起来很绕。我怀疑有一个geom_histogram()解决方案。

感谢您的任何想法...

标签: rggplot2histogram

解决方案


@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')

在此处输入图像描述

但是,在这篇 SO 帖子中,Hadley Wickham 建议不要以这种方式使用 ..PANEL.. (和其他内部变量)。他建议在 ggplot 之外进行聚合。所以也许这个问题的答案是您可以使用故意未记录的“..PANEL..”变量,但要注意使用这种类型的功能的风险,它很容易在没有解释的情况下在新版本中发生变化。

也许有人可以请求一个功能来控制面的密度缩放到“整体”、“按列”、“按行”、“按面”。


推荐阅读