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

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

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 写论文时常常发现自己力不从心,往往陷入这样一种困境:“这命令我知道啊,可是我需要这样那样的效果却没办法实现,百度也很难百度出来,好绝望啊”!主要原因还是在于我们对命令附带的相关选项不熟悉。用好 stata 的关键在于用好它的选项!

本文将以绘图命令的相关选项为例,展示如何通过运用相关选项来调整图形的各个方面,以便达到我们需要的一些特殊效果。希望借此启发读者注意学习并熟悉其它类型命令的相关选项。

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

. sysuse sp500, clear
. keep in 1/10

1. 标记符号 (msymbol)

1.1 标记符号的形状

考虑到这是推文介绍的第一个选项,稍微花点篇幅进行细致讲解。

举个最简单的例子。当我们执行如下命令 1 时,标记符号使用了系统绘图默认的实心圆,效果如图 1 所示。此时,可以通过 msymbol() 选项来调整标记符号的形状,从而让图形更加美观。例如,执行命令 2 可以将图 1 中的标记符号从实心圆调整成实心方块,如图 2 所示。msymbol(S)中的 Ssquare 的缩写,表示方块。再比如,选项换成 msymbol(s) 可以进一步将图 2 中的标记符号从大的实心方块调整成小的实心方块。类似地,msymbol(t) 对应的标记符号为小三角形;msymbol(sh) 对应的标记符号为小的空心方块,括号的的 h 对应 hollow,表示空心的意思;msymbol(X) 对应的标记符号为大的叉号;msymbol(+) 对应的标记符号为十字号;msymbol(p) 对应的标记符号为小点。你可以分别尝试并进行对比。

// 命令1(图1)
. twoway scatter high date    

// 命令2(图2)
. twoway scatter high date, msymbol(S)   

那如果同一张图中有两组线性数据,msymbol 选项能进行调整吗?当然可以!未加入 msymbol 选项时,两组数据图形的标记符号都是实心圆。而当我们加入 msymbol 选项,即执行命令 3 ,第一组线性数据在图中的标记符号为默认的实心圆,第二组线性数据在图中的标记符号变成了空心圆,如图 3 所示。类似地,执行命令 4 后,第一组线性数据在图中的标记符号变成了实心小三角,第二组线性数据在图中的标记符号依然为空心圆,如图 4 所示。

// 命令3(图3)
· twoway (scatter high date, msymbol(.))  ///
         (scatter low date, msymbol(Oh))     

// 命令4(图4)         
. twoway (scatter high date, msymbol(t))  ///
         (scatter low date, msymbol(Oh))      
图1-4
图1-4

1.2 标记符号的大小

我们通常使用 msize 选项来调整标记符号的大小。

例如,执行命令 5 能够将原先的空心圆标记符号变小,如图 5 所示。当然,你也可以利用“放大或缩小默认值的倍数”这种方式来进行更加灵活的调整,例如执行命令 6,能将空心圆标记符号的大小调整为默认值的 0.5 倍,如图 6 所示;命令 7 能将空心圆标记符号的大小调整为默认值的 2 倍,如图 7 所示。类似地,如果同一张图形中有两组线性数据,也可以通过命令 8 这种方式分别对两组线性数据进行不同控制,如图 8 所示。

// 命令5(图5)
. twoway scatter high date, msymbol(Oh) msize(small)  

// 命令6(图6)
. twoway scatter high date, msymbol(Oh) msize(*0.5)   

// 命令7(图7)
. twoway scatter high date, msymbol(Oh) msize(*2)  
 
// 命令8(图8)
· twoway (scatter high date, msize(*0.5)) (scatter low date, msize(*0.2))  
图5-8
图5-8

1.3 标记符号的填充和轮廓

这部分内容非常类似于 Excel 或 Word 中表格的调整。我们可以运用 mcolor 选项来调整标记符号整体的颜色,例如,执行命令 9 后,标记符号整体颜色将变成红色,如图 9 所示。而如果将 mcolor(red) 换成 mcolor(navy),标记符号整体颜色则会变成深蓝色。

那我们能跟 Excel 或 Word 中的表格一样将内部填充和轮廓分别进行不同调整和控制吗?完全没问题!尝试执行命令 10,你将得到浅蓝色填充颜色以及黑色轮廓的标记符号,如图 10 所示;其中,mfcolor 选项控制内部填充颜色,mlcolor 选项控制外面轮廓。当然,我们也可以跟 Excel 或 Word 中的表格一样将轮廓(边框)进行加粗,此时只需加上 mlwidth 选项即可,例如命令 11 ,如图 11 所示,与前面相同的逻辑,mlwidth(*2)表示将轮廓粗细调整为默认值的两倍,后面遇到类似逻辑将不再赘述。

// 命令9(图9)
. twoway scatter high date, mcolor(red)  

// 命令10(图10)
. twoway scatter high date, mfcolor(ltblue) mlcolor(black) 

// 命令11(图11)
. twoway scatter high date, mfcolor(ltblue) mlcolor(black) mlwidth(*2)  

1.4 组合拳

我们可以同时使用 1.1~1.3 部分介绍的这些小技巧对同一张图形进行美化。例如,执行命令 12 后可以发现,该图中标记符号的形状、大小、填充和轮廓都进行了相应的调整和设定,如图 12 所示。读者可自行尝试其它不同的搭配形式。

// 命令12(图12)
. twoway scatter high date, msymbol(S) msize(small) mfcolor(ltblue) mlcolor(black) mlwidth(*2)  

图9-12
图9-12

1.5 使用系统设定风格

stata 系统中有一系列设定好的风格,分别以 p1、p2、p3....命名。这些设定好的风格已经对前面 1.1~1.4 部分介绍的标记符号形状、大小、填充和轮廓都进行了合理的搭配,如果你觉得前面对每一项单独设置调整比较麻烦,也可直接使用系统设定好的风格,加入mstyle 选项,例如mstyle(p3)。但建议最好还是尽量逼迫自己学会对每一项单独进行灵活调整,才能做出比较美观的图形。

2. 标记符号标签的相关选项

有时候我们需要在图形上面的散点增加标签,以便呈现数据更多方面的信息。以下总结了这方面相关的一些通用和常用的选项。

2.1 为标记符号创建标签

运用 mlabel 选项即可为标记符号创建对应标签。例如,执行命令 13 便可以在为每一个点添加上对应的“交易量”这一信息,如图 13 所示。当然,一些特殊情形下我们不想呈现标记符号而仅保留标签,可以进一步加上 1.1 节介绍的msymbol 选项,执行命令 14 即可将标记符号隐藏起来,如图 14 所示。

// 命令13(图13)
. twoway scatter high date, mlabel(volume)  

// 命令14(图14)
. twoway scatter high date, mlabel(volume) msymbol(i)   

图13-14
图13-14

2.2 标记符号的标签位置、角度、大小以及颜色等

标签的位置通常用 mlabpos 选项进行调整,例如:命令 15 能将所有标签的位置都调到标记符号的六点钟方向(即正下方),如图 15 所示。另外,如果想为不同散点的标签设立不同的位置,只需要在原始数据中增加一列新变量(例如 position),然后在这列变量中为每一散点输入你想设定的位置如 3、6、9,加入 mlabvpos(position) 后散点的标签位置将分别按照 position 变量中设定的位置进行调整如 3 点钟方向、6 点钟方向、9 点钟方向。

标签的角度通常用 mlabangle 选项进行调整,例如:执行命令 16 后,标签将沿着 30 度线倾斜呈现,如图 16 所示。

标签的大小通常用 mlabsize 选项进行调整,例如:mlabsize(vsmall) 意味着标签将变得特别小(vsmall=very small),而执行命令 17 则能将标签大小灵活调整为默认值的 0.5 倍,如图 17 所示。

通常用 mlabcolor 选项和 mlabgap 选项来分别调整标签的颜色以及标签与标记符号之间的距离,例如:执行命令 18 后,标签颜色将变成红色,标签与标记符号之间的距离将灵活调整为默认值的 4 倍,如图 18 所示。

// 命令15(图15)
. twoway scatter high date, mlabel(volume) mlabpos(6)   

// 命令16(图16)
. twoway scatter high date, mlabel(volume) mlabangle(30)    

// 命令17(图17)
. twoway scatter high date, mlabel(volume) mlabsize(*0.5)   

// 命令18(图18)
. twoway scatter high date, mlabel(volume) mlabcolor(red) mlabgap(*4)   

图15-18
图15-18

3. 利用选项将散点连接起来

3.1 连接方式

我们还可以利用选项选择不同类型的线条将散点连接起来。例如:添加 sort 便能够将此前孤立的散点连接起来。在此基础上,通过添加 connect 选项可以灵活选择连接散点的不同线型。例如,执行 命令 19 将使用“J”型线条将散点连接起来,如图 19 所示;执行命令 20 将使用阶梯型线条将散点连接起来,形状刚好与图 19 相反,如图 20 所示;执行命令 21 的效果与一般的折线图相似,如图 21 所示。

// 命令19(图19)
. twoway connected high date, connect(J) sort   

// 命令20(图20)
. twoway connected high date, connect(stepstair) sort   

// 命令21(图21)
. twoway connected high date, connect(L) sort   

3.2 线条的颜色和粗细等

当然,与前面各节思路一样,线条的颜色、粗细以及线型等等都能运用相关选项进行灵活调整。例如,执行命令 22 后的效果如图 22 所示,其中,lcolor(red) 选项将线条颜色调整为红色,lwidth(thick) 选项将线条加粗,lpattern(dash) 选项将线型设置为虚线。

// 命令22(图22)
. twoway connected high date, sort lcolor(red) lwidth(thick) lpattern(dash)  

图19-22
图19-22

4. 坐标轴标题相关选项

4.1 添加坐标轴标题

利用 ytitlextitle 选项能分别为 y 轴和 x 轴添加坐标轴标题。例如,执行如下命令后,分别将 y 轴和 x 轴的标题设置为“The A-Share Stocks' High Price of the Date of Transaction”以及“The Date of Transaction”,如图 23 所示。当然,这样的坐标轴标题呈现效果是非常粗糙的,需要进一步运用一些常用选项对其进行调整。

// 命令23(图23)
. twoway scatter high date,  ///
         ytitle("The A-Share Stocks' High Price of the Date of Transaction")  ///
         xtitle("The Date of Transaction")        

4.2 坐标轴标题的排列、大小以及颜色等

首先,我们发现 y 轴的标题名称太长了,此时可用两个双引号将 y 轴名称分成两部分。例如,改成以下几行命令后,得到的图形效果如图 24 所示。

// 命令24(图24)
. twoway scatter high date,                 ///
         ytitle("The A-Share Stocks' High Price" "of the Date of Transaction")  ///
         xtitle("The Date of Transaction")    
图24-27
图24-27

其次,使用 size 选项和 color 选项能够灵活调整坐标轴标题的大小以及颜色。例如,将前述命令改为以下几行之后,坐标轴标题的大小变为默认值的 1.5 倍,颜色变成红色,如图 25 所示。

// 命令25(图25)
. twoway scatter high date,                 ///
         ytitle("The A-Share Stocks' High Price" "of the Date of Transaction")  ///
         xtitle("The Date of Transaction", size(*1.5) color(red))     

此外,如果我们有两组线性数据但二者的 y 轴不一样时,可以创建两个 y 轴并将它们在同一张图形中展示吗?增加一个选项就能完成!例如,以下两行命令中,yaxis(2) 选项就帮助我们在右边创建了第二个 y 轴,如图 26 所示。

// 命令26(图26)
. twoway (scatter high date) (scatter low date, yaxis(2))     

最后,有两组线性数据的情况下创建完两个 y 轴后,如何调整两个 y 轴的标题呢?如下面几行命令所示,只需要添加 axis(1) 选项和 axis(2) 即可分别创建并灵活调整两个 y 轴的标题。执行完的效果如图 27 所示。其中,axis(1) 选项表示第一个坐标轴,而axis(2) 选项表示第二个坐标轴。例如 y 轴在左边就是 y 轴的第一个坐标轴,而 y 轴在右边就是 y 轴的第二个坐标轴。

// 命令27(图27)
. twoway (scatter high date) (scatter low date, yaxis(2)), ///
         ytitle("The A-Share Stocks' High Price" "of the Date of Transaction", axis(1))  ///
         ytitle("The A-Share Stocks' low Price" "of the Date of Transaction", axis(2))   

5. 坐标轴刻度标签

5.1 坐标轴刻度标签的个数、间隔以及刻度条

绘制的每张图形无需特别设定,都会有自带默认的坐标轴刻度标签。例如,执行没有特别的选项的命令,也会自带坐标轴刻度标签,但效果常常无法让我们满意。我们同样可以利用一些常用选项来对此进行灵活调整。

首先,我们可以调整坐标轴上出现的刻度标签的个数。例如,执行命令 28 ,x 轴将设定为 5 个刻度标签,y 轴将设定为 8 个刻度标签,如图 28 所示。这主要是通过其中的 xlabel(#5)ylabel(#8) 选项来灵活设定调整的。

我们也可以设定刻度的上下界以及相邻两个刻度之间的间隔值,即刻度间距。例如,执行命令 29 后,选项 ylabel(1290(10)1360) 规定了 y 轴的刻度标签从 1290 变化到 1360,并且相邻两个刻度之间的间隔 10 个单位,如图 29 所示。一个更加简洁好玩的图形是:执行命令 30 后,x 轴既没有刻度标签也没有刻度条,而 y 轴则仅有最大值和最小值两个刻度标签,如图 30 所示;类似地,执行 命令 31 后,y 轴只有刻度条没有刻度标签,如图 31 所示;而执行命令 32 后,y 轴只有刻度标签没有刻度条,如图 32 所示。

// 命令28(图28)
. twoway scatter high date, xlabel(#5) ylabel(#8)   

// 命令29(图29)
. twoway scatter high date, ylabel(1290(10)1360)    

// 命令30(图30)
. twoway scatter high date, xlabel(none) ylabel(minmax)  

// 命令31(图31)
. twoway scatter high date, ylabel(, nolabel)   

图28-31
图28-31

我们还可以使用 xmlabelymlabel 选项来为坐标轴添加二级刻度标签(minor label or numeric label)。例如,执行命令 33,y 轴将新增加了二级刻度标签,从 1295 开始到 1355,并且二级刻度标签中相邻两个刻度之间间隔 10,如图 33 所示。注意,ylabel 对应主刻度标签,而ymlabel 对应二级刻度标签。

此外,我们可以用 xtickytick 选项来为坐标轴增添刻度但不显示标签值。例如,执行命令 34 ,y 轴将增加了“1295、1305、1315、1325、1335、1345、1355”共七个刻度条,但没有刻度标签(即不显示数值),如图 34 所示,这样既增加了精确度但又不会显得特别拥挤。类似地,我们如果将选项换成ymtick(1295(10)1355),y 轴增加的七个刻度条将会以二级刻度条的形式出现。注意,ytick 对应主刻度条,而 ymtick 对应二级刻度条。如果执行命令 35,y 轴相邻两个主刻度之间将新增加 5 个二级刻度条,如图 35 所示。

// 命令32(图32)
. twoway scatter high date, ylabel(, noticks)   

// 命令33(图33)
. twoway scatter high date, ymlabel(1295(10)1355)   

// 命令34(图34)
. twoway scatter high date, ytick(1295(10)1355)  

// 命令35(图35)
. twoway scatter high date, ymtick(##5)    

图32-35
图32-35

5.2 坐标轴刻度标签的角度、大小、粗细等等

一般使用 ylabel(, angle()) 选项来对刻度标签的角度进行调整。例如,y 轴刻度标签默认是垂直的(90 度),若执行命令 36,y 轴刻度标签将变成水平(0 度),而 x 轴刻度标签将设置成 45 度,如图 36 所示。

一般使用 labsize 选项来对刻度标签的大小进行调整。例如,执行命令 37 后,y 轴刻度标签将得特别小,如图 37 所示。

// 命令36(图36)
. twoway scatter high date, ylabel(, angle(0) xlabel(, angle(45))  

// 命令37(图37)
. twoway scatter high date, ylabel(, labsize(vsmall))   

图36-37
图36-37

一般使用 labgap 选项来调整刻度标签与刻度条之间的距离。例如,执行命令 38 后,y 轴刻度标签与刻度条之间的距离将变成默认值的 8 倍,如图 38 所示。

一般使用 grid 选项来对网格线进行调整,以便读者更快速看出散点对应到 y 轴的刻度标签。绘图时默认是附带网格条的,执行命令 39 后,将去除网格条,如图 39 所示。此外,我们还可以对网格线的粗细、颜色以及线型进行灵活调整。 例如,执行命令 40,选项 glwidth(vthin) 使得网格线变得特别细,选项 glcolor(gs10) 使得网格线变成灰色,选项 glpattern(shortdash) 使得网格线变成短虚线,如图 40 所示。

另外,我们也可以调整坐标轴刻度条的粗细、长度以及位置。例如,执行命令 41 ,选项 tlength(large) 使得刻度条变长,选项 tlwidth(thick) 使得刻度条加粗,选项 tposition(crossing) 使得刻度条与 y 轴交叉,如图 41 所示。

// 命令38(图38)
. twoway scatter high date, ylabel(, labgap(*8))    

// 命令39(图39)
. twoway scatter high date, ylabel(, nogrid)    

// 命令40(图40)
. twoway scatter high date, ylabel(, grid glwidth(vthin) glcolor(gs10) glpattern(shortdash))    

// 命令41(图41)
. twoway scatter high date, ylabel(, tlength(large) tlwidth(thick) tposition(crossing))     

图38-41
图38-41

6. 坐标轴

6.1 坐标轴的位置

我们可以将整个坐标轴隐藏起来,例如执行命令 42 后,不再显示 x 坐标轴,如图 42 所示;也可以将坐标轴从下面搬到上面,例如命令 43,如图 43 所示;甚至还可以将坐标轴转个方向,例如将 xscale 选项转换为xscale(reserve)后,x 轴的原点将移到最右边,也即从左到右是按从大到小的顺序排列。

// 命令42(图42)
. twoway scatter high date, xscale(off)    

// 命令43(图43)
. twoway scatter high date, xscale(alt)    

6.2 坐标轴的取值范围

yscale 选项也可以对 y 轴上呈现的数据范围进行设定调整。例如,执行命令 44 后,y 轴呈现范围从 1280 到 1350,如图 44 所示。前面介绍过 ylabel 选项也能调整刻度标签的取值范围,但注意二者是有区别的,yscale 虽然呈现指定的取值范围,但由于小于 1300 范围内因为没有对应的数据,因此并不显示刻度标签。

当原始数据是对数分布时,我们除了可以对某一变量进行取对数以外,也可以将坐标轴变成对数分布形式,即相邻刻度之间不再是等间隔相等的数值单位。例如,执行命令 45 后,y 轴将等分为 5 个刻度条“1 10 100 1000 10000”,但它们之间并非间隔相等的数值单位,而是呈对数分布形式,如图 45 所示。

// 命令44(图44)
. twoway scatter high date, yscale(range(1280 1350))    

// 命令45(图45)
. twoway scatter high date, yscale(log) ylabel(1 10 100 1000 10000)    

图42-45
图42-45

6.3 坐标轴的线条

我们也可以对坐标轴的线条进行调整。例如,执行命令 46 后,x 轴将会加粗,如图 46 所示;执行命令 47 后,将不会在图形中显示 x 轴,如图 47 所示;执行命令 48 后,将只显示 x 轴的刻度标签而不显示坐标轴横线,如图 48 所示。

// 命令46(图46)
. twoway scatter high date, xscale(lwidth(thick))   

// 命令47(图47)
. twoway scatter high date, xscale(off)     

// 命令48(图48)
. twoway scatter high date, xscale(noline)     

6.4 坐标轴的个数

前面 4.2 节介绍过在两组数据的情形下如何设置两个 y 轴坐标标题,与此类似,这里介绍如何使用 yaxis 选项设置两个 y 轴坐标。例如,执行命令 49 后,第一组数据将对应左边的 y 轴,第二组数据将对应右边的 y 轴,如图 49 所示。

// 命令49(图49)
. twoway (scatter high date, yaxis(1)) (scatter low date, yaxis(2))     

图46-49
图46-49

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