查看原文
其他

Stata绘图:addplot-层层叠加轻松绘图

连享会 连享会 2022-12-31

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

连享会寒假班

作者: 袁子晴 (香港大学)
邮箱: yzq0612@foxmail.com


目录

  • 1. 问题背景

  • 2. Stata 外部命令介绍

  • 3. Stata 示例

    • 3.1. 添加数据标签和箭头

    • 3.2. 修改现有图形

    • 3.3. 为柱状图添加数值标签

    • 3.4. 为系数图添加基准线

    • 3.5. 为散点图添加分组标签

    • 3.6. 为累计概率分布图添加边缘图

    • 3.7. 非参数估计:分段求取均值

  • 4. 参考文献

  • 5. 相关推文



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

1. 问题背景

在 Stata 中绘制较为多个图层的叠加的复杂图表时,或者在已经绘制好的图表上进行二次编辑时,我们可以使用 addplot 命令来实现。该命令与 twoway 绘图命令的附加选项 addplot_option 的区别在于它是独立于原有绘图命令的,可以在原有绘图命令之后单独运行,其优势在于:

  • 如果你必须修改一个图形,而你又不能重新运行原来的绘图命令,或者你只有图形文件,而没有用于创建图形的数据,那么 addplot 允许你在图形生成后向其添加元素;
  • addplot 可以实现单一绘图命令中难以实现的效果(例如,包含多个子图的情况下自定义单个子图);addplot 还可以替代图形编辑器的一些功能。

2. Stata 外部命令介绍

首先通过 ssc install addplot 来安装外部命令 addplot ,其命令结构如下:

addplot [graphname] [numlist] [, nodraw] : twoway_plots
  • graphname 是需要修改的内存图的名称,若省略该选项,则默认使用当前内存中的图形;
  • numlist 提供要单独修改的子图的编号,当修改 graph combineby() 创建的图形时,命令 addplot 默认所有子图,但如果你只想修改第二和第三个子图,你可以输入:. addplot 2 3: ...
  • nodraw 适用于对同一个图形多次使用 addplot 但不想每次都更新图形,因为如果在后续使用 addplot 时修改了绘图数据会改变之前的绘图结果,这一选项避免了这一情况;
  • 可以添加选项 norescaling 阻止 addplot 命令重新编译坐标轴(以便保留坐标轴的标签和范围);
  • 可以添加选项 legend(off) 避免添加多余的图例。
  • 冒号后面 twoway_plots 代表可以加入 Stata  twoway 绘图命令

3. Stata 示例

3.1. 添加数据标签和箭头

. sysuse auto, clear
. twoway scatter price mpg

. addplot: scatter price mpg if price>15000 | mpg>40, ///
msymbol(i) mlabel(make) ///
mlabposition(9) legend(off)

. addplot: pcarrowi 14000 23 15500 21.5 (3) "expensive car" ///
2000 38 5000 40.7 (6) "high mileage car"

3.2. 修改现有图形

第一个示例展示了 addplot 如何分别为已命名的图形添加标题:

sysuse auto
scatter price mpg, name(g1, replace)
scatter price weight, name(g2, replace)
addplot g1: , title(price by mpg)
addplot g2: , title(price by weight)
graph drop g1 g2

第二个示例展示了 addplot 如何修改现有的以 .gph 为后缀的图形文件:

sysuse auto
scatter price mpg
graph save mygraph.gph
graph drop Graph

graph use mygraph.gph
addplot mygraph: pcarrowi 14000 23 15500 21.5 "expensive car", legend(off)
graph drop mygraph
erase mygraph.gph

第三个示例展示了如何单独修改分组生成的子图:

sysuse auto
scatter price mpg, by(foreign)
addplot: , xline(21.3, lp(dash)) yline(6165, lp(dash)) norescaling
addplot 1: , xline(19.8) yline(6072) norescaling
addplot 2: , xline(24.8) yline(6385) norescaling
graph drop Graph

以上的三个示例来源于 help addplot 帮助文档,均是单击即可运行。

sysuse auto, clear

proportion rep if foreign==0 & rep78>=3
estimates store domestic

proportion rep if foreign==1 & rep78>=3
estimates store foreign

coefplot domestic foreign, vertical recast(bar) barwidth(0.3) fcolor(*.5) ///
ciopts(recast(rcap)) citop citype(logit) format(%9.2f) ///
addplot(scatter @b @at, ms(i) mlabel(@b) mlabpos(2) mlabcolor(black))

3.3. 为柱状图添加数值标签

下图是与 coefplot 系数可视化命令的结合,添加数值作为标签,并绘制了置信区间:

sysuse auto, clear

proportion rep if foreign==0 & rep78>=3
estimates store domestic

proportion rep if foreign==1 & rep78>=3
estimates store foreign

coefplot domestic foreign, vertical recast(bar) ///
barwidth(0.3) fcolor(*.5) ///
ciopts(recast(rcap)) citop citype(logit) format(%9.2f) ///
addplot(scatter @b @at, ms(i) mlabel(@b) mlabpos(2) mlabcolor(black))

3.4. 为系数图添加基准线

系数可视化命令 coefplot 不允许针对子图的 xline() 选项,因此我们可以在 coefplot 创建图形后使用addplot来添加基准线:

sysuse auto, clear
logit foreign mpg trunk length turn
coefplot ., bylabel(Log odds) || ///
., bylabel(Odds ratios) eform || ///
, drop(_cons) nolabel byopts(xrescale)
addplot 1: , xline(0) norescaling
addplot 2: , xline(1) norescaling

同样地,我们可以为 coefplot 创建的子图用 addplot 分别添加 y 轴基准线:

scatter mpg turn, by(foreign) jitter(2) msymbol(Oh)
summarize mpg if foreign==0, meanonly
addplot 1: , yline(`r(mean)') norescaling
summarize mpg if foreign==1, meanonly
addplot 2: , yline(`r(mean)') norescaling
summarize mpg, meanonly
addplot: , yline(`r(mean)', lpattern(dash)) norescaling

3.5. 为散点图添加分组标签

如果根据数值大小分为高、中、低三组时,可以按照下面示例将分组情况更为直观地展示出来:

scatter mpg turn, jitter(2) msymbol(Oh)
addplot: (scatteri 10.0 52 10.0 53 19.5 53 19.5 52, recast(line) lp(l)) ///
(scatteri 20.5 52 20.5 53 29.5 53 29.5 52, recast(line) lp(l)) ///
(scatteri 30.5 52 30.5 53 40.0 53 40.0 52, recast(line) lp(l)), ///
graphregion(margin(r=11)) legend(off) norescaling ///
text(15 52.5 "low" 25 52.5 "medium" 35 52.5 "high", ///
orientation(rvertical))

3.6. 为累计概率分布图添加边缘图

在对变量进行描述性统计分析时,通常会绘制累计概率分布图 (cumulative distribution plots),进一步地添加纵向维度的边缘直方图 (cumulative distribution plots) 有助于我们直观地观察数据堆叠情况,下面的示例为我们展示了如何实现这一过程:

  sysuse auto,clear
  set scheme sj
  quantile mpg, rlopts(lc(none)) ms(oh) yla(, ang(h))
  count if mpg < .
  egen prob = total(1/`r(N)'), by(mpg)
  egen tag = tag(mpg)

  generate nprob = -prob
  quantile mpg, rlopts(lc(none)) ms(oh) yla(, ang(h))  ///
  addplot(spike nprob mpg if tag, horizontal) legend(off)

3.7. 非参数估计:分段求取均值

这个例子由连玉君老师提供,源于 Stata 假期班-高级班 的课件。该例展示了非参数估计中最基本的「分段求取均值」的过程。

第一步:通过模拟的方式产生数据。数据生成过程 (DGP) 如下:

为了展示不同样本数下的结果,生成了两组样本,分别为 个观察值; 个观察值,对应的 Stata 数据文件分别存储为 NP_sim01.dtaNP_sim02.dta

第二步:将样本等分为 8 组,用 egen 命令计算每组的均值,进而使用 twoway line 绘制基础图形 (各个区间的均值线)。为了提升可视化,分别将单数组和双数组的散点图设定为红色 (red) 和蓝色 (blue),这需要通过循环语句来完成,相当于绘制了 8 张 (共 8 组分段数据) 透明的图片。在此过程中,使用 addplot 命令将这些图片「覆盖」在基础图片上即可完成整个图片的绘制工作。

//----------------- DGP - Simulate datasets--------
//Full sample, N=400
clear
set seed 135
set obs 400
gen x = runiform()*10 // x~U[0,1]
gen e = rnormal()*(0.05*x) // e~N(0, 0.05x)
gen y = sin(0.18*_pi*x) + e

save "NP_sim01.dta", replace

//Subsample, N=40
set seed 1
sample 40 , count
save "NP_sim02.dta", replace
//-------------------------------------------------


//分段求均值

*-样本1:N = 400
use "NP_sim01.dta", clear
twoway scatter y x, msize(*0.2)

*-样本2:N = 40
use "NP_sim02.dta", clear
twoway scatter y x, msize(*0.2)

sort x
gen K = group(8) // 把样本等分成 K 组
bysort K: egen ymean = mean(y)

list x y K ymean, sepby(K)

twoway scatter ymean x, msymbol(+) msize(*0.4)

//图示:分段均值和散点图
//-------------------------------------b---------------
twoway line ymean x if K==1, msize(*1.2) lcolor(red) //scheme(s1mono)
forvalues k = 1(2)7{
addplot: line ymean x if K==`k', lcolor(red) legend(off) //recast(area)
addplot: scatter y x if K==`k', msize(*1.2) msymbol(+) mcolor(red) legend(off)
}
forvalues k = 2(2)8{
addplot: line ymean x if K==`k', lcolor(blue) legend(off)
addplot: scatter y x if K==`k', msize(*1.2) msymbol(oh) mcolor(blue) legend(off)
}
//-------------------------------------o---------------

输出图片效果如下:

最后,不知你是否觉得这个图片的风格很清爽,完全不同于 Stata 默认的粗笨风格。若想实现这个风格,只需在绘图之前执行如下命令,将绘图模板设定为 white_tableau 风格即可。

有关绘图模板的设定方法,参见往期推文

  • Stata绘图:一个干净整洁的-Stata-图形模板qlean
  • Stata黑白图形模板:中文期刊风格的纯黑白图形
. ssc install schemepack, replace //安装white_tableau 模板
. set scheme white_tableau //设定绘图风格为white_tableau

若需重设为 Stata 默认绘图风格,可以按需执行如下两条命令之一:

. set scheme s2color // Stata 默认, 彩色
. set scheme s2mono // Stata 默认, 黑白

Stata 自带模板 s1momo 的输出效果

4. 参考文献

  • A note on adding objects to an existing twoway graph
  • Cox, N.J., 2021, Stata tip 141: Adding marginal spike histograms to quantile and cumulative distribution plots, 21(3):838-846. -PDF-
  • Ben Jann, coefplot: Plotting regression coefficients and other estimates in Stata, -Link-
  • Ben Jann, 2015, A Note on Adding Objects to an Existing Twoway Graph, Stata Journal, 15(3): 751–755. -PDF-
  • Ben Jann, 2015, Stata Tip 122: Variable Bar Widths in Two-Way Graphs, Stata Journal, 15(1): 316–318. -PDF-
  • Ben Jann, 2018, Color Palettes for Stata Graphics, Stata Journal, 18(4): 765–785. -PDF-, -PDF2-
  • Ben Jann, 2018, Customizing Stata Graphs made Easy (Part 1), Stata Journal, 18(3): 491–502. -PDF-, -PDF2-
  • Ben Jann, 2018, Customizing Stata Graphs Made Easy (Part 2), Stata Journal, 18(4): 786–802. -PDF-, -PDF2-
  • Daniel Bischof, 2017, New Graphic Schemes for Stata: Plotplain and Plottig, Stata Journal, 17(3): 748–759. -PDF-, -PDF2-
  • Lars Ängquist, 2014, Stata Tip 117: Graph Combine—Combining Graphs, Stata Journal, 14(1): 221–225. -PDF-
  • Mark D. Chatfield, 2018, Graphing Each Individual's Data over Time, Stata Journal, 18(3): 503–516. -PDF-, -PDF2-
  • Tim P. Morris, 2019, Stata tip 131: Custom legends for graphs that use translucency, Stata Journal, 19(3): 738–740. -PDF-, -PDF2-

5. 相关推文

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

  • 专题:Stata绘图模板
    • Stata绘图极简新模板:plotplain和plottig-T251
    • Stata绘图:一个干净整洁的-Stata-图形模板qlean
    • Stata:图形美颜-自定义绘图模板-grstyle-palettes
    • Stata黑白图形模板:中文期刊风格的纯黑白图形
  • 专题:Stata教程
    • 普林斯顿Stata教程(二) - Stata绘图
  • 专题:Stata绘图
    • Stata 绘图:用 Stata 绘制一打精美图片-schemes
    • 常用科研统计绘图工具介绍
    • Stata空间计量:莫兰指数绘图moranplot命令介绍
    • Stata绘图-组间差异可视化:不良事件火山图、点阵图
    • 给你的图形化个妆:Stata绘图常用选项汇总-上篇
    • 给你的图形化个妆:Stata绘图常用选项汇总-下篇
    • Stata绘图:柱状图专题-T212
    • Stata绘图:回归系数可视化-论文更出彩
    • Stata绘图:世行可视化案例-条形图-密度函数图-地图-断点回归图-散点图
    • Stata绘图:随机推断中的系数可视化
    • Stata绘图:重新定义坐标轴刻度标签
    • Stata绘图:用-bytwoway-实现快速分组绘图
    • Stata绘图:一个干净整洁的-Stata-图形模板qlean
    • Stata绘图:在图片中添加虚线网格线
    • Stata绘图:怎么在Stata图形中附加水平线或竖直线?
    • Stata绘图:制作教学演示动态图-GIF
    • Stata绘图:绘制一颗红心-姑娘的生日礼物
    • Stata绘图:bgshade命令-在图形中加入经济周期阴影
    • Stata绘图:让图片透明——你不要掩盖我的光芒
    • Stata绘图:多维柱状图绘制
    • Stata绘图:用暂元统一改变图形中的字号
    • 一文看尽 Stata 绘图
    • Stata绘图:绘制单个变量的时序图

连享会:因果推断专题(报名持续进行中)

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

🍏 关于我们

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


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

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