如何用Stata作漂亮的图?来看超详细教程!
概要
本文涉及到的内容包括,在拿到一个数据集后:
- 如何使用list、describe命令,初步了解数据集;
- 如何使用codebook、summarize命令了解某一个变量x的缺失值、统计量,并使用stem、graph box、histogram命令画出茎叶图、箱式图以及柱状图;
- 如何使用twoway graphs来展示数值型变量x和y之间的关系,并画出散点图(scatter plot)、折线图(line plot)、带数据标记的直线图(connected plot)等多种图像;
- 如何使图像变得更加美观。
下面,我们通过例子来了解这些命令。本次使用的是1900-1999年美国期望寿命的数据,这是Stata 14.0自带的一个数据库。
提醒
(1) 使用Stata时,尽量不用命令框,而最好使用do file编写命令。这样可以保证操作的可重复性。
(2) 本文中,所有命令以 黄色背景、粗体、蓝色字体 显示。
(3) do file中命令末尾的双斜线//表示添加注释(例如,图0.1.1第6行set linesize 255后为注释),三斜线///表示换行(例如,图0.1.1从第8行到16行为一个完整的命令,其中使用///换行)。
1. 导入数据并观察
为了方便大家学习,我们在本教程中使用Stata自带的数据uslifeexp.dta,大家可以输入sysuse dir这行命令查看系统自带的数据库(图1.1.1)。若没有uslifeexp这个数据库,大家可以在
http://www.
stata-press.com/data/r9
/uslifeexp.dta
下载。
. sysuse uslifeexp
这一步的目的是导入该系统自带数据。屏幕显示的结果如下。
. list in 1/10
通过这个命令,我们可以查看该数据库第1到第10个数据,对数据有一个初步的了解。屏幕显示的结果如下。
. describe
通过这个命令,我们可以查看这个数据集的简要介绍,包括了样本数量(obs:100)、变量数量(vars:10)、大小(size:3800)、以及每个标量的简要介绍。屏幕显示的结果如下。
2. 单变量探索以及作图
在这一小节中,我们一起来对某一个变量进行探索。我们会用到四个命令,分别是codebook、summarize、stem以及histogram。我们以数据集中的变量le (life expectancy)为例。这个变量是人均预期寿命。
2.1 Codebook
Codebook这个命令适合于我们初次接触一个数据集的变量。
. codebook le
下图是codebook le这行命令给出的结果。我们可以看到,output给出了该变量的标签(life expectancy)、类型(numeric: float)、范围、单位、特异值、缺失值(0/100)、以及一些统计量。这样,我们对于该变量有一个初步的了解。
2.2 Summarize
Summarize这个命令可以让我们更加深入地探索变量的统计量。
. summarize le
下图是summarize le这行命令的结果,给出最常用的几个统计量。
而summarize le, detail这行命令则会给出更多的统计量。
. summarize le, detail
其中,smallest和largest代表了该变量最大和最小值,即预期寿命(le)的4个最高值和4个最低值。
2.3 其他图像
为了探索变量的分布,我们还可以使用茎叶图(stem plot)、箱式图(box plot)、直方图(histogram)等图像进行探索。
. stem le
. graph box le (左图)
. hist le (右图)
** hist是histogram的缩写。在Stata中,一些命令有缩写形式,如summarize可以缩写为sum。
由于篇幅有限,对于这些图像,我们在此不做赘述。但是我们应该记住,茎叶图的茎宽、保留位数;直方图的组距、颜色、y轴是频率还是频数等都可以进行自定义,直到画出满意的图像。感兴趣的读者可以在命令行中输入help stem、help graph box、help histogram获取help文件。如还有不清楚的地方,可以联系小咖获取帮助。
3. 双变量作图
在这一小节中,我们对于双变量进行绘图。我们继续研究预期寿命(le)随年份(year)变化的规律。不同的是,我们使用le_male与le_female绘制2个y变量和x的图,使用le_wmale、le_wfemale、le_bmale、le_bfemale绘制4个y变量和x的关系。
. twoway plot [if] [in] [, twoway_options]
twoway的命令是twoway plot 变量 [if] [in] [, twoway_options] ,我们可以自己定义的主要是:
- plot:选择图像的种类,这里的plot可以改成scatter, plot, connected, area, bar等,我们可以绘制出相应的图。
- 变量:这里可以写一个或多个y变量,一个x变量。最后一个是x变量,之前的为y变量。
- [if] [in] [, twoway_options] 等中括号内的命令是可选命令,如果不写,则表示默认值。
- if:定义所取某一个自变量的范围,例如if le > 40,即只画le>40的图
- in:定义所取观测值的范围,例如in 10/20,即只画第10到20个观测值的图
- twoway_options:可以定义图像的“美观”部分,例如坐标轴范围、标题、注释、标签等等。
3.1 一个y变量(预期寿命(le)随年份(year)变化的关系)
twoway plot y x,其中plot可以换为某种特定的图像,如scatter。
- 散点图
下图Stata代码:
. twoway scatter le year
- 折线图
. twoway line le year
同理,我们还可以做出更多种的图。
. twoway connected le year (左上,带数据标记的折线图)
. twoway dropline le year (右上,垂直线图)
. twoway spike le year (左下,脉冲图)
. twoway lowess le year (右下,lowess图)
大家可以输入help graph_twoway,查看Stata都可以做出什么样的图。
3.2 多个y 变量
命令形式:graph twoway plot yvar1 yvar2 yvar3 … xvar
plot表示我们要画的是某种图,之后是变量的名字。
Stata会默认最后一个变量是x变量,plot和x变量之间则均为y变量。
下图Stata代码:graph twoway scatter le_male le_female year
下图Stata代码:twoway line le_male le_female year
下图Stata代码:twoway area le_female le_male year
下图Stata代码:twoway line le_wmale le_wfemale le_bmale le_bfemale year
注意:
在Stata中,上述命令graph twoway plot yvar1 yvar2 yvar3 xvar和下列命令等价:
- graph twoway (plot yvar1 xvar) (plot yvar2 xvar) (plot yvar3 xvar)
- graph twoway plot yvar1 xvar || plot yvar2 xvar || plot yvar3 xvar
. twoway scatter le_m le_f year
. twoway (scatter le_m year) (scatter le_f year)
. twoway scatter le_m year || scatter le_f year
(以上3个命令等价,画出下图)
因此,我们完全可以在同一张图上画出不同y变量。
(以上1-4行为第一个命令,6-9行为第二个命令,两个命令等价,画出下图)
也可以将yvar1的两种不同的曲线画在同一幅图上。
. twoway (scatter le year) (lfit le year)
. twoway scatter le year || lfit le year
(以上2个命令等价,画出下图)
4. 改变点的大小形状,改变线的粗细、样式
在这一节,我们主要讲对于点和线的处理。我们重新回到男、女预期寿命比较这幅图(图3.2.1)。
下图的Stata代码:graph twoway scatter le_male le_female year
对于这幅图,我们没有定义点的颜色、形状、大小等等参数,而是接受了Stata给出的默认值。我们也可以对此进行更改。
例如:
下图的Stata代码 (字体加粗部分为新增内容):
graph twoway scatter le_male le_female year, mcolor(red blue) msymbol(circle diamond) msize(vsmall vsmall)
在这行code中,我们调整了点的颜色(mcolor),形状(msymbol),大小(msize)。括号里的顺序(red blue)应按照y变量的顺序 (le_male le_female) 依次对应,这样红色代表le_male,blue代表le_female。
除了点的颜色、形状、大小外,Stata还给了我们多种改进的方案,如点内部颜色、点外周颜色、点外周宽度等等。读者可以通过在命令行里输入help scatter##marker_options得到更加详尽的介绍。
我们也可以更改连线的属性。让我们回到3.2.2这幅图。
下图Stata代码:twoway line le_male le_female year
图4.1.3(同图3.2.2)
对于这幅图,我们同样可以改进。
下图Stata代码 (字体加粗部分为新增内容):
twoway line le_male le_female year, lcolor(red blue) lpattern(solid dash) lwidth(thin thin)
在这行code中,我们调整了线的颜色(lcolor),连接方式(lpattern),宽度(lwidth)。括号里的顺序(red blue)应按照y变量的顺序 (le_male le_female) 依次对应,这样红色代表le_male,blue代表le_female。
除了线的颜色、连接方式、宽度外,Stata还给了我们多种改进的方案,如线如何连接(阶梯/直线/曲线)、线条风格等。
5. 改进图像整体
在下图分性别和人种的预期寿命比较中,1920年的预期寿命看起来近似于0,但其实是30左右。
上图Stata代码:twoway line le_wmale le_wfemale le_bmale le_bfemale year
我们怎样调整坐标轴的范围、单位,以更适应我们的预期呢?
(1) 改变坐标轴的最大值、最小值
下图代码 (字体加粗部分为新增内容):
. twoway line le_wmale le_wfemale le_bmale le_bfemale year, yscale(range(0))
yscale(range(0)) 要求y轴的范围包括0
下图代码 (字体加粗部分为新增内容):
. twoway line le_wmale le_wfemale le_bmale le_bfemale year, yscale(range(0 90))
※ yscale(range(0 90)) 要求y轴的范围包括0到90
同理,我们也可以改变使用xscale(range())来改变x轴的范围。
(2) 改变坐标值的刻度
在图3.1.2中,我们虽然包含了0和90,但是图看起来仍然很丑,因为y轴的刻度值仍然是从30到80。因此我们要改变坐标轴刻度的起止点和范围。
下图代码 (字体加粗部分为新增内容):
. twoway line le_wmale le_wfemale le_bmale le_bfemale year, yscale(range(0 90)) ylabel(0(10)90)
※ ylabel(0(10)90)的意思是y轴的刻度从0开始,到90结束,每隔10添加一个刻度
同理,对于x轴,我们希望每隔5年标记一个刻度。我们加上了xlabel(1900(5)2000)
下图代码 (字体加粗部分为新增内容):
twoway line le_wmale le_wfemale le_bmale le_bfemale year, ///
yscale(range(0 90)) ylabel(0(10)90) xlabel(1900(5)2000)
然而,现在x轴的坐标重叠到了一起,不是很好看清楚。
我们将xlabel稍作更改:xlabel(1900(5)2000)改为xlabel(1900(10)2000) ,并加上了xtick(1900(5)2000)。我们使用xtick(1900(5)2000),意味着每隔5年在x轴上加一个小标记,而xlabel(1900(10)2000)意味着每隔10年在x轴上写上具体的年份。
下图代码 (字体加粗部分为新增内容):
twoway line le_wmale le_wfemale le_bmale le_bfemale year, ///
yscale(range(0 90)) ylabel(0(10)90) xlabel(1900(10)2000) xtick(1900(5)2000)
(3) 加标题
现在,我们添加了title("20世纪美国预期寿命变化图") subtitle("1900年-2000年") ytitle("预期寿命") xtitle("年份"),其中:
- 用title("20世纪美国预期寿命变化图") 给图像加上大标题;
- 用subtitle("1900年-2000年")加上小标题;
- 用ytitle("预期寿命")给y轴加上标题;
- 用xtitle("年份") 给x轴加上标题。
下图代码 (蓝色背景部分为新增内容):
还可以加上说明文字和注释。
下图代码 (蓝色背景部分为新增内容):
(4) 改变图例
在Stata中,图例默认按照变量的标签(label)添加,堆积在图像的底部。我们怎么能把图例做得更美观呢?比如,加上中文?改变位置?改变排列顺序? 我们可以添加legend()选项进行改变。
在下图中,我们添加了legend(ring(0) pos(5) label(1 "白人男性") label(2 "白人女性") label(3 "黑人男性") label(4 "黑人女性") cols(1)),其中:
- ring(0)代表把图例放在图像内部;
- pos(5)代表了图例在图像的5点钟的位置(和钟表的数字位置相同);
- label改变了图例的文字,从1-4对应着命令中le_wmale le_wfemale le_bmale le_bfemale的顺序;
- cols(1)代表希望他们在一列中显示(同理,rows(1)代表希望同一行显示)。
下图代码:
看完本文,是不是对Stata作图有一些了解呢?有任何不明白的地方,欢迎在文章下方留言哦~~
如果想获取本教程的do file以及需要Stata安装包或视频教程的,请加小咖个人微信(xys2016ykf)索要。
想要及时获得更多内容可关注医咖会官网: