G1. Stata 绘图概览

作者: 周涛 (华中师范大学)
邮箱:

对于日常使用中这些二维图,stata都能提供非常简洁的命令来绘制,其中包括散点图、折线图、区域图等,较为复杂的包括矩阵图、条形图、饼图等。在时间序列分析中,我们也可以用stata命令来绘制相关系数图、偏相关系数图以及VAR分析中的脉冲响应函数图。

  Stata 提供的图形种类:
 
   graph twoway   二维图
        scatter   散点图
        line      折线图
        area      区域图
        lfit      线性拟合图
        qfit      非线性拟合图
        histogram 直方图
        kdensity  密度函数图
        function  函数图
  -----------------------------
   graph matrix   矩阵图
   graph bar      条形图
   graph dot      点图
   graph box      箱形图
   graph pie      饼图
  -----------------------------
      ac        相关系数图
      pac       偏相关系数图
      irf       脉冲相应函数图
  -----------------------------
     ... ...                         

如果想对stata绘图命令有一个整体的了解,我们可以查看 help graph_intro 这个帮助文件,它介绍了常用的stata绘制的二维图形的命令以及对应的选项,其中,【A quick tour】这一部分提供了一系列的绘图命令以及相关教程,点击每条命令下的蓝色链接就可以看到这条命令的执行效果。

    help graph_intro

G1.1 几个简单的例子

下面通过几个简单的案例,来让大家感受一下stata绘图的精美之处。

首先我们来看一直彩色的蝴蝶,这支蝴蝶就是通过我们将要在第四讲中介绍的函数图来实现的。

do G1_butterfly.do    //函数图: 一只蝴蝶, G4_function.do

第二幅图形是一张密度函数曲线,附带了一系列的背景的带状。在做宏观经济分析里面,我们经常要反映不同的宏观经济学周期,这就可以通过这种带状来实现。

do G1_color_brand.do  //彩色带状背景

我们再看一个韦恩图,我们可以通过这三个简单的圆圈来描述三个变量之间的关系以及他们重叠的程度,在R1这一讲介绍线性回归的拟合优度时,我们会利用韦恩图给出一个非常直观的展示。

sysuse nlsw88, clear
pvenn married collgrad south //韦恩图,  R1_regression.do

G1.2 二维图命令的基本结构

我们首先先通过几个简答的图形范例,让大家有一个直观的感受,然后在做一个整体上的总结。

例 1:一些简单的图形

我们先导入标准普尔500指数的数据,包含了2001年sp500指数258个交易日的全部资料,然后绘制最高价的走势。在 G2_line 这一讲里我们也会对这种线性趋势图进行详细的讨论。

. sysuse sp500, clear
. twoway line high date       // G2_line.do

我们也可以绘制散点图,只需要把图形种类改成 scatter,同时我们设置散点的种类是 “+”

twoway scatter high date, m(+)

除此之外,我们可以通过下面的命令绘制出连线图,我们看到的是一个黑白的图片,这时候我们是通过选项模板 scheme(s2mono) 来进行设定的,stata给我们提供了十几种模板,我们可以通过帮助文件来查看。有些模板是彩色的有些是黑白的,我们按照自己的需要进行设定。

twoway connect high date, scheme(s2mono)
    help schemes      //绘图模板

我们再看一个直方图,它与之前的二维图的规制方式不太一样,它是用了一个专属的命令 histogram 来呈现某一变量的分布情况,在 G3_histogram 这一讲里面我们会详细介绍直方图的绘制方法。

    histogram change  //直方图,  G3_histogram.do

例 2:两根折线图

上面呈现的图形只是一幅简单的图片, 我们可以看第二个例子,绘制两根折线图。

twoway (line high date) (line low date) 
twoway line high date || line low date   //等价命令

蓝色和红色的两条线分别代表最高和最低价的走势,我们在绘制的时候实际上是通过两个透明的胶片来呈现的,第一个括号里面是第一个透明胶片,它呈现了最高价的走势,对应的第二个括号里面的是第二个透明胶片,表示最低价的走势图。这两个透明胶片是通过两个不同括号把他们分隔开的,与它等价的是,我们也可以通过 "||" 把它们分开,stata里面我们是使用了这种图层的概念,我们可以附加很多个图层,每一个图层呈现不同的元素。

最后,我们再来看一个相对完整的例子.

这张图也是绘制的最高价和最低价的走势图,和上面不一样的是我们增加了一系列的选项,例如图形的标题以及标题框,这是通过 title 这个选项来实现的; X 轴和 Y 轴的标题我们都对应的通过xtitleytitle 来选定,而两个轴上面的标签则通过xlabelylabel 来呈现。另外,这幅图的图例是在图的内部,这里我们是用 legend 这个命令在设置的,在随后的讲解里面 我们会非常详细的介绍这个选项的设置方法。最后我们也填写了 notecaption这两个注释,它们的文字说明都放在了左下角。

完成这幅图片之后,我们可以通过几种方式来保持,一种方式是直接在生成他的过程中就通过 saving 这个选项来保存成stata默认格式 gph,但是这种图形格式在Word兼容方面并不是非常好,所以我们在实际中也可以通过一行命令 graph export 来更改图片保存格式。

sysuse "sp500", clear

twoway (line high date) (line low date)         ///
       ,                                        ///  
   title("图1:股票最高价与最低价时序图", box)    /// //图形标题
   xtitle("交易日期", margin(medsmall))         /// //x轴标题
   ytitle("股票价格")                           /// //y轴标题
   ylabel(900(200)1400) ymtick(##5)            /// //y轴刻度标签
   xlabel(,angle(20))                          /// //x轴刻度标签
   legend(col(1) ring(0) position(7))          /// //图例
   note("资料来源:Stata公司,SP500.dta")       ///
   caption("说明:我做的第一幅Stata图形!")      ///
   saving(mypig.gph, replace)                       //存储图片
       
graph export G1_mygraph.wmf, replace  //输出为 .wmf 格式  

  • 小结

最后做一个简单的总结,无论是多么复杂的图形,实际上构成的元素无非是点线面,stata 里面是通过主绘图命令以及一些选项来控制这些元素的特征,所以stata绘图过程中的关键在于选项的填写。

G1.3 常用帮助文档

在我们实际绘图过程中,可以通过下面的一些帮助文档来提升我们绘图的美感。

  help graph_intro    //绘图导航图
 
  help graph          //基本命令: 图形种类,保存,打印,合并等
  
  help graph_other    //其他图形
  
  help graph set      //有关图形颜色,字体等的设定
  
  help set scheme     //设定绘图模板
  
  help graph text     //在图形中添加特殊字符
  
  help twoway_options //图形选项,重要, 【点-线-面-文字】
  
  help graph_editor   //图形编辑器

提示:将上述命令中的 help 改为 ihelp (安装命令:ssc install ihelp) 即可查看对应的 PDF 帮助文档。

扩展阅读

附:文中使用的 dofile

G1_butterfly.do


*------- G1_butterfly.do ---------

*--------------- Stata 花蝴蝶-----------------
*-蝴蝶身体部分
  clear
  local b0 = -400
  local b1 = 4
  local d  = 0.01
  local N = int((`b1'-`b0')/`d')
  set obs `N'
  gen t = -400 + _n*`d'
  gen a = cos(t)
  gen b = cos(4*t)
  gen x = sin(t)*(exp(a)-2*b-(sin(t/12)*sin(t/12)*sin(t/12)*sin(t/12)*sin(t/12)))
  gen y = cos(t)*(exp(a)-2*b-(sin(t/12)*sin(t/12)*sin(t/12)*sin(t/12)*sin(t/12)))
       
*-胡须
  dropvars x2 y2 x3
  gen y2 =.
  gen x2 =. 
  local j = 1
  local end = (_pi/4+0.20)
  forvalues i = 0.20(0.01)`end'{
    qui replace x2 = `i' in `j++'
  }
  replace y2 = 3*sin(2*(x2-0.20))+2.5 
  gen x3 = -x2  //左半只

*-绘图
twoway  ///
  (line y x if y>0, lc(pink*0.55) lw(*2.5))  ///
  (line y x if y<0, lc(pink*0.70) lw(*2.5))  ///
  (line y2 x2     , lc(yellow*1.2) lw(*3.5)) ///
  (line y2 x3     , lc(yellow*1.2) lw(*3.5)) ///
  , yscale(off) xscale(off) legend(off)
*-------------------------------------------------  

G1_color_brand.do

*------- G1_color_brand.do ---------

*-绘制背景色带: 表示经济周期等
clear
set seed 13579
set obs 100
gen x = rnormal()

twoway ///
  (function y=0.4, range(-2 -1.7)          ///
            recast(area) color(green*0.3)) ///
  (function y=0.4, range(-1 -0.9)          ///
            recast(area) color(red*0.4))   ///
  (function y=0.4, range( 1  1.5)          ///
            recast(area) color(blue*0.2))  ///
  (kdensity x, lw(*3) lc(black*0.5)),      ///
            legend(off)