【问题标题】:Population pyramid plot in RR中的人口金字塔图
【发布时间】:2020-07-04 09:24:47
【问题描述】:

我是 R 新手,并试图创建一个类似于此处https://klein.uk/teaching/viz/datavis-pyramids/ 的第一个人口金字塔图。我有一个包含两个变量性别和年龄组的数据集,如下所示:

   sex       age_group

1   Male      20-30
2   Female    50-60
3   Male      70-80
4   Male      10-20
5   Female    80-90
...   ...       ...

这是我使用的代码

ggplot(data = pyramid_graph(x = age_group, fill = sex)) +
geom_bar(data = subset(pyramid_graph, sex == "F")) + 
geom_bar(data = subset(pyramid_graph, sex == "M")) + 
mapping = aes(y = - ..count.. ),
position = "identity") + 
scale_y_continuous(labels = abs) +
coord_flip()

我没有从 R 中得到任何错误,但是当我执行此代码时会生成一个空白图像。

有人可以帮忙吗? 谢谢

【问题讨论】:

  • 你好克拉丽莎,欢迎来到 SO。如果您发布一个最小的可重现示例,您将最大限度地获得有用答案的机会。 This post 可能会有所帮助。具体来说,您需要包含您的输入数据。首先,您的输入数据集至少需要三个变量:年龄组、性别和要绘制的值。其次,我怀疑您的position="identity") 中有一个无与伦比的右括号。第三,使fill=sex 具有美感,并且只使用一个geom_bar,并对mapping 进行适当的更改。
  • 有专门的人口金字塔包,例如名副其实的 pyramid 包。
  • 这能回答你的问题吗? drawing pyramid plot using R and ggplot2

标签: r ggplot2 population


【解决方案1】:

使用来自您在问题中引用的同一网站的类似输入数据集:

# Obtain source data
load(url("http://klein.uk/R/Viz/popGH.RData"))
# Convert to summary table
df <- as_tibble(popGH) %>% 
        mutate(AgeDecade=as.factor(floor(AGE/10)*10)) %>% 
        group_by(SEX, AgeDecade) %>% 
        dplyr::summarise(N=n(), .groups="drop") %>% 
        # A more transparent way of managing the transformation to get "Females to the left".
        mutate(PlotN=ifelse(SEX=="Female", -N, N)) 
# Create the plot
df %>% ggplot() +
   geom_col(aes(fill=SEX, x=AgeDecade, y=PlotN)) +
   scale_y_continuous(breaks=c(-2*10**5, 0, 2*10**5), labels=c("200k", "0", "200k")) +
   labs(y="Population", x="Age group") +
   scale_fill_discrete(name="Sex") +
   coord_flip()

给予

请注意,我创建了一个新列来在图中创建“左侧女性”效果。通常,我会避免这样做,而是依靠各种ggplot 函数的选项来实现同样的事情(就像你试图做的那样)。但是,在这种情况下,我认为使用额外的列而不是 mkodify mapping 更加透明(和简单)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-26
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多