查看原文
其他

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

连享会 连享会 2023-10-24

👇 连享会 · 推文导航 | www.lianxh.cn

连享会 · 2022暑期班

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

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:


目录

  • 1. 背景

  • 2. 命令介绍 - sunflower

  • 3. Stata 实例操作

  • 4. 总结

  • 5. 相关推文



1. 背景

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

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

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

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

说明:

  • 密度分布向日葵图的数据来自图 1。
  • 在本例中,x-y 平面被划分为宽度为 的正六边箱格。
  • 每个观测数据用蓝色圆圈表示,只要每个数据箱的观测数据少于 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 选项如下:
    • lbstyle(areastyle)dbstyle(areastyle) :分别指定浅色和深色六边形箱格的整体外观
    • lbcolor(colorstyle)dbcolor(colorstyle):分别指定浅色和深色六边形箱格的边框和填充颜色
    • lbfcolor(colorstyle)dbfcolor(colorstyle):分别指定填充浅色和深色六边形箱格内部的颜色
    • lblstyle(linestyle)dblstyle(linestyle):分别指定用于该区域线的整体样式,其中包括其模式、粗细、颜色等
    • lblcolor(colorstyle)dblcolor(colorstyle):分别指定浅色和深色六边形箱格的边框颜色
    • lblwidth(linewidthstyle)dblwidth(linewidthstyle):分别指定浅色和深色六边形箱格的边框粗细
    • binwidth(#):六边形箱格的宽度
    • binar(#):六边形箱格的纵横比
    • bin_options:六边形箱格相关选项设定
  • 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

  • 专题:Stata教程
    • Stata绘图:环形柱状图-实时全球新冠确诊人数
    • 普林斯顿Stata教程(二) - Stata绘图
  • 专题:Stata绘图
    • Stata绘图:绘制二维地图
    • Stata绘图:峰峦图绘制 joy_plot
    • Stata绘图:绘制华夫饼图-waffle
    • Stata绘图:绘制美观的散点图-superscatter
    • Stata绘图:回归系数可视化-multicoefplot
    • Stata绘图:如何更高效的绘制图形
    • Stata绘图:绘制桑基图-sankey_plot
    • Stata绘图-可视化:组间差异比较散点图
    • Stata绘图:addplot-fabplot-多图层美化图片
    • Stata绘图:箱形图与小提琴图-vioplot
    • Stata绘图:太美了!羊皮卷风格图形
    • Stata绘图:自定义绘图利器-palettes
    • 史上最牛Stata绘图模版-schemepack:酷似R中的ggplot2-袁子晴
    • Stata绘图:addplot-层层叠加轻松绘图
    • Stata 绘图:用 Stata 绘制一打精美图片-schemes
    • 常用科研统计绘图工具介绍
    • Stata空间计量:莫兰指数绘图moranplot命令介绍
    • Stata绘图-组间差异可视化:不良事件火山图、点阵图
    • Stata绘图极简新模板:plotplain和plottig-T251
    • 给你的图形化个妆:Stata绘图常用选项汇总-上篇
    • 给你的图形化个妆:Stata绘图常用选项汇总-下篇
    • Stata绘图:柱状图专题-T212
    • Stata绘图:回归系数可视化-论文更出彩
    • Stata绘图:世行可视化案例-条形图-密度函数图-地图-断点回归图-散点图
    • Stata绘图:随机推断中的系数可视化
    • Stata绘图:重新定义坐标轴刻度标签
    • Stata绘图:用-bytwoway-实现快速分组绘图
    • Stata绘图:一个干净整洁的-Stata-图形模板qlean
    • Stata绘图:怎么在Stata图形中附加水平线或竖直线?
    • Stata绘图:在图片中添加虚线网格线
    • Stata绘图:制作教学演示动态图-GIF
    • Stata绘图:绘制一颗红心-姑娘的生日礼物
    • Stata绘图:bgshade命令-在图形中加入经济周期阴影
    • Stata绘图:让图片透明——你不要掩盖我的光芒
    • Stata:图形美颜-自定义绘图模板-grstyle-palettes
    • Stata绘图:多维柱状图绘制
    • Stata绘图:用暂元统一改变图形中的字号
    • 一文看尽 Stata 绘图
    • Stata绘图:绘制单个变量的时序图

课程推荐:因果推断实用计量方法
主讲老师:丘嘉平教授
🍓 课程主页https://gitee.com/lianxh/YGqjp

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存