Stata绘图:circlepack-绘制圆堆图

发布时间:2022-12-28 阅读 958

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者: 张铭鑫 (复旦大学)
邮箱: 746548383@qq.com

编者按:本文第三部分所展示的图形示例均来自circlepack包作者的Github主页,特此感谢!


目录


1. 圆堆图的信息结构

圆堆图是一种可视化数据层次结构的绘图方法。从图形所包含的信息维度角度来看,最简单的圆堆图至少需要包含两个维度的信息:其一,具体的变量值,这个值是圆堆图的信息基点;其二,观察个体的类别信息,这个分类方法是圆堆图构建图形的具体方式。圆堆图的本质就是:以图形的方式根据类别信息分类展示观察个体的变量值。

敏锐的读者立刻就会发现:圆堆图与树状图别无两样! 事实也正是如此,从所包含的信息来看,圆堆图与树状图是完全等价的。不妨举一例:假设有一个由五位同学构成的班级,这一班级由五位同学构成,其中包含三位男同学与两位女同学,下表中汇报了该班级在最近一次计量经济学考试中的成绩。

姓名 性别 成绩
A 80
B 86
C 85
D 90
E 89

图1以树状图的形式展示了上表中的信息:首先根据性别信息将所有学生分为男、女两组,其次在每一组性别之下根据姓名(同样也是一种分类信息)展示了不同学生的考试成绩。图2采用圆堆图的形式展示了上表中的信息,容易发现:虽然表现的图形形式不同,但是从所包含的信息来看,树状图与圆堆图是完全相同的

2. circlepack的基本语法

Stata 中,circlepack 命令为研究者提供了绘制圆堆图的简便方法。其基本语法如下。

circlepack numvar [if] [in], by(variables (min=1, max=3)) 

结合在上一部分中所指出的圆堆图的基本信息维度构成,我们很容易理解上述命令:根据(by)选项中所提供的类别变量(最少必须有一个类别信息,至多只能有三种分类)对所有样本进行分类,并展示所选中的数值变量(numvar)

在必须的语法构成要素之外,circlepack 命令提供了一系列额外选项帮助研究者设计满足审美和格式要求的圆堆图。主要的选项如下:

  • by(group vars): 至少提供一个分类变量,至多提供是三个分类变量,这些分类变量将同时被用作标签。分类顺序为:最先提供的变量将被用作最内层的分组。
  • pad(num): 为圆圈添加填充,默认值为0.1,当值为0时代表无填充。
  • points(num): 用于定义圆边上的点的数量,默认值为60。当points值为3时代表三角形,6代表六边形,8代表八边形等。points值大于60时可以使圆圈更加平滑。
  • angle(num): 定义点的角度,默认值为0。
  • circle0: 绘制边界圆。
  • circle0c(str): 定义边界圆的颜色。
  • palette(str): 定义在绘制圆堆图时所使用的调色板,所指定的可以是颜色调色板包中指定的任一命名方案,默认为tableau。
  • addtitles: 在最上层图形中添加标题,改选项默认在图形的左上角添加标题。
  • novalue: 在最内层的分类中不显示numvar的值。
  • nolabels: 不要在图形中添加任何标签。
  • labsize(str): 标签的尺寸,默认值为1.2。
  • format( ): 定义 y 轴类别的格式,默认值为 %9.0fc。
  • title, subtitle, note: 为图形添加标题、子标题、注释。

3. Stata实例

在本部分我们将通过一些列图形展示 circlepack 命令的基本用法以及其主要选项的功能。

3.1 安装 circlepack 包

* 安装 circlepack 包
ssc install circlepack, replace

* 安装 palettes 包
ssc install palettes, replace
ssc install colrspace, replace

* 安装 schemepack 包
ssc install schemepack, replace

3.2 导入数据并观察数据结构

*清空内存数据
clear

*将默认图形模版替换为白板模版,在该模版下图形将更加简洁
set scheme white_tableau

*设置图形字体
graph set window fontface "Arial Narrow"

*导入数据
use "https://github.com/asjadnaqvi/stata-circlepack/blob/main/data/demo_r_pjangrp3_clean.dta?raw=true", clear

*展示数据基本结构
 list in 1/5

     +--------------------------------------------------------+
     | NUTS_ID   year   y_00_14   y_15_64   y_65_99     y_TOT |
     |--------------------------------------------------------|
  1. |      AL   2020    478850   1947069    420036   2845955 |
  2. |     AL0   2020    478850   1947069    420036   2845955 |
  3. |    AL01   2020    143076    542372    119241    804689 |
  4. |   AL011   2020     23585     75998     16274    115857 |
  5. |   AL012   2020     49133    198233     43331    290697 |
     +--------------------------------------------------------+

*在该数据集中我们仅需用到分类变量NUTS_ID和数值变量y_TOT
keep NUTS_ID y_TOT

*筛选样本
drop if y_TOT==0
keep if length(NUTS_ID)==5

*在分类信息NUTS_ID的基础上进一步生成分类信息
gen NUTS2 = substr(NUTS_ID, 1, 4)
gen NUTS1 = substr(NUTS_ID, 1, 3)
gen NUTS0 = substr(NUTS_ID, 1, 2)

*将NUTS_ID重命名为NUTS3
ren NUTS_ID NUTS3

*展示用于作图的数据结构,该数据集中包含四种不同层次的分类信息NUTS0-NUTS3,以及一个数值信息y_TOT。

list in 1/5

     +----------------------------------------+
     | NUTS3    y_TOT   NUTS2   NUTS1   NUTS0 |
     |----------------------------------------|
  1. | AL011   115857    AL01     AL0      AL |
  2. | AL012   290697    AL01     AL0      AL |
  3. | AL013    75428    AL01     AL0      AL |
  4. | AL014   122700    AL01     AL0      AL |
  5. | AL015   200007    AL01     AL0      AL |
     +----------------------------------------+

3.3 基本图形及拓展

*基本图形:根据NUTS0分类展示欧盟二十七国的人口数据,并添加标题
circlepack y_TOT, by(NUTS0) format(%15.0fc) title("Population of EU 27 countries")
*拓展图形一:隐去基础图形中的值信息
circlepack y_TOT, by(NUTS0) title("Population of EU 27 countries") noval
*拓展图形二:在拓展图形一中增加边界圆
circlepack y_TOT, by(NUTS0) title("Population of EU 27 countries") circle0 noval
*拓展图形三:在NUTS0的基础上增加NUTS1分类信息
circlepack y_TOT, by(NUTS1 NUTS0) format(%15.0fc) noval circle0 
*拓展图形四:在拓展图形3的基础上增加标签
circlepack y_TOT, by(NUTS1 NUTS0) format(%15.0fc) noval addtitles
*拓展图形五:在NUTS0与NUTS1的基础上进一步增加NUTS2分类信息,去除标签并将圆内的填充值设为0.06
circlepack y_TOT, by(NUTS1 NUTS0) format(%15.0fc) noval addtitles
*拓展图形六:筛选NUTS0值为AT的样本,并基于NUTS3和NUTS2分类信息展示y_TOT的值,去除数值、增加标签
circlepack y_TOT if NUTS0=="AT", by(NUTS3 NUTS2) ///
	addtitles noval format(%15.0fc) ///
	title("Population of Austria at NUTS2 and NUTS3 level") circle0
*拓展图形七:筛选NUTS0值为NL的样本,并基于NUTS3和NUTS2分类信息展示y_TOT的值,去除数值、增加标签,将调色板设置为 CET L10
circlepack y_TOT if NUTS0=="NL", by(NUTS3 NUTS2 NUTS1) ///
	addtitles noval format(%15.0fc) ///
	title("Population of Netherlands at NUTS1-NUTS3 level") palette(CET L10)
*拓展图形八:筛选NUTS0值为NL的样本,并基于NUTS3、NUTS2和NUTS1分类信息展示y_TOT的值,去除数值、增加标签,将调色板设置为 CET L10,将图形设置为六边形,并将六边形内的填充设置为0.3
circlepack y_TOT if NUTS0=="NL", by(NUTS3 NUTS2 NUTS1) ///
	addtitles noval format(%15.0fc) ///
	title("Population of Netherlands at NUTS1-NUTS3 level") palette(CET L10) points(6) pad(0.3)
*拓展图形九:筛选NUTS0值为PT的样本,并基于NUTS3和NUTS2分类信息展示y_TOT的值,去除数值、增加标签,将调色板设置为 CET C6,将图形设置为十二边形,并将十二边形内的填充设置为0.1
circlepack y_TOT if NUTS0=="PT", by(NUTS3 NUTS2)  ///
	addtitles noval format(%15.0fc) title("Population of Portugal at NUTS1-NUTS3 level") palette(CET C6) points(12) pad(0.1)

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh