如何使用 Stata 绘制人口金字塔?

2023-10-20 13:45:49 浏览数 (1)

常言道,一图胜千言。画图是最基本、也是最重要的数据分析技能之一,以至于人们将画图的整个行为过程赋予了更为专业的称呼——数据可视化(Data Visualization)。作为强大且灵活的数据分析利器,Stata 能够实现各式各样的绘图。本专题 [Stata 画图] 旨在促进广泛且深入地掌握 Stata 的画图功能。为此,一系列文章将陆续推出,力求将画图的结构与细节尽数展示。

一、人口金字塔的特点

本文是 #用 Stata 画个图#系列的第 2 讲, 主要是关于如何绘制人口金字塔。人口金字塔(Population Pyramid)是一种常见的图形,是人口统计学家用于刻画特定区域内人口构成及其变迁的可视化工具,常见的人口金字塔能够反映出年龄(age)和性别(sex)在总人口中的分布状况。相较于 Excel 而言,使用 Stata 绘制人口金字塔优势明显,因为除了所有图形对象均可按需调整之外,使用代码绘图也让绘图结果可复制,可以快速批量处理多年份多区域的人口数据,便于后期的管理和进一步呈现。

人口金字塔可通过纵向堆叠的条形图进行绘制。以下图呈现的美国的人口金字塔为例(图1):年龄组别由低到高排列,每行表示一个年龄组别,每个年组别的人口规模用水平的条形表示,该条形又被分为男性与女性分列两侧。至此,总人口规模按照年龄组别和性别进行了呈现。值得说明的是,人口的其他特征,如婚姻状况、种族或户籍等信息也可以反映在人口金字塔上,只需要在“年龄—性别”分组之上进行细分即可,也就是对两侧的条形进行分类后横向堆叠(stack)呈现。

图1:美国的人口金字塔(2010 和 2021)图1:美国的人口金字塔(2010 和 2021)

注: 数据来源于 US Census Bureau;蓝色为female,绿色为male。

二、绘制人口金字塔的代码

代码语言:javascript复制
use "https://www.stata-press.com/data/r17/pop2000", clear //载入数据

replace maletotal = -maletotal/10000
replace femtotal  =  femtotal/10000

generate Xzero = 0 //生成一个变量,赋值为0,用于制作散点图,将年龄组别信息放置在条形上

*绘制改进后的金字塔图
twoway bar maletotal agegrp, horizontal xvarlab(男性) bcolor(black) barwidth(.88)    ||     ///
         bar femtotal  agegrp, horizontal xvarlab(女性) bcolor(red) barwidth(.88)    ||     ///
         scatter agegrp Xzero , mlabel(agegrp) mlabcolor(white) msymbol(i)           ||    ///*注意这里叠加了一张散点图
         ,ylabel(1(1)17, angle(horizontal) valuelabel labsize(vsmall))                     ///
         xtitle("人口数量(单位:万)", size(vsmall) margin(small)) ytitle("")                                       ///
         xlabel(-1000 "1000" -800 "800" -600 "600" -400 "400" -200 "200" 200 400 600 800 1000, labsize(vsmall))    ///
         title("图:美国2000年人口金字塔", pos(11) size(medium) color(black) span)                                   ///
         plotregion(fcolor(white) lcolor(white)) graphregion(fcolor(white) lcolor(white))                          ///
         ysca(noline) ylabel(none) xsca(noline titlegap(-0.5))                                                     ///
         legend(label(1 男性) label(2 女性) size(vsmall) pos(11) region(fcolor(white) lcolor(white)))               ///
         legend(order(1 2))                                                                                        ///
         note("Source: U.S. Census Bureau, Census 2000, Tables 1, 2 and 3" , size(vsmall) span)

绘图效果如下:

图2:美国的人口金字塔(2000年)图2:美国的人口金字塔(2000年)

三、理解绘制人口金字塔的过程

在 Stata 中绘制人口金字塔,其实是两张twoway bar条形图和一张twoway scatter散点图的叠加,是这 3 幅图放在一起的结果,其绘图思路和实现方式清晰且简便,这种绘图思路也能够为其他数据的可视化提供借鉴。

从绘制过程看,其实是完成了下方所展示的拼接过程,基于拼接好的图形(图3底部),调整选项得到图4,最后通过叠加散点图(只是为了移动组别的标签位置)以及调整绘图选项得到常见的人口金字塔(图2)。

图3:人口金字塔的绘图过程图3:人口金字塔的绘图过程
图4:人口金字塔的绘图过程图4:人口金字塔的绘图过程

为节省篇幅,获得有关人口金字塔绘制过程(图3和图4)的全部代码可查看下文:

Stata 绘图 | 如何绘制人口金字塔(Population Pyramid)?

欢迎大家交流指正!

- - - - - - - - - -

版本记录

第一版:2023-10-20

0 人点赞