G5b. Stata 绘图选项(下篇)
作者: 邓鸿斌 (暨南大学)
邮箱: Robin_dum@163.com
编者按: 在 Stata绘图专题 中,我们介绍了各类绘图命令,本系列的两篇推文重点介绍 Stata 绘图命令的 选项。这是 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.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) .
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)) .
其次,我们可以调整分组绘图中图形各要素的呈现方式。例如,如果执行命令 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")) .
再次,我们可以为分组绘图增加总标题。例如,如果执行命令 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)
最后,我们可以通过 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(注释:这是一个注释) .
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)
我们可以用 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) .
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) .
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)) .
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) .
你也许会问:既然可以偷懒那前面学那么多有什么用?个人认为,熟悉选项才能帮助你更熟练掌握 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 Stata 图 +
安装最新版lianxh
命令:
ssc install lianxh, replace
- 万莉, 2020, Stata绘图全解:绘图语法-条形图-箱型图-散点图-矩阵图-直方图-点图-饼图, 连享会 No.34.
- 万莉, 2021, Stata绘图:世行可视化案例-条形图-密度函数图-地图-断点回归图-散点图, 连享会 No.560.
- 万莉, 2021, Stata绘图:回归系数可视化-论文更出彩, 连享会 No.564.
- 万莉, 2020, Stata:空间计量之用-spmap-绘制地图, 连享会 No.401.
- 万莉, 2020, Stata:读懂直方图, 连享会 No.479.
- 侯新烁, 2020, Stata绘图:一个干净整洁的-Stata绘图模板qlean, 连享会 No.354.
- 保瑞, 2021, Stata绘图-组间差异可视化:不良事件火山图、点阵图, 连享会 No.675.
- 冷萱, 2021, Stata:我和她离多远?基于百度地图API的地理距离计算, 连享会 No.509.
- 刘东, 2023, Stata绘图:精美的散点图和线性拟合图-scatterfit-slopefit, 连享会 No.1251.
- 刘杨, 连玉君, 2020, Stata可视化:让他看懂我的结果!coefplot-arrowplot, 连享会 No.45.
- 刘欣妍, 史柯, 2022, Stata:描述性统计分析新命令-dstat, 连享会 No.926.
- 刘潍嘉, 2023, Stata绘图:凹凸线图与凹凸面积图-bumparea-bumpline, 连享会 No.1308.
- 刘聪聪, 陈点点, 2020, Stata:interflex-交乘项该这么分析!, 连享会 No.121.
- 初虹, 2023, 值得收藏!三个Stata可视化绘图网站, 连享会 No.1220.
- 卓震宇, 2023, Stata:让散点图更漂亮-mscatter, 连享会 No.1263.
- 卢家锐, 连玉君, 2020, Stata绘图:用-bytwoway-实现快速分组绘图, 连享会 No.357.
- 史柯, 2022, Stata:绘制宏观时序图, 连享会 No.940.
- 吴俊樊, 2022, Stata:双变量联合核密度函数图-kdens2, 连享会 No.858.
- 吴俊樊, 2022, Stata:多个核密度函数图叠加-mkdensity, 连享会 No.859.
- 吴小齐, 2024, Stata绘图:高级柱状图(二)-离散变量之间关系的可视化, 连享会 No.1469.
- 唐佳敏, 2022, Stata绘图:箱形图与小提琴图-vioplot, 连享会 No.855.
- 唐勇军, 2020, Stata:交乘项的对称效应与图示, 连享会 No.465.
- 孙晓艺, 2024, Stata 绘图:世行研究员团队的可视化手册, 连享会 No.1437.
- 孙晓艺, 2024, Stata绘图大礼包:27个常用的可视化范例及代码, 连享会 No.1372.
- 孙碧洋, 2020, Stata绘图:随机推断中的系数可视化, 连享会 No.471.
- 左祥太, 2021, Stata 绘图:用 Stata 绘制一打精美图片-schemes, 连享会 No.788.
- 左祥太, 2021, Stata可视化:biplot一图看尽方差、相关性和主成分, 连享会 No.814.
- 张伟广, 2020, Stata绘图:bgshade命令-在图形中加入经济周期阴影, 连享会 No.353.
- 张家星, 2023, Stata绘图:为图形选择优美的配色方案-color_style, 连享会 No.1160.
- 张弛, 2024, Stata 绘图:用 geoplot 绘制中国地图, 连享会 No.1401.
- 张蛟蛟, 2022, Stata绘图-可视化:组间差异比较散点图, 连享会 No.897.
- 张远远, 2019, Stata:多期倍分法 (DID) 详解及其图示, 连享会 No.76.
- 张铭鑫, 2022, Stata绘图:circlepack-绘制圆堆图, 连享会 No.1135.
- 强皓凡, 2022, Stata绘图:绘制桑基图-sankey_plot, 连享会 No.949.
- 彭甲超, 2022, Stata绘图:绘制美观的散点图-superscatter, 连享会 No.959.
- 彭甲超, 2021, 常用科研统计绘图工具介绍, 连享会 No.750.
- 徐嘉树, 2019, Stata绘图:绘制单个变量的时序图, 连享会 No.102.