如何用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这个数据库,大家可以在http://www.stata-press.com/data/r9/uslifeexp.dta下载。

 

图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

描述问题
选择一个标签 (请选择一个与您问题最相符的标签)
提交问题
我要提问
描述问题
选择一个标签 (请选择一个与您问题最相符的标签)
提交问题
描述问题
选择一个标签 (请选择一个与您问题最相符的标签)
    提交问题