我想用ggplot2创建一个人口金字塔。这个问题被问到before,但我相信解决方案肯定要简单得多。
test <- (data.frame(v=rnorm(1000), g=c('M','F')))
require(ggplot2)
ggplot(data=test, aes(x=v)) +
geom_histogram() +
coord_flip() +
facet_grid(. ~ g)
生成了这个图像。在我看来,创建人口金字塔唯一缺少的步骤是反转第一个面的x轴,这样它从50变成0,同时保持第二个面不变。有人能帮忙吗?
4条答案
按热度按时间2wnc66cl1#
这里有一个不分面的解决方案。首先,创建数据框。我使用1到20的值来确保没有一个值是负的(使用人口金字塔,你不会得到负的计数/年龄)。
然后分别为每个
g
值合并两个geom_bar()
调用。对于F
,计数按原样计算,但对于M
,计数乘以-1以获得相反方向的条形图。然后使用scale_y_continuous()
获得轴的漂亮值。更新
由于参数
subset=.
在最新的ggplot2
版本中被弃用,因此使用函数subset()
可以获得相同的结果。3duebb1j2#
人口金字塔的通用ggplot代码模板(如下)
1.使用
geom_col()
,而不是geom_bar()
,后者具有更好的默认值stat
,并避免了对coord_flip()
的需要1.通过在刻度函数中使用
labels = abs
,避免手动设置标签分隔符。1.具有相同的男性和女性水平轴(和标签),以便于性别之间的比较-在lemon包中使用
scale_x_symmetric()
。1.仅使用一个几何体,避免了对数据进行子集化的需要;如果你想在一个小平面图中创建多个金字塔,这是很有用的。
正在创建数据...
剧情代码...
ifmq2ha23#
扩展@gjabel的帖子,这里是一个更清晰的人口金字塔,同样使用ggplot 2。
pw9qyyiw4#
看看我的人口金字塔:
使用生成的数据,您可以执行以下操作: