Как сделать популяционную пирамиду с индивидуальными данными, которые показывают все возрастные уровни, даже если нет данных для этого уровня в 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. Если нет никого с таким возрастом, то не было бы ни одного столбца, кроме пробела, в котором была бы возрастная категория.
- Как бы я представлял эти возрасты как нулевой счет в пирамиде населения?
Как сделать так, чтобы мужская и женская стороны были симметричны по оси 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))