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

发布时间:2021-12-12 阅读 2648

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

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


目录


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) 如下:

为了展示不同样本数下的结果,生成了两组样本,分别为 N1=400 个观察值;N2=40 个观察值,对应的 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 风格即可。

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

. 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

相关课程

免费公开课

最新课程-直播课

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

课程主页

课程主页

关于我们

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

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

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

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

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