Как сделать популяционную пирамиду с индивидуальными данными, которые показывают все возрастные уровни, даже если нет данных для этого уровня в R?

Я использовал ответ Гьябеля, чтобы создать пирамиду населения для своих данных.

Мои данные аналогичны приведенному ниже примеру, где для определенных возрастов нет представлений об этом возрасте ни у женщин, ни у мужчин.

    #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 ответ

Решение

Чтобы получить все возрасты на графике, (1) добавьте все уровни к Age фактор, который вы хотите включить в сюжет, и (2) добавить drop=FALSE в scale_x_discrete, Чтобы получить симметричную ось y, добавьте желаемый диапазон y coord_flip(),

В приведенном ниже примере возраст в 10-летних группах (кроме возраста менее 1 года) создан с использованием cut функция. Ярлыки в 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))      

введите описание изображения здесь

Если вы хотите отобразить каждое значение возраста в виде отдельной строки, а не группировать их по многолетним приращениям, вы можете сделать следующее:

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)) 
Другие вопросы по тегам