Stata绘图:sunflower-向日葵图-克服散点重叠

发布时间:2022-07-12 阅读 307

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下载 - 推文合集

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下载 - 推文合集

作者: 温世彬 (中国农业大学)
邮箱: shibin_wen@163.com


目录


1. 背景

散点图是一种功能强大且无处不在的图形,通常用于展示双变量数据 x 和 y 的之间的关系。然而,当一个区域中的散点密度变高时,这些图将变得难以阅读 (如图 1 所示)。

图 1 说明:4689 名受试者舒张压与身体质量指数的散点图,来自 Framingham 心脏研究数据。该图中心附近过多的观测值使得我们难以确定这两个变量最常见值的观测密度。

ClevelandMcGill (1984) 最早引入向日葵图来解决这一数据重叠问题。向日葵由许多被称为花瓣的短线段组成,它们从中心点向外辐射。在向日葵图中,x-y 平面被划分为一个由规则方形箱组成的格子;向日葵放置在每个包含一个或多个观察值的箱格中心。绘制它们是为了使每个向日葵的花瓣数等于相关箱格中的观察值数。向日葵图可有效解决高密度散点图引起的重叠问题。但绘制该向日葵图会使图形低密度区域丢失部分位置精确的点,当箱格尺寸很大时更是如此。Carr 等人提出,只要每个箱格的观测数据少于 4 个,就可以在其确切位置绘制单独的点。他们还引入了六角形的箱格使得向日葵堆放更为密集紧凑,并且不再强调方形箱格可以引入的水平和垂直图案。Scott 研究表明,对于二元直方图,六边形箱格产生的均方误差比任何其他平面上的箱格形状都要低。Carr 等人也尝试使用一个六边形符号,其大小随着箱格中观察次数的增加而单调增加。

PlummerDupont (2003) 将向日葵图主要特征与 Carr 等人研究的密度分布图结合起来,引入了密度分布向日葵图。图 2 显示了 Framingham 心脏研究的受试者舒张压与身体质量指数的密度分布向日葵图 (与图 1 中数据集相同)。数据点以下三种方式之一表示:单个数据点的小圆、浅色向日葵和深色向日葵。在一朵浅色向日葵中,每 1 片花瓣代表 1 个观察值。在图 2 中,浅色向日葵的背景是浅绿色,花瓣是深棕色。在一朵深色向日葵中,每 1 片花瓣代表 k 个观测值,其中 k 由用户指定。在图 2 中,k = 7,表示每 1 片花瓣代表 7 个观测值,深色向日葵的背景是棕色,花瓣是黑色。图 2 中深色向日葵代表的最大观察密度约是每箱格 98 个受试者。

说明:

  • 密度分布向日葵图的数据来自图 1。
  • 在本例中,x-y 平面被划分为宽度为 0.85kg/m2 的正六边箱格。
  • 每个观测数据用蓝色圆圈表示,只要每个数据箱的观测数据少于 3 个,它们的精确位置就用蓝色圆圈表示。
  • 在密度较高的箱格中观察到的是浅色或深色向日葵。
  • 浅色向日葵的背景是淡绿色的,每 1 片花瓣代表 1 次观察。
  • 深色向日葵背景为棕色,每 1 片花瓣代表 7 次观测值。
  • 这张图表达了观测值的密度分布,同时也允许读者准确地确定任一区域的具体观测值数量。

综上,可以发现向密度分布日葵图的主要优点:在重叠的地方用一朵向日葵花的花瓣数目来表示重叠数据的数目,用以克服散点图数据重叠问题。

2. 命令介绍 - sunflower

sunflower 能够绘制密度分布向日葵图,即 density-distribution sunflower plots (Plummer and Dupont, 2003)。深色向日葵、浅向日葵和标记符号分别代表数据的高、中和低密度区域。这些图对于显示密度太大而无法使用常规散点图的双变量数据很有用。

sunflower命令安装:

ssc install sunflower, replace

sunflower命令语法:

sunflower yvar xvar [if] [in] [weight], [, options]

其中,yvarxvar 分别为可视化的两个核心变量,表示 y 和 x 之间的关系

Main options 选项如下:

  • nograph:不显示图
  • notable:不显示摘要表
  • marker_options:同散点图 marker 选项设置,用于控制散点标记的形状、颜色、大小、角度等 Bins/Petals options 选项如下:
    • binwidth(#):六边形箱格的宽度
    • binar(#):六边形箱格的纵横比
    • bin_options:六边形箱格相关选项设定
      • lbstyle(areastyle)dbstyle(areastyle) :分别指定浅色和深色六边形箱格的整体外观
      • lbcolor(colorstyle)dbcolor(colorstyle):分别指定浅色和深色六边形箱格的边框和填充颜色
      • lbfcolor(colorstyle)dbfcolor(colorstyle):分别指定填充浅色和深色六边形箱格内部的颜色
      • lblstyle(linestyle)dblstyle(linestyle):分别指定用于该区域线的整体样式,其中包括其模式、粗细、颜色等
      • lblcolor(colorstyle)dblcolor(colorstyle):分别指定浅色和深色六边形箱格的边框颜色
      • lblwidth(linewidthstyle)dblwidth(linewidthstyle):分别指定浅色和深色六边形箱格的边框粗细
  • light(#):浅色向日葵的最小观测值,默认为 3
  • dark(#):深色向日葵的最小观测值,默认为 13
  • xcenter(#):参照箱格的 x 轴
  • ycenter(#):参照箱格的 y 轴
  • petalweight(#):指定深色向日葵的每个花瓣所代表的观察次数,默认最大值为 14
  • petallength(#):制定向日葵花瓣的长度
  • petal_options:向日葵花瓣相关选项设定
    • lflstyle(linestyle)dflstyle (linestyle):分别指定浅色和深色向日葵花瓣的整体样式
    • lflcolor(colorstyle)dflcolor(colorstyle):分别指定浅色和深色向日葵花瓣的颜色
    • lflwidth(linewidthstyle)dflwidth(linewidthstyle):分别指定浅色和深色向日葵花瓣的宽度
  • flowersonly:只显示花瓣,而不展示箱格
  • nosinglepetal:禁止单独的花瓣

Add plots options 选项如下:

  • addplot(plot):将其他图添加到生成图中

3. Stata 实例操作

在本节中,我们将使用系统自带的 nlsw88.dta 数据集展示 sunflower 的具体用法。nlsw88.dta 主要包含了 1988 年 34-36 岁妇女婚姻状况、工作及薪资等相关变量,主要用于研究婚姻对女性工资造成的结构性的差异问题等。我们采用该数据集中的 wage(妇女每小时工资)和 tenure(工作任期)两个变量进行密度分布向日葵图的绘制。

* set graph_opts 设置绘图选项
global graph_opts graphregion(color(white)) leg(region(lc(none) fc(none)) row(1))

* 调用内置数据集  
sysuse nlsw88, clear

* 查看样本中 wage 和 tenure 关系
scatter wage tenur, $graph_opts mcolor(blue) msymbol(Oh) msize(small)

可以看到,直接绘制 wagetenure 散点图,在左下角部分的样本几乎都是重叠在一块,显得非常密集。如果我们想要区分出最密集的部分以及样本数量,散点图似乎很能判断出来。因此,我们可以尝试使用向日葵图。

首先,绘制最基础的向日葵图,其对散点的 options 选项和基本的 scatter 命令是一致的,具体代码如下:

sunflower wage tenur, $graph_opts msize(small) xlabel(0(5)25)

图示结果如下:

可以看到样本最为密集的是左下方。如果不做任何设置,sunflower 命令会根据重叠或邻近样本数量自动生成最适合的深色向日葵图和浅色向日葵图。浅色向日葵的最小观测值默认为 3,意味要生成图中淡绿色的六边形底色图案必须要有 3 个样本点。可以看到浅色向日葵里面的花瓣数量最少也是 3 片,1 片花瓣代表 1 个观测值。同理,深色向日葵的最小观测值默认为 13,意味着生成图中棕色的六边形底色图案必须要有 13 个样本点,在不添加任何设置的命令下,系统自动生成了 1 片黑色花瓣表示 6 个观测值。

以下图圈出来的两个向日葵为例,左上角圆圈中的 1 个浅色向日葵有 4 片棕色花瓣,表明该附近有 4 个样本点,且靠的非常近。底下圆圈中的 1 个深色向日葵有 2 片黑色花瓣,表明该附近有 2×6=12 个样本点靠的非常近,甚至可能几乎重叠。显然,采用这种方式能够较好区分重叠数据点的数量及其密度分布。

在输入上述命令时,也会同时生成一张表格(见下方)展示上图的详细信息,具体包括箱格宽度、高度、纵横比等,这些都是在第二节 options 选项中提及到的,我们可以通过修改相应参数进行调整。这幅图的结果可以看到总共有 2231 个观测值,一个箱格中最大观测值数量为 80 个,其中有 3 片花朵的浅色向日葵有 25 朵,有 4 片花朵的浅色向日葵有 25 朵…… 依次类推。如果不想展示这个表格,在后面加入 notable 命令即可。

当然我们也可以调节生成六边形底色图案的观测值数量。首先,对于浅色向日葵,我们考虑极端的情况,只要有 1 个观测值,就生成 1 个浅色向日葵,只需在命令后加入 light(1),结果见下方左图。其次,对于深色向日葵,我们将最低观测值数量设置高一些,默认值为 13,我们设置为 30 看下效果。结果见下方右图,可以看到最为密集的仍然是最下角部分。

sunflower wage tenur, $graph_opts msize(small) xlabel(0(5)25) light(1)

sunflower wage tenur, $graph_opts msize(small) xlabel(0(5)25) light(1) dark(30)  

对于深色向日葵,系统默认生成的是 1 片黑色花瓣表示 6 个观测值,对于这个数量,我们也可以进行调整,比如分别指定为 3 或 10。

sunflower wage tenur, $graph_opts msize(small) xlabel(0(5)25) petalweight(3)  // 指定为 3
  
sunflower wage tenur, $graph_opts msize(small) xlabel(0(5)25) petalweight(10)  // 指定为 10

只看花瓣,不要六边形箱格图案:

sunflower wage tenur, $graph_opts msize(small) xlabel(0(5)25) flowersonly

修改六边形箱格图案底色和向日葵花瓣颜色:

改变六边形箱格宽度:

sunflower wage tenur, $graph_opts msize(small) xlabel(0(5)25) binwidth(0.5)  // 宽度设置为 0.5
sunflower wage tenur, $graph_opts msize(small) xlabel(0(5)25) binwidth(1.5)  // 宽度设置为 1.5

添加数据标签和箭头:

sunflower wage tenur, $graph_opts msize(small) xlabel(0(5)25) ///
   addplot(pcarrowi 28 22 26 21.8 (12) `"{fontface "宋体":这是一个散点}"' ///
   24 15 16 13.8 (12) `"{fontface "宋体":这是一个浅色向日葵}"' ///
   0.5 9 4 9.5 (6) `"{fontface "宋体":这是一个深色向日葵}"') ///
   leg(order(1 2 3))

4. 总结

本推文较为详细地介绍了密度分布向日葵图 sunflower,其可以直观地反映两个变量的二元分布,并且提供了比传统的二元散点图关于实际数据集更多的信息,有助于克服散点图的数据重叠问题。该命令可以搭配原有的 scatter 命令相关选项,并且可以借助 addplot() 命令添加其他图形。

5. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 绘图, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

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

课程主页

课程主页

关于我们

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

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

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

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

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