STATA10.0 版本的绘图功能有了新的提升,主要是提供了窗口化的图形处理能力,使得绘图可以像在 EXCEL 中一样,用鼠标完成操作。但是这些操作背后的命令基础仍然是本讲即将介绍的内容。
注:本讲中许多例子来自于“a visual guide to stata graphics ”一书。

1 绘图命令

一个完整的图应包括以下要素:曲线(点/线/面)、标题与副标题、图例、脚注、插文、坐标轴。
image.png

  1. sysuse auto , clear
  2. twoway (scatter mpg weight if foreign==0) ///
  3. (scatter mpg weight if foreign==1 , msymbol(Sh)) /*曲线选项,点的类型*/ ///
  4. , ///
  5. title(标题: 行驶里程与车重关系) /*图选项:标题*/ ///
  6. subtitle(副标题: 11574年美国的国产和进口汽车) ///
  7. ytitle(纵坐标标题:里程) ///
  8. xtitle(横坐标标题:重量) ///
  9. note(注释: 数据来自于美国汽车协会) ///
  10. text(35 3400 "曲线类型:散点图") ///
  11. legend(title(图例) label(1 国产车) label(2 进口车)) ///
  12. scheme(s1rcolor)

注意:要放到do-file编辑器中,直接命令窗口无法输入。

1 命令结构

graph-command (plot-command, plot-options) (plot-command , plot-options) , graph-options
或者
graph-command plot-command,plot-options || plot-command , plot-options || , graph-options
graph-command定义图的类型,plot-command 定义曲线类型,同一个图中如果有多条曲线可以用括号分开,也可以用“||”分开,曲线有其自身的选项,而整个图也有其选项。例如twoway为graph-command中的命令之一,而scatter为plot-command中的命令之一。
曲线选项和图选项,例如

  1. twoway (scatter mpg weight) , title("美国汽车") //图选项:标题
  2. twoway (scatter mpg weight , msymbol(Oh)) //曲线选项,点的类型
  3. twoway (scatter mpg weight , msymbol(Oh)) , title("美国汽车") //同时用图与曲线选项
  4. 命令可以简写,如下列命令等价
  5. sysuse auto, clear
  6. graph twoway scatter mpg weight
  7. twoway scatter mpg weight //graph可以省略
  8. scatter mpg weight //twoway graph都可以省略
  9. gr tw sc mpg weight
  10. tw sc mpg weight
  11. sc mpg weight

2 曲线类型

STATA 提供各种曲线类型,包括点(scatter)、线(line)、面(area),直方图(histogram)、条形图(bar)、饼图(pie)、函数曲线(function)以及矩阵图(matrix)等。对时间序列数据有以 ts 开头的一系列特殊命令,如 tsline。还有一类是对双变量的回归拟合图(lfit、qfit 、lowess)等。可以用帮助命令查看。
help graph
help towway
几种基本的曲线类型
任务 :使用美国 51 个州的人口 popk、居住成本 propval100 及普查分区 division 等变量绘制各种图,数据文件为 allstates。这些文件在网络上,首先要确保网络连接正常。

  1. vguse allstates ,clear
  2. 直方图:histogram
  3. twoway histogram popk
  4. 核估计图: kdensity
  5. twoway kdensity popk
  6. 条形图:bar hbar
  7. graph bar popk, over(division)
  8. graph hbar popk, over(division)
  9. 箱形图 box hbox
  10. graph hbox popk, over(division)
  11. graph box popk, over(division)
  12. 饼图:pie
  13. graph pie popk, over(region)
  14. 矩阵图 matrix
  15. graph matrix propval100 rent700 popden
  16. 点阵图 dot
  17. graph dot popk, over(division)

更多细分的曲线类型
任务 :使用股价数据 spjanfeb2001 绘制各种图,其中 close 为收盘价,open 为开盘价,tradeday 为交易日。

  1. vguse spjanfeb2001, clear
  2. twoway dropline close tradeday //
  3. tw spike close tradeday //针式图
  4. tw dot close tradeday //点线图
  5. tw connected close tradeday, sort //点连线图
  6. tw area close tradeday, sort //和线图类似,显示线以下的面积
  7. tw bar close tradeday,sort /*对每个X绘出相应Y的条图,而graph bar是针对分类变量X的*/
  8. twoway rarea high low tradeday, sort //显示最高与最低价,并填充两者之间的面积
  9. tw rline high low tradeday, sort //显示最高与最低价,但不填充其间
  10. tw rconnected high low tradeday, sort //显示最低与最高为两点,并连接起来
  11. tw rscatter high low tradeday, sort //显示最低与最高为两点,不连接
  12. tw rcap high low tradeday, sort //两端用小横线标示
  13. tw rspike high low tradeday, sort //两端用点标示
  14. tw rcapsym high low tradeday, sort
  15. //对时间序列数据,可以先设定时期,简化命令
  16. tsset tradeday //X轴为时间,由tsset设定.
  17. twoway tsline close, sort //tsline用于时间序列数据,收盘价
  18. tw tsrline high low, sort //最高价与最低价

3 标题项: title()

整个图标题:title()
图的副标题:subtitle()
为图加上标题和副标题

  1. use rfsz , clear
  2. scatter rainfall year ///
  3. , ///
  4. title(某县年降雨量图) ///
  5. subtitle(1982-2001)

image.png

4 坐标轴格式

双坐标轴格式
同时绘出降雨量和单产的折线图时,单产变量yield,

  1. line rainfall yield year //该命令等价于
  2. tw (line rainfall year ///
  3. (line yield year)

image.png
我们发现单产几乎为一条直线,实际上单产的波动是很大的,之所以像一条直线,是因为降雨量(mm)和单产(T/ha.)的单位不一致导致的。如果我们用双 Y 轴,将单产的纵轴用右纵轴表示。
image.png

  1. twoway (line rainfall year, yaxis(1)) ///
  2. (line yield year, yaxis(2))

坐标轴刻度
左纵坐标刻度:ytick()
下横坐标刻度:xtick()

  1. line rainfall year ///
  2. , ///
  3. xtick(1982(1)2000) ///
  4. ytick(600(100)1400)

坐标轴刻度值
左纵坐标刻度及刻度值:ylabel()
下横坐标刻度及刻度值:xlabel()

  1. line rainfall year ///
  2. , ///
  3. xlabel(1982 1990 1995 2000) ///
  4. ylabel(600(100)1400)

更多的刻度及标注方法,请查找帮助
help axis label option
做一个图,纵横比例为 3:4

  1. scatter mpg weight , ysize(3) xsize(4)

5 任意水平线与垂直线:yline()与 xline()

任务 9.4:在降雨量散点图中画出平均雨量线

  1. scatter rainfall year ///
  2. , ///
  3. xlabel(1982 1990 1995 2000) ///
  4. ylabel(600(100)1400)

6 图例 legend()

定制图例内容 legend(label())
将图例中的英文改为中文

  1. line jan feb year ///
  2. , ///
  3. legend(label(1 一月) label(2 二月))
  4. 也可以先将变量标识而后自动生成
  5. label var jan 一月
  6. label var feb 二月
  7. line jan feb year

关闭图例
legend(off)
定制图例位置 legend(position())
可将图例放在图的 12 个位置(对应于时钟的小时刻度)
如正右边为 position(3) 右正方为 position(5),正上方为

  1. position(12)。
  2. line jan feb year ///
  3. , ///
  4. legend(pos(12) label(1 一月) label(2 二月))
  5. 有时我们希望将图例放在图中,命令为 ring(0)
  6. line jan feb year ///
  7. , ///
  8. legend(pos(1) ///
  9. ring(0) ///
  10. label(1 一月) ///
  11. label(2 二月) ///
  12. col(1)) //col(1)要求图例按一列处理

image.png

7 脚注:note()

脚注主要用于标明数据的来源或者有关对整个图的
说明,如

  1. scatter rain year
  2. ,
  3. note(数据来源:国家气象局)

image.png

2 几种常用的图

1 散点图与连线图

指定图形中散点的表示符号:msymbol()
image.png
任务 ,绘制美国各州贫困发生率的散点图,用做人口数做权重。

  1. vguse allstates, clear
  2. scatter pov statefips [fw=pop], msymbol(oh)
  3. 指定散点的颜色
  4. scatter pov statefips [fw=pop], msymbol(o)
  5. mfcolor(green) mlcolor(red)
  6. 任务:绘制出各州贫困发生率散点图,并标上州名
  7. scatter pov statefips, mlabel(stateab)

image.png

  1. sysuse sp500,clear
  2. gen n=_n
  3. twoway ///
  4. (line open close n in 1/50 , sort clpattern( -))
  5. ///
  6. , ///
  7. plotregion(margin(zero)) ///
  8. title("twoway line") ///
  9. xtitle("date") ///
  10. ytitle("price") ///
  11. legend(label(1 "open") label(2 "close")
  12. order(2 1) ///
  13. ring(0) pos(8)) ///
  14. text(1300 25 "open")

image.png

2 条形图

任务 :以下是美国三大区域(nsw)9 个普查区域(division)住房平均成本(propval100),括号中为相应的变量名称,请使用数据 allstates.dta 绘出如下的条形图
image.png
最原始的命令

  1. vguse allstates, clear
  2. gsort nsw division
  3. list propval100 nsw division

说明:这里vguse不能使用,需要执行下面的安装:
在stata官网上有这本书的数据文件,一种方法是直接输入命令
net from http://www.stata-press.com/data/vgsg2/
net install vgsg2,replace
另一种方法是直接下载安装包和数据,地址是
http://www.stata-press.com/data/vgsg.html

以上命令用于查看数据,从数据中可以看出,同一个区域中有若干次区域,次区域中有若干被子调查的住房成本,绘图时采用的为每个次区域的平均成本。
graph bar propval100, over(nsw) over(division)
image.png
上面的图中,各个条形图之间间距较大,仍然不够美观。而下面的命令选项 asyvars 将使得第一个分组变量变换成相应的若干 y 变量。如 ynorth ysouth ywest
graph bar propval100, over(nsw) over(division) nofill asyvars
image.png
下面的命令美化图例

  1. graph bar propval100, over(nsw) over(division) nofill asyvars ///
  2. ytitle(平均居住成本) ylabel(0(10)80) b1title(Region) ///
  3. legend(rows(1) position(1) ring(0))

image.png

  1. graph bar propval100, over(nsw) ///
  2. over(division, label(angle(45))) /将分组变量标识倾斜45度/ ///
  3. nofill asyvars ytitle("平均居住成本") ylabel(0(10)80, angle(0)) b1title(Region) ///
  4. legend(rows(1) position(1) ring(0)) ///
  5. blabel(bar, format(%4.2f)) //给每个条形图加上数据并规定数据格式

image.png

  1. clear
  2. input str5 age m f
  3. 16-24 .9 .2
  4. 25-44 .8 .8
  5. 45-66 3.8 2.9
  6. 67-79 8.2 5.4
  7. 80+ 9.1 7.2
  8. end //以上程序录入数据
  9. graph bar m f /// //绘条形图命令 graph bar,
  10. , ///
  11. over(age) /// //按年龄绘制
  12. title(不同年龄组发病率) ///
  13. b1title("Age") /// //底部标题
  14. ytitle(发病率) ///
  15. legend( label(1 "Males") label(2 "Females") ) ///
  16. bar(2 , bfcolor(gs3)) //第二类条形图的色彩方案

image.png
3 直方图
任务 绘制身高直方图,录入如下数据,将数据分为 10 组,统计落入每组的频数,然后绘制直方图。

  1. clear
  2. set memory 64m
  3. input x1-x10
  4. 142.3 156.6 142.7 145.7 138.2 141.6 142.5 130.5 134.5 148.8
  5. 134.4 148.8 137.9 151.3 140.8 149.8 145.2 141.8 146.8 135.1
  6. 150.3 133.1 142.7 143.9 151.1 144.0 145.4 146.2 143.3 156.3
  7. 141.9 140.7 141.2 141.5 148.8 140.1 150.6 139.5 146.4 143.8
  8. 143.5 139.2 144.7 139.3 141.9 147.8 140.5 138.9 134.7 147.3
  9. 138.1 140.2 137.4 145.1 145.8 147.9 150.8 144.5 137.1 147.1
  10. 142.9 134.9 143.6 142.3 125.9 132.7 152.9 147.9 141.8 141.4
  11. 140.9 141.4 160.9 154.2 137.9 139.9 149.7 147.5 136.9 148.1
  12. 134.7 138.5 138.9 137.7 138.5 139.6 143.5 142.9 129.4 142.5
  13. 141.2 148.9 154.0 147.7 152.3 146.6 132.1 145.9 146.7 144.0
  14. 135.5 144.4 143.4 137.4 143.6 150.0 143.3 146.5 149.0 142.1
  15. 140.2 145.4 142.4 148.9 146.7 139.2 139.6 142.4 138.7 139.9
  16. end
  17. stack x1-x10,into(y) clear
  18. ren _sta n
  19. forvalues i=1/10 {
  20. replace n=i' if y>124+i'4&y<124+4(`i'+1)
  21. }
  22. hist y,norm

image.png

  1. sysuse auto, clear
  2. ladder mpg
  3. gladder mpg

image.png

4 箱图

任务:绘制上学年级与工资收入的箱图,箱图将最低、最高、均值以及 95%分位数在同一个图中表现出来。

  1. sysuse nlsw, clear
  2. graph hbox wage, over(grade) asyvar nooutsides legend(rows(2))

image.png

5 函数图

  1. twoway ///
  2. (function y=normden(x) , range(-3.5 3.5) ///
  3. droplines(-1.96 -1 0 1 1.96)) ///
  4. , ///
  5. title(twoway function) ///
  6. plotregion(margin(zero)) ///
  7. yscale(off) ylabel(, nogrid) ///
  8. xlabel(-3 -1.96 -1 0 1 1.96 3 , format(%4.2f)) ///
  9. xtitle("Standard deviations from mean")

image.png
error in expression: normden(x)

3 同时做多个图 by(varname)

最常用于描述两个变量之间关系的图形为散点图与拟合图。
vguse allstates ,clear
twoway (scatter propval100 popden) (lfit propval100 popden)(qfit propval100 popden)
twoway (scatter propval100 popden) (mspline propval100 popden) ///
(fpfit propval100 popden) (mband propval100 popden)(lowess propval100 popden)
twoway (lfitci propval100 popden) (scatter propval100 popden)
by(varname)功能适用于 matrix 和 star 以外所有图形,该选项使 graph 按照指定的分组变量分别绘制图形。一般情况下,对 bar 和 box,按指定变量分组的多个图共用一套坐标轴,
对其它图形,将分别绘制独立的图形并列陈列。Rescale 与 by()合用,要求图形使用不同的
刻度。默认为所有图形使用相同的刻度。
任务 :利用 rf.dta 中的水稻单产(yield)和总降雨量(rainfall)以及年份,绘制出单产的散点图和拟合图,同时将总降雨量作为条形图列在另一个坐标轴上,最后,要求同时给出四个县的相应图形。

  1. use rf, clear
  2. twoway (bar rainfall year, yaxis(2)) ///
  3. (scatter yield year, yaxis(1)) ///
  4. (lfit yield year, yaxis(1)) , ///
  5. by(id) legend(row(1))

image.png

4 模板及图文件处理

图模板
图的各种设定可以组合成模板,当选定模板后,线性、颜色等各种参数设定相应固定,见下述示例。

  1. sysuse auto, clear
  2. set scheme s2color //see help scheme_s2color
  3. sc mpg weight
  4. set scheme s2mono
  5. sc mpg weight
  6. set scheme s2manual
  7. sc mpg weight
  8. set scheme s1color
  9. sc mpg weight
  10. set scheme s1mono
  11. sc mpg weight
  12. set scheme s1rcolor
  13. sc mpg weight
  14. set scheme s1manual
  15. sc mpg weight
  16. set scheme sj
  17. sc mpg weight
  18. set scheme economist
  19. sc mpg weight

保存图

  1. graph save "c:\ex7\rf.gph"
  2. graph save "c:\ex7\rf.gph" , asis replace
  3. asis将图存为不可再行改动的图,如果不用该选项,则图被存为可修改的图,可以改变其风格和图的大小,在同一文件目录下如果有同名文件,replace选项将其覆盖。

打开已保存的图

  1. graph use "c:\ex7\rf.gph" [, scheme(s1)]

显示图

  1. graph display [, scale(1.2) ysize(3) xsize(5) scheme(s1)]