1、40 第五章 Stata 的绘图功能 第五章 Stata 的绘图功能 统计作图是 Stata 又一强大的功能 。 Stata 的作图命令简洁 , 图形精美 , 应用者可随心所欲 , 并可充分发挥想象力 。 Stata 的作图命令 graph 主要提供如下八种基本图形的制作 : 直方图 (histogram),条形图 (bar), 百分条图 (oneway), 百分圆图 (pie), 散点图 (twoway), 散点图矩阵 (matrix), 星形图 (star),分位数图 。 在有些非绘图命令中 , 也提供了专门绘制某种图形的功能 , 如在生存分析中 , 提供了绘制生存曲线图等 。 5 . 1
2、 几种常见的统计图 首先展示几种 Stata 绘制的常见的统计图 。 读者可以先有一个直观印象 。 图 5.1 直方图 图 5.2 直条图 现代医学统计方法与 Stata 应用 41 图 5.3 散点图 图 5.4 单变量散点图与箱式图 图 5.5 百分圆图 42 第五章 Stata 的绘图功能 图 5.6 Box - Whisker 的箱式图 图 5.7 星状图 图 5.8 Kaplan - Meier 生存曲线图 现代医学统计方法与 Stata 应用 43 5 . 2 几种常见统计图的绘制 这里重 点讲述直方图 (histogram), 条图 (bar)和 , 圆饼图 (pie), 一维
3、、 二维散点图和线图 (twoway)、箱式图 (box)的制作 。 其它统计图安排在相应的章节结合实例讲述 。 需要时可用 命 令 help graph 了解详细内容 。 一 、 直方图的制作 直方图主要用于表示数值变量资料的分布 。 常以横轴表示被观察对象 , 纵轴表示频数或频率 。绘制直方图的命令为 : graph 变量名 , 选择项 这里的选择项有 : bin(#) /* 将数据分为几组 , #为数字 , 缺省值为 5。 freq /* 指定以频数为纵轴画 图 , 缺省时为以频率为纵轴 。 normal(#,#) /* 在直方图上加上正态分布曲线 , N(#,#), 前一个 #为均数
4、, 后一个为方差 ,缺省值为原资料的均数与方差 。 density(#) /* 与 normal 合用 , 表示在画正态曲线时的光滑程度 。 缺省值为 100。 shading(s) /* 定义直方图的阴影 。 范围在 1 4, 缺省值为 3。 axis/ noaxis /* 画 /不画坐标轴 , 缺省值为画坐标轴 。 border/noborder /* 画 /不画边框 , 缺省值为不画 。 xlable/ylable/tlable/rlable(#,#) /* lable 是指在坐标轴上画上坐标点及相应的数据 , xlable,ylable, tlable, rlable分别表示 x 轴
5、、 y 轴 、 上边的轴 、 右边的轴 。 下同 。 缺省时只画 x 和 y 轴的最小值和最大值 。 xtick/ytick/ttick/rtick(#,#) /* tick 是指在相应的坐标轴上画上坐标点 , 但不画数据 。 xline/yline/tline/rline(#,#) /* line 表示以相应的坐标画线 。 xscale/yscale(#,#) /* 分别指定 x 轴和 y 轴的最小和最大坐标点 。 title(“字符串 “ ) /* 给图加上总标题 。 Stata 不接受中文字符 。 b1/l1/t1/rl(“字符串 “) /* 给各坐标轴加上标题 , b 表示底轴 (x
6、轴 ),l 表示左轴 (y 轴 ), t 表示上边 的轴 , r 表示右边的轴 。 下同 。 b2/l2/t2/r2(“字符串 “) /* 给各坐标轴加上副标题 。 gap(#) /* 调整标题与坐标轴的间距 。 范围为 1 8, 缺省值为 8。 saving(文件名 ,replace) /* 将图形存盘 , replace 表示替换原有图形文件 。 例 5.1 对例 4.1 资料绘制直方图 。 最简单的命令是 : . use d: mydata ex4 - 1 . gra x gra 是 graph 的简写形式 。 因为无选择项 , 所以 Stata 给出最简单的图形 , 即分 5 组 ,
7、以频率表示 , 给出了 x 轴的最小 、 最大值 , y 轴标有 0( 直方图必须从 0 开始 ) , 和 5 组中的最大频率 ; 并各标有另外 3 个等间隔的坐标点 。 见图 5.9 。 ( 为方便印刷 , 图中阴影部分在用 WORD 处理时去掉了 ) 。 44 第五章 Stata 的绘图功能 图 5.9 例 4.1 资料的直方图 适当选用选择项可以使图形更精细 。 如 : . gra x, bin(9) freq xlab(108,111,114,117,120,123,126,129,132,135) ylab(0,5,10, 15,20,25,30,35) norm gap(4) b2
8、(“height (CM)“) 图 5.10 例 4.1 资料的直方图及正态分布曲线 这里 , Stata 按要求将资料分为 9 组 (bin(9); 用频数作 为纵坐标 (freq); 画上了正态曲线 (norm),其均数和标准差直接取 x 的均数和标准差 , 分别为 119.7273 和 22.4802; 并在纵坐标和横坐标上分别加上等间隔的刻度 (xlab,ylab); 将坐标轴的标题与图形间的距离缩小 (gap), 并定义横坐标为 :“ height (CM)” 。 这样画出的图形就较精确 、 美观 。 Stata 允许在图形的每一边 (上 , 下 , 左 , 右 )最多各加两条说明或
9、标题 , 相应的选择项分别是 t1,t2, b1, b2, l1, l2 及 r1 和 r2, 然后紧跟括号 , 并在括号内写上相应的说明或标题名 , 若说明中 本身就有括号 , 则需用引号将说明语句引起来 。 现代医学统计方法与 Stata 应用 45 二 、 条图的制作 用等宽直条的长短来表示相互独立的各指标的取值大小 。 有单式条图和复式条图 。 绘制条图的命令格式如下 : graph 变量 1 变量 2., bar 选择项 这里的选择项有 : means /* 用均数而不是用总数来表示该指标的值 。 缺省值为总数 stack /* 将各指标的堆积起来 , 而不是并排 。 缺省值为并排
10、accumulate /* 将各指标的值逐次累加 totle /* 增加各指标的总和直条 shading(s) /* 定义直方 图的阴影 。 范围在 1 4, 缺省值为 3 axis/ noaxis /* 画 /不画坐标轴 , 缺省值为画坐标轴 noalt /* 将横坐标的刻度错开排放 。 缺省值为放在一排 border/noborder /* 同直条图 其它一些选择项的意义与直方图是一样的 , 有 : xlable/ylable/tlable/rlable(#,.,#), ytick(#,.,#), yline(#,.,#), yscale(#,#) , title(“字符串 “), b1/
11、l1/t1/rl(“字符串 “), b2/l2/t2/r2(“字符串 “), gap(#), saving(文件名 ,replace)。 这里要注意的是 , tick, line, scale 只对 y 轴有效 , 其它轴无效 。 例 5.2 某地二年三种疾病的死亡率如表 5 . 1 , 请绘制复式条图 ( 每种疾病为一组 , 每组有两个直条 , 分别代表两个年度 , 条图的纵轴必须从 0 开始 ) 。 表 5. 1 某地二年三种疾病的死亡率 (1/10 万 ) 死因 1952 年 1972 年 肺结核 163.2 27.4 心脏病 72.5 83.6 恶性肿瘤 57.2 178.2 我们面临
12、的首要问题是将表 5 . 1 的数据转化为 Stata 制作条形图所要求的数据格式 。 根据要求 ,我们需引入死因变量 D 和年度死亡率变量 P52 和 P72 , 并定义如下 : 1 肺结核 D= 2 心脏病 3 恶性肿瘤 P52=1952 年的死亡率 P72=1972 年的死亡率 数据输入过程 : . drop _ all . input d p52 p72 d p52 p72 1. 1 163.2 27.4 2. 2 72.5 83.6 3. 3 57.2 178.2 46 第五章 Stata 的绘图功能 4. end . save d: mydata ex 5 - 1 file ex
13、5 - 1 .dta saved 数据已以文件名 ex 5 - 1 .dta 存入磁盘 。 现对数据库结构进行描述 : . des Contains data from ex 5 - 1 .dta Obs: 3 (max= 4719 ) Vars: 3 (max= 99) Width: 12 (max= 200) 1. d float %9.0g 2. p52 float %9.0g 3. p72 float %9.0g Sorted by: 为使图形更具有可读性 , 还可对变量及其取值给予必要的说明 : . lab var d “Reasons of die“ . lab var p52 “
14、Rate of die in 1952“ . lab var p72 “Rate of die in 1972“ . lab define d 1 “ tuberculosis “ 2 “ heart disease “ 3 “ tumour “ . des Contains data from ex 5 - 1 .dta Obs: 3 (max= 4719 ) Vars: 3 (max= 99) Width: 12 (max= 200) 1. d float %9.0g Reasons of die 2. p52 float %9.0g Rate of die in 1952 3. p72
15、float %9.0g Rate of die in 1972 Sor ted by: . save d: mydata ex 5 - 1 , replace file ex 5 - 1 .dta saved 有了以上的准备 , Stata 就可以为我们作出精美的条形图了 : . gra p52 p72 , bar by(d) sh(31) l1(“Rate of die(1/100000)“) b1(Comparison of rate of die ) 指令 sh(31)是 shading(31)的缩写 , 3 和 1 分别指示 1952 年和 1972 年的条形图的明暗度 ,3 与 1之
16、间无空格及其它符号 。 “ gra” 后跟了几个变量 , sh的括号内就应有几个数字与之对应 。 注 :为便于排版 , 图 5.11 中的阴影在用 WORD 编辑时作了处理 。 现代医学统计方法与 Stata 应用 47 图 5.11 例 5.2 资料的直条图 ( 直条并排 ) 增加不同的选择项 , 会出现不同的效果 。 . gra p52 p72 , bar by(d) ylab stack total alt l1(“Rate of Die (1/100000)“) gap(4) 图 5.12 例 5.2 资料的直条图 ( 直条堆积 ) 这里 , 选择项 stack 要求 Stata 将各
17、指标叠起排放 ; 选择项 total 是要求 Stata 给出三者的总和 ; 选择项 alt 要求横坐标的 4 个标目错开排列 ; 选择项 gap(4) 要求缩小坐标的标题与图的间隔 。 三 、 圆饼图的制作 圆饼图 (pie) 主要用于表示全体中各部分的比重 。 绘制圆饼图命令同直条图 , 只是将 bar 换成pie 就行了 。 graph 变量 1 变量 2 . , pie 选择项 48 第五章 Stata 的绘图功能 选择项比直条图少 , 有 : shading(#,.#), by(变量 ), accumulate, totle, 以及标题等 : title(“字符串 “),t|l|b|
18、r1|2title(“字符串 “), saving(文件名 ,replace)。 其意义同上 。 例 5.3 将例 5.2 资料作圆饼图 : . gra p52 p72 , pie by(d) sh(31) total 图 5.13 例 5.2 资料的圆饼图 选择项 total 要求 Stata 给出合计的圆饼图 。 四 、 二维散点图与线图的制作 散点图 (scatter g raph) 用于反映两个或多个变量间的关系 , 将各散点用连线连接起来 , 就是线图 (line graph) , 主要用于反映事物的变 化 趋势等 。 用于散点图和线图绘制的命令为 : graph y变量 y变量 2
19、. x变量 , 选择项 绘制散点图和线条的两个主要的选择项为 : /* 连接各散点的方式 , c 表示 : connect(c.c) 或简写为 c(c.c) . l L m s J | II 不连接 (缺省值 ) 用直线连接 沿 x 方向只向前不向后直线连接 计算中位数并用直线连接 用三次平滑曲线连接 以阶梯式直线条连接 用直线连接在同一纵向上的两点 同 |, 只是线的顶部和底部有一个短横 /* 表示各散点的图形 , s 表示 : Symbol(s.s) 或简写为 s(s.s) O S T o d 大圆圈 ( 缺省值 ) 大方块 大三角形 小圆圈 小菱形 现代医学统计方法与 Stata 应用
20、49 p . i varname _n 小加号 小点 无符号 用变量的取值代码表示 用点的记录号表示 其它选择项还有 : axis/ noaxis, border/noborder, twoway box, sort xlable/ylable/tlable/rlable(#,.,#), xtick/ytick/ttick/rtick(#,.,#) xline/yline/tline/rline(#,.,#), xscale/yscale(#,#) title(“字符串 “), b1/l1/t1/rl(“字符串 “), b2/l2/t2/r2(“字符串 “) gap(#), saving(文件
21、名 ,replace) 意义同前 。 例 5 .4 某地三岁儿童 10 人的体重与体表面积测量值如下 , 试作散点图 , 描述两者间的关系 。 体 重 x,(kg) 11 12.3 12 11.8 13.1 14.4 13.7 14.9 15.2 16 体表面积 y,(10 3 cm) 5.283 5.292 5.358 5.299 5.602 5.83 6.014 6.102 6.075 6.411 . gra y x , s(o) xlab ylab 图 5.14 10 名三岁儿童的体重与体表面积散点图 这里有两个变量 , 前者为纵轴 , 后 者为横轴 。 s(o)表示散点用圆圈表示 。
22、gra是 graph 的缩写 。 下面 4 个命令都是画线图的 , 但不同的选择 , 所作图形之效果就不同 。 . gra y x, xlab ylab c(l) s(d) b2(“(a)“) gap(4) saving(d: mydata ex54a) . gra y x, xlab ylab c(l) s(p) b2(“(b)“) sort gap(4) saving(d: mydata ex54b) . gra y x, xlab ylab c(J) s(. ) b2(“(c)“) sort gap(4) saving(d: mydata ex54c) . gra y x, xlab y
23、lab c(L) s(T) b2(“(d)“) gap(4) saving(d: mydata ex54d) 50 第五章 Stata 的绘图功能 图 5.15 例 5.4 资料的四种线图 这里给出的 4 个图各有特点 , 分别说明了几个选项的作用 : symbol(s): (a)、 (b)、 (c)、 (d)4 个图中 , 分别用了 s(d)、 s(p)、 s(.)、 s(T), 分别表示菱形 、 加号 、 小点号和三角形 。 connect(c): (a)和 (b)、 (c)、 (d)4 个图中 , 分别用了 c(l)、 c(J)、 c(L), 分别表示直线 、 阶梯式直线 、 不向后直线
24、三种连接方式 。 sort: 图 (a)和图 (b)中 , 都是用直线相连的 , 但连线的顺序不同 , 前者无 sort 选择项 , 而后者选用了 sort。 故前者是按数据的顺序连接的 , 而后者是按横轴从小到大的顺序连接的 。 这就 是 sort 的作用 。 用 s(), c()及 sort 的不同组合 , 可以得到不同的效果 , 读者不妨一试 。 一个图中可画多条趋势线 , 作图命令不变 , 所有变量列在关键 词 graph 后 , 最后一个变量是横轴变量 。 变量的顺序须与 c(cc)及 s(ss)中的连线及符号相对应 。 下面通过一个实例来看一看散点图和线图的巧妙应用 。 例 5.5
25、 两组病人某指标的动态变化 (均数 标准差 )结果如下 , 要求在同一个图中画两条趋势曲线 , 并标上标准差 。 时间 (h) 0 2 4 6 8 10 12 实验组 11.81.4 18.52.3 253.4 27.32.9 30.43.2 31.73.4 32.53.5 对照组 10.61.5 16.32 18.92.1 22.61.9 22.81.8 22.62.3 22.92.2 先输入资料 : . input time y1 sd1 y2 sd2 1. 0 11.8 1.4 10.6 1.5 2. 2 18.5 2.3 16.3 2 3. 4 25 3.4 18.9 2.1 4. 6
26、 27.3 2.9 22.6 1.9 现代医学统计方法与 Stata 应用 51 5. 8 30.4 3.2 22.8 1.8 6. 10 31.7 3.4 22.6 2.3 7. 12 32.5 3.5 22.9 2.2 8. end 先画一组 , 以 说明如何在趋势线图上加上标准差 , 以实验组为例 。 资料要作一些整理 。 首先要产生两个新变量 , 以表示标准差的上下两点的位置 。 . gen z1=y1+sd1 . gen z2=y1 - sd1 则 z1,z2 分别表示标准差的上下两点的位置 。 用下列命令可得到所要作的图 。 . gra y1 z1 z2 t , s(T) c(lI
27、I) xlab(0,2,4,6,8,10,12,14) ylab 图 5.16 例 5.5 资料实验组的趋势线图 这里 , 有三组散点 , 即 (y1,t),(z1,t),(z2,t) , 各 7 各点 。 s(T) 表示第一组散点用三角表示 ,另两组用点表示 。 其中 , 第一组要用直线相连 , 以表示 y1 随时间的变化趋势 , 而另两组的点不要连接 。 但要将对应的 y1+sd1 和 y1 - sd1 连起来 , 以反映变异的大小 。 故这里选用了 c(lII) 。 再将两组资料合在一个图中 。 当然可按上述步骤 , 增加几个变量即可 。 但因两组资料的横轴刻度是一样的 , 当将两组资料
28、合在一个图中时 , 就有很多重叠的部分 , 因而分不清 两组资料 。 为了更清楚地表示 , 可将两组的横轴错开 。 所谓错开 , 即是两组的横坐标错开 , 如第 2 组的横坐标向右移0.4 。 但这样两组的横坐标就不一样了 , 而 graph 命令中横坐标只能有一个 , 因而原来的横坐标数据个数就增加一倍 , 变成 14 个点 。 步骤如下 : . set obs 14 /* 将观察点扩展到 14 。 . replace time=time _ n - 7+0.4 in 8/l /* 将第 2 组资料的时间加上 0.4 , 并放在 8 14 号 。 . replace y2=y2 _ n -
29、7 in 8/l /* 将第 2 组资料的观察值 放在 8 14 号 。 (l 表示 last) . replace y2=. in 1/7 /* 将第 2 组资料的 1 7 号观察值置为缺省值 . replace sd2=sd2 _ n - 7 in 8/l /* 将第 2 组资料的标准差放在 8 14 号 . replace sd2=. in 1/7 /* 将第 2 组资料 1 7 号的标准差置为缺省值 . replace z1=y2+sd2 in 8/l /* 计算第 2 组资料的标准差上面点的值 , 并放在 8 14 号 52 第五章 Stata 的绘图功能 . replace z2=
30、y2 - sd2 in 8/l /* 计算第 2 组资料的标准差下面点的值 , 并放在 8 14 号 看一下现在的数据库 : . list time y1 y2 z1 z2 time y1 y2 z1 z2 1. 0 11.8 . 13.2 10.4 2. 2 18.5 . 20.8 16.2 3. 4 25 . 28.4 21.6 4. 6 27.3 . 30.2 24.4 5. 8 30.4 . 33.6 27.2 6. 10 31.7 . 35.1 28.3 7. 12 32.5 . 36 29 8. .4 . 10.6 12.1 9.1 9. 2.4 . 16.3 18.3 14.3
31、10. 4.4 . 18.9 21 16.8 11. 6.4 . 22.6 24.5 20.7 12. 8.4 . 22.8 24.6 21 13. 10.4 . 22.6 24.9 20.3 14. 12.4 . 22.9 25.1 20.7 共有 14 个点 , 其中 y2 和 sd2 被放在 8 14 号上 , z1 和 z2 表示标准差的上下两点的位置 , 前面 7 个数据是实验组的 , 后面 7 个数据是对照组的 。 做好这样的准备后 , 即可画图 。 . gra y1 y2 z1 z2 time, c(llII) s(TO) xlab(0,2,4,6,8,10,12) ylab 图
32、 5.17 例 5.5 两组资料的趋势线图 两组资料一目了然 。 注意 , 这里的两个 II 必须写在一起 , z1,z2 也必须排在一起 。 用 | 代替 II 时 , 标准差的上下现代医学统计方法与 Stata 应用 53 两点无小横线段 。 五 、 一维 散点图与箱式图的制作 一维散点图用于反映一个变量各观察点的分布位置 。 箱式图绘制 box - whisker 图 , 用于描述一组资料的中位数 、 四分位数及最大值 、 最小值的分布位置 。 用于绘制一维散点图和箱式图的命令为 : gra 变量名 , oneway gra 变量名 , oneway box 所作图形如图 5.4 。 注
33、意 , 这里的 oneway 不是选择项 , 如无该项 , 则 Stata 绘制的是直方图 。所指定的变量不超过 6 个 。 各变量的取值范围参差太大时 , 看 不出效果 。 六 、 二维箱式图的制作 二维箱式图绘制两个变量 ( 一个是纵轴变量 , 一个是横轴变量 ) 的箱式图 , 分别平行于对应的轴 。 用于绘制二维箱式图的命令是在为 : gra y变量 x变量 , twoway box 注意 , 这里的 twoway 不是选择项 , 如无该项 , 则 Stata 给出的是两个单变量的箱式图 。 其余选择项与二维散点图的选择项相同 。 例 5.6 将例 5.2 的散点图上加上箱式图 。 命令
34、为 : . gra y x, two box s(T) ylab xlab(11,12,13,14,15,16) g ap(4) 图 5.18 例 5.2 两组的二维散点图与箱式图 5 . 3 怎样使图形更美观 54 第五章 Stata 的绘图功能 Stata 画出的图比其它统计软件画出的图精美 , 且可直接被 WINDOWS 中的画 笔 及 WORD 等软件 直接调用 。 但要精益求精 , 使画出的图形更美观 , 还有几个技巧 。 现分述如下 : 调整散点的大小 , 使画出的散点大小适中 。 这可在 Stata 的菜单中选 Preferences , 再选 Graph 中的 Magnific
35、ations 。 见下图 : 这时 , Stata 弹出 Magnifications 菜单 : 用户可在这个菜单中对各种散点的符号的大小进行调整 。 各散点的大小 Stata 默认值为 100, 要使散点变大 , 只需增加各散点的取值 , 一般取 150 200。 要使散点变小 , 只需减少各散点的取值 。选定后 , 按 OK 即可 。 调整图形中文字的大小 。 4.0以下版本中 , Stata 图形中显示的数字和文字实际上是一种图形 ,且 不能 被 文字 或 图形 处理 软件 所 识 别 ; 5.0以上版本中 , Stata 图形中显示的数字 及 文字 与 操作系统中的文字一致 。 要使图
36、形中文字的大小适中 , 可通过 命令 set text 来定义 。 set text 这里 表示取值 。 Stata 默认值为 100, 要使文字变大 , 则需加大其取值 , 一般取 150 左右 。 如 : 现代医学统计方法与 Stata 应用 55 set text 150。 这一命令用在 graph 命令之前 , 输入该命令后的所有作图命令的文字都将变大 。直到再用该命令对文字的大小进行修改 。 调整打印出来的图形大小 。 在 DOS 版本的 Stata 中 , 用命令 gphdot 可将图形打印出来 ;在 WINDOWS 版本的 Stata 中可在菜单中选 Print Graph ,将
37、图形印出来 , 也可在命令 行输入 DOS命令 gphdot。 但直接打印的图形较大 , 要使打印出的图形大小适中 , 须增加一些选择项 。 命令如下 : gphdot 文件名 /r# /rx# /ry# /n 其中 : /r# /* 定义打印图的大小 , 同时缩小或放大长度与宽度 。 默认为 100 。 的取值越大 , 打印出的图 就越大 , 反之亦然 。 /rx# /* 定义打印图的宽度 。 默认为 100 。 /ry# /* 定义打印图的长度 。 默认为 100 。 /n /* 图的下方不 打印 stata 标记 。 用 WORD 等软件对图形进行编辑 , 如定义线条的粗细 、 线型 , 改变填充色或填充图案等 ,使图形更美观 。