给你的图形化个妆:Stata绘图常用选项汇总-下篇

发布时间:2021-05-18 阅读 500

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

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

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

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

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

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者: 邓鸿斌 (暨南大学)
邮箱: Robin_dum@163.com


目录


编者按:Stata绘图专题 中,我们介绍了各类绘图命令,本系列的两篇推文重点介绍 Stata 绘图命令的 选项。这是 Stata 绘图过程中最灵活、最棘手的部分。

0. 引言

给你的图形化个妆:Stata绘图常用选项汇总-下篇 中,我们已经介绍了如何使用相关选项来调整图形最基本的各要素,如标记符号、坐标轴以及刻度标签等等。在接下来该系列的下篇中,我们将继续介绍如何运用相关选项进行分组绘图、调整图例以及调整整体的标题、背景等等内容,以便读者能对绘图命令常用选项有更加全面的了解。

和上篇一样,本文尽量叙述地详尽细致些,以方便 stata 的初学者们进行快速理解并掌握。若不加说明,全文使用的数据默认为 sp500.dta;为使效果更加明显以方便全文讲解,若无特殊说明,执行每小节的命令之前请先执行如下命令:

   sysuse sp500, clear
   keep in 1/10

1. 调整图形的标题和注释

1.1 设定标题和注释的内容

通常使用 title 选项、sutitle 选项、caption 选项以及 note 选项来分别设定标题、子标题、说明以及注释的文本内容。例如,执行命令 1 twoway scatter high date, title("图1") subtitle("子标题"),可以将图形总标题设为“图 1”,将二级标题设为“子标题”,如图 1 所示。

// 命令1(图1)
. twoway scatter high date, title("图1") subtitle("子标题")    

图1-4
图1-4

1.2 调整标题的位置、填充和线条等等

通常使用 position 选项和 ring 选项来调整标题的位置。其中,position 选项决定了标题在图形的几点钟方向,ring 选项则决定了标题在图形内部还是外部。例如,执行命令 2,标题将调整到图形内部的三点钟方向,并且 box 选项为标题加上了一个文本框,如图 2 所示。此外,bmargin 选项和 margin 选项能够分别控制标题外边框与图形之间的距离以及标题内部文字与外边框之间的距离。例如,执行命令 3 后,bmargin 选项中的“0 0 3 3”依次设定了边框的左边、右边、上边和下边与标题外部图形之间的间隔,而 margin 选项中的“5 5 2 2”依次设定了边框的左边、右边、上边和下边与标题内部文档内容之间的间隔,bexpand 选项则使得标题文本框与图形宽度对齐,整体效果如图 3 所示。

标题文本框的填充以及线条都可以使用相关选项进行调整。例如,执行命令 4 后,标题文本框内将填充为浅蓝色,方框线条颜色为灰色并加粗,如图 4 所示。

// 命令2(图2)
. twoway scatter high date, title("图2", position(3) ring(0) box)     

// 命令3(图3)
. twoway scatter high date, title("图3", box bmargin(0 0 3 3) margin(5 5 2 2) bexpand)     

// 命令4(图4)
. twoway scatter high date, title("图4", box fcolor(ltblue) lcolor(gray) lwidth(thick))    

2. 分组绘图

类似于论文中常用到的分组回归,有时候我们也需要分组绘图。为便于解说这部分相关选项,需先执行如下几行命令以便对原始数据 sp500.dta 做一个初步的预处理。

sysuse sp500, clear
gen lower=low/100
gen Frequency=0
replace Frequency=1 if volume>=12000
keep if volume>=11700 & volume<=12200

2.1 如何进行分组绘图

通常使用 by 选项对原始数据进行分组绘图。例如,执行命令 5 后,原始数据将根据“Frequency”这一变量进行分成两组并分别绘制到两幅图片上,如图 5 所示。如果我们既想看到分组样本的图形,也希望看到总体样本图形,只需执行命令 6,将新增加了总体样本散点图,共得到三幅图形,如图 6 所示。当然,这样做出来的图形仍然很粗糙,下面一小节介绍更多的选项进行调整美化。

// 命令5(图5)
. twoway scatter lower high, by(Frequency)     

// 命令6(图6)
. twoway scatter lower high, by(Frequency, total)     

图5-8
图5-8

2.2 调整美化分组绘图

首先,我们可以改变以上三幅图的排列顺序。例如,如果执行命令 7,可以从之前的“先横着排列”改为“先竖着排列”,如图 7 所示。如果执行命令 8,可以在排列时将第二个位置空起来,直接跳到第三个位置进行排列,如图 8 所示。如果执行命令 9,三幅图则会排成一行而不是两行,如图 9 所示;同理,如果执行命令 10,三幅图则会排成一列而不是两列,如图 10 所示;如果执行命令 11,三幅图在排列时将会紧紧贴在一起,节省空间,如图 11 所示。

// 命令7(图7)
. twoway scatter lower high, by(Frequency, total colfirst)        

// 命令8(图8)
. twoway scatter lower high, by(Frequency, total holes(2))        

// 命令9(图9)
. twoway scatter lower high, by(Frequency, total rows(1))         

// 命令10(图10)
. twoway scatter lower high, by(Frequency, total cols(1))         

// 命令11(图11)
. twoway scatter lower high, by(Frequency, total compact)         

// 命令12(图12)
. twoway scatter lower high, by(Frequency, total iscale(*1.5))    

图9-12
图9-12

其次,我们可以调整分组绘图中图形各要素的呈现方式。例如,如果执行命令 12,每幅图中的子标题将变为默认值的 3 倍大,如图 12 所示。如果执行命令 13,则只有位于末行的图形会显示 x 轴,如图 13 所示。如果执行命令 14,每幅图都会单独显示合适自己数据特点的 y 轴刻度标签,如图 14 所示。如果执行命令 15,则每幅图既会单独显示合适自己数据特点的 x 轴刻度标签,也会单独显示合适自己数据特点的 y 轴刻度标签,如图 15 所示。

// 命令13(图13)
. twoway scatter lower high, by(Frequency, total noedgelabel)        

// 命令14(图14)
. twoway scatter lower high, by(Frequency, total yrescale)     

// 命令15(图15)
. twoway scatter lower high, by(Frequency, total rescale)      

// 命令16(图16)
. twoway scatter lower high, by(Frequency, title("图16"))      

图13-16
图13-16

再次,我们可以为分组绘图增加总标题。例如,如果执行命令 16,则为分组图形增添的总标题为“图 16”,如图 16 所示;注意,如果执行命令 17,则是为每一幅图都增加一个相同的标题“图 17”,如图 17 所示。当然,我们也可以调整每幅图自带的子标题。例如,如果执行命令 18,原来自带的子标题将会变成新设置的“一个子标题”,如图 18 所示。我们甚至还可以运用选项来对子标题和总标题的位置进行调整。例如,如果执行命令 19 ,分组图形的子标题将移动到 11 点钟方向但保持在图形区域里面,如图 19 所示。此外,我们可以利用 prefix 选项和 suffix 选项来分别为文本补充前缀文字和后缀文字。例如,执行命令 20,将为每幅图的子标题加上前缀“分组绘图”以及后缀“组”,如图 20 所示。

// 命令17(图17)
. twoway scatter lower high, by(Frequency) title("图17")       

// 命令18(图18)
. twoway scatter lower high, by(Frequency, subtitle("一个子标题")     

// 命令19(图9)
. twoway scatter lower high, by(Frequency, subtitle(, position(11) ring(0))   

. twoway scatter lower high,         ///
  title("图20", box bmargin(b=4)) by(Frequency) subtitle("分组绘图:", prefix) subtitle("组", suffix)     // 命令20(图20)
图17-20
图17-20

最后,我们可以通过 caption 选项和 note 选项来为分组图形增添图形说明和注释。例如,如果执行命令 21,将会在分组图形的左下方增加一个总说明,如图 21 所示;如果执行命令 22,将会在每幅图的左下方都增加同一个说明,如图 22 所示。类似地,你可以对比命令 23 以及命令 24 之间的差异,它们的效果分别如图 23 和图 24 所示。

// 命令21(图21)
. twoway scatter lower high, by(Frequency, caption(说明:这是一个重要图形))   

// 命令22(图22)
. twoway scatter lower high, by(Frequency) caption(说明:这是一个重要图形)   

// 命令23(图23)
. twoway scatter lower high, by(Frequency, note(注释:这是一个注释))      

// 命令24(图24)
. twoway scatter lower high, by(Frequency) note(注释:这是一个注释)      

图21-24
图21-24

3. 调整图例

在绘图时,无需特别设置也会自动为你附带一个图例。但我们往往对自带的图例不完全满意,此时可以使用相关选项进行调整。

3.1 调整图例的内容

我们通常利用 legend 选项以及 label 子选项来修改图例的文字内容。例如,如果执行命令 25,图例的内容将可以显示我们自行设定的“第一个”“第二个”,如图 25 所示。

. twoway (scatter low high) (lfit low high),       ///
  legend(label(1 "第一个") label(2 "第二个"))    // 命令25(图25)

我们还可以利用legend 选项以及 order 子选项来调整图例的排列顺序或者选择只显示某个图例,同时还能对图例内容进行修改。例如,执行命令 26,将先显示第二个图例后显示第一个图例,如图 26 所示;执行命令 27,将隐藏第一个图例,只显示第二个图例,并把图例内容修改为“线性关系”,如图 27 所示。

. twoway (scatter low high) (lfit low high),    ///
  legend(order(2 1))                             // 命令26(图26)

. twoway (scatter low high) (lfit low high),   ///
  legend(order(2 "线性关系"))                    // 命令27(图27)

. twoway (scatter low high) (lfit low high),  ///
  legend(cols(1) position(3))                  // 命令28(图28)
图25-28
图25-28

我们可以用 position 子选项以及 ring 子选项来灵活调整图例的位置。例如,执行命令 28 能够将图例堆叠成一列并放置在图形的三点钟方向,如图 28 所示;如果我们执行命令 29,子选项 ring(0) 将使得图例放在图形内部,子选项 position(7) 将使得图例放在七点钟方向,如图 29 所示。而如果我们执行命令 30,图例将放置在图形的 12 点钟方向并排成一行,子选项 bexpand 使得图例与图形对齐,更加美观,如图 30 所示。

此外,还有一些其它有用选项,例如,执行命令 31 可以在显示图例时把文字显示在前面,如图 31 所示;执行命令 32 可以将图例去掉不显示,如图 32 所示。

// 命令29(图29)
. twoway (scatter low high) (lfit low high), legend(cols(1) ring(0) position(7))    

// 命令30(图30)
. twoway (scatter low high) (lfit low high), legend(rows(1) ring(0) position(12) bexpand)  

// 命令31(图31)
. twoway (scatter low high) (lfit low high), legend(textfirst)    

// 命令32(图32)
. twoway (scatter low high) (lfit low high), legend(off)       

图29-32
图29-32

3.2 调整图例的边框

执行命令 33,子选项 region(fcolor(dimgray)) 使得图例方框内填充成暗灰色;子选项 lcolor(navy) 使得图例的外边框变成深蓝色;子选项 lwidth(thick) 使得图例外边框加粗;子选项 margin(medium) 使得边框与图例内容之间间隔中等距离的空白;子选项 bmargin(t=10) 调整了图例与图形之间的间隔,如图 33 所示。

. twoway (scatter low high) (lfit low high),       ///
  legend(region(fcolor(dimgray)) lcolor(black) lwidth(thick) margin(medium) bmargin(t=10))   // 命令33(图33)

4. 调整图形的显示比例

利用 aspectratio 选项、xsize 选项以及 ysize 选项都可以对图形的显示比例进行灵活调整。例如,执行命令 34 后,图形将变得扁长,这是因为 0.3 小于 1,如图 34 所示;若换成命令 35 则会变得瘦长,如图 35 所示。如果执行命令 36,x 轴将设置为 3 英寸,y 轴将设置为 1 英寸,如图 36 所示,用这种方式同样可以调整图形的显示比例。

此外,利用 scale 选项还能在不改变图形整体大小下灵活调整文本以及标记符号显示的大小。例如,执行命令 37 后,坐标轴标题、坐标轴刻度标签以及标记符号都变得较小,这是因为我们设定了大于 1 的 1.6,如图 37 所示。如果我们想绘制一个较小的图形,这个选项就非常有用,因为可以将图形中的文本信息清晰地显示出来。

// 命令34(图34)
. twoway scatter low high, aspectratio(0.3)      

// 命令35(图35)
. twoway scatter low high, aspectratio(1.3)      

// 命令36(图36)
. twoway scatter low high, xsize(3) ysize(1)     

// 命令37(图37)
. twoway scatter low high, scale(1.6)           

图34-37
图34-37

5. 调整图形整体的背景颜色及边框

如果执行命令 38,图形在坐标轴内部区域将被填充为灰色背景,如图 38 所示。如果执行命令 39,图形在坐标轴外围区域将被填充为浅蓝色背景,如图 39 所示。

此外,我们还能对边框进行灵活调整。例如,执行命令 40,坐标轴外围区域的边框线条将变成红色并且加粗,如图 40 所示。如果执行命令 41,坐标轴内部区域的边框线条将变成浅蓝色并且加粗,如图 41 所示。

// 命令38(图38)
. twoway scatter high date, plotregion(color(gray))     

// 命令39(图39)
. twoway scatter high date, graphregion(color(ltblue))  

// 命令40(图40)
. twoway scatter high date, graphregion(lcolor(red) lwidth(vthick))   

// 命令41(图41)
. twoway scatter high date, title("看看这个图") plotregion(lcolor(ltblue) lwidth(vthick))    

图38-41
图38-41

6. 使用系统的绘图模板

最后,给大家介绍一个偷懒的方法。使用 scheme 选项可以调用系统配套的一系列绘图模板。例如,执行命令 42 可以调用系统灰色风格的绘图模板,如图 42 所示;执行命令 43 可以调用最常用到的绘图模板,如图 43 所示。执行命令 44 可以调用一个非常独特的绘图模板,其 y 轴在右边而不是左边,图例在上边而不是下边,如图 44 所示。执行命令 45 所调用的绘图模板独特之处在于其使用了虚线,如图 45 所示。除此之外,你可以尝试其它的绘图模板如 scheme(s1color)scheme(s1momo)以及 scheme(s1manual) 等等,并仔细对比它们之间的差异,选择自己喜欢的模板进行绘图。

// 命令42(图42)
. twoway scatter high date, scheme(s2mono)       

// 命令43(图43)
. twoway scatter high date, scheme(s2color)      

// 命令44(图44)
. twoway (scatter high date) (lfit high date), scheme(economist)      

// 命令45(图45)
. twoway (scatter high date) (lfit high date), scheme(sj)      

图42-45
图42-45

你也许会问:既然可以偷懒那前面学那么多有什么用?个人认为,熟悉选项才能帮助你更熟练掌握 Stata,并且在论文写作过程中,我们常常需要在一些特殊情况下进行细微的调整和修改,这时候你若熟悉各个选项的使用将可以快速解决问题!

7. 结语

至此,本系列上下篇都已完结。希望读者能感受到选项的重要性,在今后 stata 的学习中能够熟悉并灵活利用相关选项,快速解决自己遇到的“疑难杂症”。

8. 参考文献

  • Mitchell M N. A Visual Guide to Stata Graphics(Third Edition)[M] Published by Stata Press, 2012

9. 相关推文

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

相关课程

免费公开课

最新课程-直播课

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

课程主页

课程主页

关于我们

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

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

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

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

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