【R语言】使用ggplot2包、reshape2包绘制金字塔图(pyramid plot)-三间分布描述之分性别年龄组分布图

文摘   2024-12-24 23:18   山东  
金字塔图(Pyramid plot)

金字塔图(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、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!




医学统计数据分析
分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!
 最新文章