查看原文
其他

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

2017-07-16 张明宇 医咖会

概要

本文涉及到的内容包括,在拿到一个数据集后:

  • 如何使用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


看完本文,是不是对Stata作图有一些了解呢?有任何不明白的地方,欢迎在文章下方留言哦~~如果想获取本教程的PDF电子版或do file,也请在下方留言中留下邮箱,小咖发到你邮箱!


:需要Stata安装包或视频教程的,请加小咖个人微信(xys2016ykf)索要。


相关阅读

1. 分类变量和连续变量的统计图示例

2. Meta分析的几种图形示例和绘图建议

3. 生存分析,怎么呈现结果图表?

医咖会微信:medieco-ykh

关注医咖会,涨姿势!


我们建了一个微信群,有临床研究设计或统计学方面的难题?快加小咖个人微信(xys2016ykf),拉你进群和其他小伙伴们一起交流学习。


点击左下角“阅读原文”,看看医咖会既往推送了哪些研究设计或统计学文章。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存