如何用Stata作漂亮的图?来看超详细教程!

如何用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行为一个完整的命令,其中使用///换行)。

图0.1.1

1. 导入数据并观察

为了方便大家学习,我们在本教程中使用Stata自带的数据uslifeexp.dta,大家可以输入sysuse dir这行命令查看系统自带的数据库(图1.1.1)。若没有uslifeexp这个数据库,大家可以在 stata-press.com/data/r9 下载。

图1.1.1 Stata 14.2自带的数据库

. 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

图2.1.1 散点图

- 折线图

. twoway line le year

图2.1.2 折线图

同理,我们还可以做出更多种的图。

. twoway connected le year (左上,带数据标记的折线图)

. twoway dropline le year (右上,垂直线图)

. twoway spike le year (左下,脉冲图)

. twoway lowess le year (右下,lowess图)

图2.1.3

大家可以输入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

图3.2.1

下图Stata代码:twoway line le_male le_female year

图3.2.2

下图Stata代码:twoway area le_female le_male year

图3.2.3

下图Stata代码:twoway line le_wmale le_wfemale le_bmale le_bfemale year

图3.2.4

注意:

在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个命令等价,画出下图)

图3.2.5(同3.2.1)

因此,我们完全可以在同一张图上画出不同y变量。

(以上1-4行为第一个命令,6-9行为第二个命令,两个命令等价,画出下图)

图3.2.6

也可以将yvar1的两种不同的曲线画在同一幅图上。

. twoway (scatter le year) (lfit le year)

. twoway scatter le year || lfit le year

(以上2个命令等价,画出下图)

图3.2.7

4. 改变点的大小形状,改变线的粗细、样式

在这一节,我们主要讲对于点和线的处理。我们重新回到男、女预期寿命比较这幅图(图3.2.1)。

下图的Stata代码:graph twoway scatter le_male le_female year

图4.1.1(同3.2.1)

对于这幅图,我们没有定义点的颜色、形状、大小等等参数,而是接受了Stata给出的默认值。我们也可以对此进行更改。

例如:

下图的Stata代码 (字体加粗部分为新增内容):

graph twoway scatter le_male le_female year, mcolor(red blue) msymbol(circle diamond) msize(vsmall vsmall)

图4.1.2(图3.2.1改进)

在这行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)

图4.1.4(图3.2.2改进)

在这行code中,我们调整了线的颜色(lcolor),连接方式(lpattern),宽度(lwidth)。括号里的顺序(red blue)应按照y变量的顺序 (le_male le_female) 依次对应,这样红色代表le_male,blue代表le_female。

除了线的颜色、连接方式、宽度外,Stata还给了我们多种改进的方案,如线如何连接(阶梯/直线/曲线)、线条风格等。

5. 改进图像整体

在下图分性别和人种的预期寿命比较中,1920年的预期寿命看起来近似于0,但其实是30左右。

图5.1.1(同图3.2.4)

上图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

图5.1.2

下图代码 (字体加粗部分为新增内容):

. twoway line le_wmale le_wfemale le_bmale le_bfemale year, yscale(range(0 90))

※ yscale(range(0 90)) 要求y轴的范围包括0到90

图5.1.3

同理,我们也可以改变使用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添加一个刻度

图5.2.1

同理,对于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)

图5.2.2

然而,现在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)

图5.2.3

(3) 加标题

现在,我们添加了title("20世纪美国预期寿命变化图") subtitle("1900年-2000年") ytitle("预期寿命") xtitle("年份"),其中:

  • 用title("20世纪美国预期寿命变化图") 给图像加上大标题;
  • 用subtitle("1900年-2000年")加上小标题;
  • 用ytitle("预期寿命")给y轴加上标题;
  • 用xtitle("年份") 给x轴加上标题。

下图代码 (蓝色背景部分为新增内容):

图5.3.1

还可以加上说明文字和注释。

下图代码 (蓝色背景部分为新增内容):

图5.3.2

(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)代表希望同一行显示)。

下图代码:

图5.3.3

看完本文,是不是对Stata作图有一些了解呢?有任何不明白的地方,欢迎在文章下方留言哦~~

如果想获取本教程的do file以及需要Stata安装包或视频教程的,请加小咖个人微信(xys2016ykf)索要。

想要及时获得更多内容可关注医咖会官网:

编辑于 2022-10-31 13:56