r - 如何使用显示所有年龄级别的个人数据制作人口金字塔,即使 R 中没有该级别的数据?

标签 r ggplot2

我使用了 gjabel answer为我的数据创建人口金字塔。

我的数据与下面的示例类似,其中对于某些年龄,无论是女性还是男性都没有该年龄的代表。

    #individual level data
    Age<-c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,3,5,10,30,90)
    Sex<- c("Male","Male","Male","Male","Male","Male","Male","Male","Male","Male","Male","Male","Male","Male","Male","Female", "Female","Female", "Female","Female")

    test <- data.frame(Age, Sex)

最终结果应该显示一个连续的 y 轴,一个从 0 到 90 的序列,中间间隔 1。如果没有人符合该年龄,那么就不会有条形图,而是显示年龄类别的空格。

  1. 我该如何在人口金字塔中将这些年龄表示为零?
  2. 如何使公侧和母侧在 x 轴上对称?我希望在我的绘图中两侧具有相同的对称 x 限制。

    require(ggplot2)
    require(plyr)    
    
    ggplot(data=test,aes(x=as.factor(round(Age)),fill=Sex)) + 
    geom_bar(data= subset(test,test$Sex=="Female")) + 
    geom_bar(data= subset(test, test$Sex=="Male"),
       mapping=aes(y=..count..*(-1)),
       position="identity") + 
    scale_y_continuous(breaks=seq(-50,50,10),labels=abs(seq(-50,50,10))) + 
    xlab("Age (years)")+ ylab("Count") + 
    scale_x_discrete(breaks = c(0,10,20,30,40,50,60,70,80,90))+
    coord_flip() 
    

最佳答案

要获取图中的所有年龄,(1) 将所有级别添加到您想要包含在图中的 Age 因子,并 (2) 添加 drop=FALSEscale_x_discrete。要获得对称的 y 轴,请将所需的 y 范围添加到 coord_flip()

下面的示例包含使用 cut 函数创建的按 10 年分组的年龄(年龄小于 1 的除外)。 scale_x_discrete 中的标签设置为与 cut 中的分组相对应。

ggplot(data=test,aes(x=cut(Age, breaks=c(-1,seq(0,100,10))), fill=Sex)) + 
  geom_bar(data=subset(test, Sex=="Female")) + 
  geom_bar(data=subset(test, Sex=="Male"), aes(y=..count..*(-1)),
           position="identity") + 
  scale_y_continuous(breaks=seq(-50,50,10),labels=abs(seq(-50,50,10))) +
  scale_x_discrete(labels=c("< 1",paste0(seq(1,91,10),"-",seq(10,100,10))), drop=FALSE) + 
  xlab("Age (years)") + ylab("Count") + 
  coord_flip(ylim=c(-20,20))      

enter image description here

如果您想将每个年龄值显示为单独的条形图,而不是将它们按多年增量分组,您可以执行以下操作:

ggplot(data=test,aes(x=factor(round(Age), levels=seq(0,100,1)), fill=Sex)) + 
  geom_bar(data=subset(test, Sex=="Female")) + 
  geom_bar(data=subset(test, Sex=="Male"), aes(y=..count..*(-1)),
           position="identity") + 
  scale_y_continuous(breaks=seq(-50,50,10),labels=abs(seq(-50,50,10))) +
  scale_x_discrete(breaks = seq(0,90,10), drop=FALSE) + 
  xlab("Age (years)") + ylab("Count") + 
  coord_flip(ylim=c(-20,20)) 

关于r - 如何使用显示所有年龄级别的个人数据制作人口金字塔,即使 R 中没有该级别的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37126453/

相关文章:

r - 当列名是数字时 dplyr 选择列

r - r 数据框中行的标识

r - 使用 ggplot 绘制函数,相当于 curve()

r - ggplot2 - boxplot 多个 data.frames 同时保持秩序

r - ggplot 更改由 x 轴值指定的线条颜色

r - ggplot : how to specify vertical order of multiple boxplots?

r - 在 R 中运行 map reduce 作业时出错

r - 使用:= and = in ggvis property assignments

R - ggplot2 在 Windows 上生成的图表质量很差

在 R 中重新排列数据框