金字塔图(Pyramid plot)是一种用于展示人口统计数据的图表,特别是用于展示不同年龄段的人口数量。金字塔图按年龄分层,每一层代表一个年龄组,每个层级的高度或面积代表该年龄组的人口数量。通常,男性和女性的数据会被分别展示在金字塔的两侧,形成对比。
特点和用途
年龄分层:金字塔图按年龄分层,每一层代表一个年龄组。
性别区分:男性和女性的数据通常分别展示在金字塔的两侧,形成对比。
数量表示:每个层级的高度或面积代表该年龄组的人口数量。
时间序列:可以展示不同时间点的人口结构,形成时间序列的对比。
应用场景:常用于展示人口结构、性别差异、人口趋势等。
历史背景和演变
金字塔图因其形似金字塔而得名,内部的水平线根据不同的数值大小,将金字塔的高度分割成大小不一的梯形和三角形区块。区块高度越高,占比越大,不同颜色的区块代表不同分类变量。
具体应用案例
在科研中,金字塔图常用于展示不同年龄段的人口数量和比例,比较同一年龄段内男性和女性的数量差异,观察人口增长、减少或老龄化的趋势。例如,可以展示一个地区或国家的人口结构类型是扩展型、稳定型还是收缩型。
那么怎么使用R语言绘制金字塔图(pyramid plot)【三间分布描述之分性别年龄组分布双向柱状图】呢?
我们一般需要ggplot2、reshape2两个包。我们先加载包并读取所需的绘图数据。
# 加载R包
library(ggplot2)
library(reshape2)
# 读取双向柱形图数据文件
library(readxl) #加载包
zzdata <- read_excel("C:/Users/LENOVO/Desktop/双向柱状图.xlsx")
zzdata
# 把数据转换成ggplot常用的类型(长数据)
datazz = melt(zzdata)
# melt出自reshape2包
head(datazz)
# 查看转换完成的数据的前几行
# 绘图
ggplot(datazz, aes(
x = factor(年龄组,levels = unique(年龄组)),
# 将第一列转化为因子,目的是显示顺序与文件顺序相同,否则按照字母顺序排序
y = ifelse(variable == "男", value, -value),
# 判断分组情况,将两个柱子画在0的两侧
fill = variable)) +
geom_bar(stat = 'identity')+
# 画柱形图
coord_flip()+
# x轴与y轴互换位置
geom_text(
# 在图形上加上数字标签
aes(label=value,
# 标签的值(数据框的第三列)
# vjust = ifelse(variable == "Up", -0.5, 1), # 垂直位置。如果没有coord_flip(),则可以取消这行注释
hjust = ifelse(variable == "Up", -0.4, 1.1) # 水平位置
),
size=2
# 标签大小
)+
scale_y_continuous(
# 调整y轴
labels = abs,
# 刻度设置为绝对值
expand = expansion(mult = c(0.1, 0.1))) # 在y轴的两侧,留下一部分的空白位置,防止加标签的时候,显示不全。
同样,我们可以通过读取不同的Excel表或者同一个Excel表格的不同sheet,重复以上步骤,分别绘制分性别的不同年龄阶段、婚姻状况、学历构成等图。
# 读取双向柱形图数据文件
library(readxl) #加载包
zzdata2 <- read_excel("C:/Users/LENOVO/Desktop/双向柱状图.xlsx")
zzdata2
# 把数据转换成ggplot常用的类型(长数据)
datazz2 = melt(zzdata2) # melt出自reshape2包
head(datazz2) # 查看转换完成的数据的前几行
# 绘图
ggplot(datazz2, aes(
x = factor(年龄阶段,levels = unique(年龄阶段)), # 将第一列转化为因子,目的是显示顺序与文件顺序相同,否则按照字母顺序排序
y = ifelse(variable == "男", value, -value), # 判断分组情况,将两个柱子画在0的两侧
fill = variable)) +
geom_bar(stat = 'identity')+ # 画柱形图
coord_flip()+ # x轴与y轴互换位置
geom_text( # 在图形上加上数字标签
aes(label=value, # 标签的值(数据框的第三列)
# vjust = ifelse(variable == "Up", -0.5, 1), # 垂直位置。如果没有coord_flip(),则可以取消这行注释
hjust = ifelse(variable == "Up", -0.4, 1.1) # 水平位置
),
size=2 # 标签大小
)+
scale_y_continuous( # 调整y轴
labels = abs, # 刻度设置为绝对值
expand = expansion(mult = c(0.1, 0.1))) # 在y轴的两侧,留下一部分的空白位置,防止加标签的时候,显示不全。
同样,我们也可以使用更常用的apyramid包,进行金字塔图(pyramid plot)的绘制。可参考其他教程。
医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!