Chapter8——STATA绘图

Chapter8——STATA绘图

STATA在10.0版本更新后绘画功能有了全新的升级,主要是提供了窗口化的图形处理能力,使得绘画的门槛大大降低了,可以通过鼠标来完成画图,但是绘图依靠代码来实现依旧非常重要。

0. 绘图命令

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

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

image-20221118161622333

  1. 绘图的命令结构
Syntax1:
graph-command (plot-command, plot-options) (plot-command , plot-options) , graph-options 
Syntax:
graph-command plot-command,plot-options || plot-command , plot-options || , graph-options

graph-command定义图的类型,plot-command定义曲线类型,同一个图中如果有多条曲线可以用括号分开,也可以用||分开,曲线有其自身的选项,而整个图也有其选项。例如twowaygraph-command中的命令之一,一般是graph-twoway是二维作图的意思,而scatterplot-command中的命令之一,是散点意思。

  • 曲线选项和图选项,例如
twoway (scatter mpg weight), title("美国汽车") //图选项:标题,带标题的散点图
twoway (scatter mpg weight, msymbol(Oh)) //曲线选项,点的类型是空心圆
twoway (scatter mpg weight, msymbol(Oh)) , title("美国汽车") //同时用图选项(散点,标题)与曲线选项(空心圆)

image-20221118161652420

  1. 曲线类型

STATA 提供各种曲线类型,包括点(scatter)、线(line)、面(area),直方图(histogram)、 条形图(bar)、饼图(pie)、函数曲线(function)以及矩阵图(matrix)等。对时间序列数据有以 ts 开头的一系列特殊命令,如tsline。还有一类是对双变量的回归拟合图(lfit、qfit 、 lowess)等。可以用帮助命令查看。

  • 曲线可以分为点线面
sysuse uslifeexp.dta,clear   //U.S. life expectancy, 1900-1999
*点图
scatter le year
*线图
line le year
*面图
tw area le year
  • 几种基本的曲线类型

任务:使用美国 51 个州的人口(popk)、居住成本( propval100 )及普查分区 (division )等变量绘制各种图,数据文件为allstates。这些文件在网络上,首先要确保网络连接正常。

net from http://www.stata-press.com/data/vgsg2/
net install vgsg2,replace
vguse allstates,clear
//直方图:histogram
twoway histogram popk
//核估计图:kdensity
twoway kdensity popk
//条形图:bar和hbar
graph bar popk,over(division)   //竖的条形图
graph hbar popk,over(division)  //横的条形图
//箱型图:box和hbox
graph box popk,over(division)
graph hbox popk,over(division)
//饼图:pie
graph pie popk,over(region)    //region是分类
//矩阵图:matrix
graph matrix propval100 rent700 popden   //这个贼有意思
//点阵图:dot
graph dot popk,over(division)
  • 更多细分的曲线类型

任务:使用股价数据 spjanfeb2001 绘制各种图,其中 close 为收盘价,open 为开 盘价,tradeday 为交易日。

vguse spjanfeb2001, clear   //S&P 500
twoway dropline close tradeday
tw spike close tradeday         //针式图           
tw dot close tradeday         //点线图
tw connected close tradeday, sort     //点连线图
tw area close tradeday, sort       //和线图类似的,但是显示出线以下的面积
tw bar close yradeday, sort

twoway rarea high low tradeday, sort   //显示最高与最低价,并填充两者之间的面积 
tw rline high low tradeday, sort    //显示最高与最低价,但不填充其间
tw rconnected high low tradeday, sort    //显示最低与最高为两点,并连接起来 
tw rscatter high low tradeday, sort      //显示最低与最高为两点,不连接
tw rcap high low tradeday, sort        //两端用小横线标示
tw rspike high low tradeway, sort     //两端用点标示
tw rcapsym high low tradeday, sort

*对于时间序列数据,可以先设定时期,再简化命令
tsset tradeday     //X轴为时间,由tsset设定. 
twoway tsline close, sort     //tsline用于时间序列数据,收盘价 
tw tsrline high low, sort    //最高价与最低价
  1. 标题选项:title()

赋予整个图的标题:title()

赋予图的副标题:subtitle()

sysuse uslifeexp.dta,clear 
scatter le year, title(U.S. life expectancy) subtitle(1900-1999)

image-20221115165932680

  1. 坐标轴格式
  • 有坐标轴,有刻度可是(默认)
sysuse uslifeexp.dta,clear  
scatter le year
  • 无坐标轴格式

可以不标识y轴,命令为yscale(off);也可以不标识x轴xscale(off),还可以不显示图片中的暗格

scatter le year, yscale(off) xscale(off) plotregion(style(none))
  • 无坐标轴,有刻度标记格式
scatter le year, yscale(noline) xscale(noline)  plotregion(style(none))
  • 双坐标轴格式

同时可以绘制出男人的平均寿命和女人的平均寿命的一张折线图,共同使用同一个坐标轴的刻度

line le_male le_female year
tw(line le_male year)(line le_female year)  //和上面line的命令等价

采用双坐标轴的这些图

tw(line le_male year,yaxis(1))(line le_female year,yaxis(2))

image-20221115171137365

  • 坐标轴标题

纵坐标标题:ytitle()

横坐标标题:xtitle()

tw(line le_male year,yaxis(1) ytitle(年龄) xtitle(年份))
  • 坐标轴刻度

左纵坐标刻度:ytick()

下横坐标轴刻度:xtick()

line le year, xtick(1900(1)1999) ytick(40(4)80)
  • 坐标轴刻度值

左纵坐标刻度及刻度值:ylabel()

下横坐标刻度及刻度值:xlabel()

line le year, xlabel(1900 1930 1960 1999) ylabel(40(4)80)

更多的关于坐标轴刻度和标注的方法,可以通过查找来获得帮助:help axis label option

绘制一个图,纵横比例是3:4

scatter le year, ysize(3) xsize(4)
  1. 任意水平线和垂直线:yline()xline()

任务:在美国人均寿命的散点图中绘画出1900-1999年间的平均寿命

sysuse uslifeexp.dta,clear  
scatter le year, xline
  1. 图例:legend()
  • 自动插入图例
line le_male le_female year
  • 关闭自动插入的图例
line le_male le_female year, legend(off)
  • 定制图例内容legend(label())
*将图例中的英文装换成自己定制的中文
line le_male le_female year, legend( label(1 男人) label(2 女人))
*也可以提前先将变量识别而后自动生成
label var le_male 男人
label var le_female 女人
line le_male le_female year
  • 定制图例位置:legend(position())

图例的位置可以自由被自己通过位置命令放置再绘制的图的12个位置(对应的是时钟的小时刻度方位位置),如正右边为position(3),正上方是position(12)

line le_male le_female year, legend(position(12) label(1 男人) label(2 女人))

如果希望将图例放在图的中,命令为ring(0)

line le_male le_female year, legend(position(1) ring(0) label(1 男人) label(2 女人) col(1))
/*legend(position(1):图例放在一点钟的位置
ring(0):图例应该放置在图中
label(1 男人) label(2 女人):一号位放男人,二号位放女人
col(1):要求图例按上下一列来处理*/
  1. 脚注:note()

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

scatter le year, note(数据来源:美国国家统计局)

1. 几种常见的图

  1. 散点图与连线图
  • 制定图形中散点的表示符号:msymbol()
圆圈 菱形 正方形 三角形 +号 ×号 小点
大、实心 O D S T + X
大、空心 Oh Dh Sh Th
小、实心 o d s t x p
小、空心 oh dh sh th

任务1:绘制美国各州贫困发生率的散点图,用做人口数做权重

vguse allstates, clear
scatter pov statefips [fw=pop], msymbol(oh)
//制定散点颜色
scatter pov statefips [fw=pop], msymbol(o) mfcolor(green) mlcolor(red)

任务2:绘制出各州贫困发生率散点图,并标上州名

scatter pov statefips, mlabel(stateab)
twoway (scatter ownhome borninstate if stateab=="DC", mlabel(stateab)) (scatter ownhome borninstate), legend(off)
  • 指定图形中散点的连接方式:connect()
符号 说明
. 不连接
l 用直线连接
L 按 X 在数据库中的顺序用直线连接
m 用直线连接中位值
s 用三次平滑曲线连接
J 以阶梯式直线连接
|| 连接垂直方向上的两个点
II 在顶及底部添加短横线

对每种线条类型,可单独定义线条样式,如c(l)为实线相连,c(l[-])以虚线相连

符号 说明
l 实线
l[_] 长线段
l[-] 中等长线段
l[.] 短线段
l[#] 空格
sysuse sp500,clear
gen n=_n
twoway (line open close n in 1/50 , sort clpattern( -)), plotregion(margin(zero)) title("twoway line") xtitle("date") ytitle("price") legend(label(1 "open") label(2 "close") order(2 1) ring(0) position(8)) text(1300 25 "open")
  1. 条形图

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

vguse allstates, clear 
gsort nsw division 
list propval100 nsw division 
graph bar propval100, over(nsw) over(division)   //over是分组绘制,由于分类变量存在缺失值,所以制作的图很难看
*nofill命令将分类变量中缺失值忽略掉(在前面将其做为一组来处理)
graph bar propval100, over(nsw) over(division) nofill
*命令选项asyvars将使得第一个分组变量变换成相应的若干y变量
graph bar propval100, over(nsw) over(division) nofill asyvars
*加上图例进行美化
graph bar propval100, over(nsw) over(division) nofill asyvars ytitle(平均居住成本) ylabel(0(10)80) b1title(Region) legend(rows(1) position(1) ring(0))
*将分组变量表示倾斜45度,并且给每个条形图加上数据并规定数据格式
graph bar propval100, over(nsw)  over(division, label(angle(45))) nofill asyvars ytitle("平均居住成本") ylabel(0(10)80, angle(0)) b1title(Region) legend(rows(1) position(1) ring(0)) blabel(bar, format(%4.2f))

image-20221118223656231

例子:

clear 
input str5 age m f 
16-24 .9 .2 
25-44 .8 .8 
45-66 3.8 2.9 
67-79 8.2 5.4 
80+ 9.1 7.2 
end 
graph bar m f,over(age) title(不同年龄组发病率) b1title("Age") ytitle(发病率)
*解释一下b1title():因为

image-20221116170818006

  1. 直方图

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

clear 
set memory 64m 
input x1-x10 
142.3 156.6 142.7 145.7 138.2 141.6 142.5 130.5 134.5 148.8 
134.4 148.8 137.9 151.3 140.8 149.8 145.2 141.8 146.8 135.1 
150.3 133.1 142.7 143.9 151.1 144.0 145.4 146.2 143.3 156.3 
141.9 140.7 141.2 141.5 148.8 140.1 150.6 139.5 146.4 143.8 
143.5 139.2 144.7 139.3 141.9 147.8 140.5 138.9 134.7 147.3 
138.1 140.2 137.4 145.1 145.8 147.9 150.8 144.5 137.1 147.1 
142.9 134.9 143.6 142.3 125.9 132.7 152.9 147.9 141.8 141.4 
140.9 141.4 160.9 154.2 137.9 139.9 149.7 147.5 136.9 148.1 
134.7 138.5 138.9 137.7 138.5 139.6 143.5 142.9 129.4 142.5 
141.2 148.9 154.0 147.7 152.3 146.6 132.1 145.9 146.7 144.0 
135.5 144.4 143.4 137.4 143.6 150.0 143.3 146.5 149.0 142.1 
140.2 145.4 142.4 148.9 146.7 139.2 139.6 142.4 138.7 139.9 
end
stack x1-x10,into(y) clear
  1. 箱图

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

sysuse nlsw88,clear
graph hbox wage, over(grade) asyvar nooutsides legend(rows(2))
  1. 函数图

任务:绘制正态分布密度函数图。

tw (function y=normden(x), range(-3.5 3.5) droplines(-1.96 -1 0 1 1.96)), title(tw function) plotregion(margin(zero)) yscale(off) ylabel(,nogrid) xlabel(-3 -1.96 -1 0 1 1.96 3,format(%4.2f)) xtitle("Standard deviations from mean")

2. 同时做多个图by(varname)

通常我们可以绘制两个图(散点图和拟合图)来描述和反映两个变量之间的关系

vguse allstates,clear    //改例子中每次命令只可以在画布绘制一个图
tw(scatter propval100 popden)(lfit propval100 popden)(qfit propval100 popden)
tw(scatter propval100 popden)(mspline propval100 popden)(fpfit propval100 popden)(mband propval100 popden)(lowess propval100 popden)
tw(lfitci propval100 popden)(scatter propval100 popden)

by(varname)功能适用于matrix 和 star 以外所有图形,该选项使graph 按照指定的分组变量分别绘制图形。一般情况下,对 bar 和 box,按指定变量分组的多个图共用一套坐标轴,对其它图形,将分别绘制独立的图形并列陈列。Rescaleby()合用,要求图形使用不同的刻度。默认为所有图形使用相同的刻度。

任务:绘制出不同drug分类后的样本个体的学习时间(studytime)和年龄(age)之间的关系图,散点图和条形图、拟合图

sysuse cancer.dta
twoway (bar studytime age,yaxis(2)) (scatter _t age,yaxis(1)) (lfit _t age,yaxis(1)), by(drug) legend(row(1))

image-20221118160008216

任务:绘制出U.S. life expectancy, 1900-1999的黑人男性和黑人女性的寿命差额,使用rcapsym命令实现

sysuse uslifeexp.dta
twoway rcapsym le_bmale le_bfemale year

image-20221118161357458

3. 模板及图文件处理

  1. 图模板

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

sysuse auto,clear
set scheme s2color    //需要提前定义图模板主题
scatter mpg weight
line mpg weight,scheme(s1rcolor)  //如果需要更换图模板可以在graph command后面更改

image-20221118163240350

图的模板设定分为几种:s1s2sjeconomist

模板名 前景色 背景色 描述用途
s2color color white factory setting(默认)
s2mono monochrome (单色) white s2color in monochrome
s2gcolor color white used in the Stata manuals
s2manual monochrome white s2gcolor in monochrome
s2gmanual monochrome white previously used in the [G] manual
s1rcolor color black color on black
s1color color white color on white
s1mono monochrome white gray on white
s1manual monochrome white s1mono, but smaller
sj monochrome white Stata Journal
economist color white The Economist magazine
line mpg weight,scheme(economist)

image-20221118153006123

  1. 保存图
graph save "c:\ex7\rf.gph" 
graph save "c:\ex7\rf.gph", asis replace

asis将图存为不可再行改动的图,如果不用该选项,则图被存为可修改的图,可以改变其风格和图的大小,在同一文件目录下如果有同名文件,replace选项将其覆盖。

  1. 打开已保存的图
graph use "c:\ex7\rf.gph" [, scheme(s1)]
  1. 显示图
graph display [name] [, scale(1.2) ysize(3) xsize(5) scheme(s1)]
/*ysize(#)                 change height of graph (in inches)
xsize(#)                   change width of graph (in inches)
margins(marginstyle)       change outer margins
scale(#)                   resize text, markers, and line widths
scheme(schemename)         change overall look*/

4. SRTAT官方图例

STATA提供了若干图形示例及代码,这些图例见网址