2.1 散点图
2.2 线图
2.3 其他图形
2.4 图形管理
Stata拥有出色的图形设备,可通过 graph 命令访问, help graph 了解概述。统计中最常见的图表是显示点或线的双坐标轴X-Y图。这可以通过子命令 twoway 实现。 twoway 命令中又含42个子命令及绘图类型,其中最重要的是 scatter 和 line 。我们将对 scatter 和 line 着重介绍,并简要介绍其他绘图类型。
Stata 10引入了一个图形编辑器,可用于交互式地修改图形。然而,我不会提倡这种做法,因为它与记录和确保研究中所有步骤可重复的目标相冲突。
本节中的所有图表(除非另有说明)都使用带蓝色标题和白色背景的自定义方案,我将在第2.2.5节对方案进行讨论。
在本节中,我将使用前文使用过的有关生育率下降的 effort 数据集进行图表说明。读取数据:
为了激起你的兴趣,先展示我们将在本节中完成的作品:
可以使用以下命令生成生育率变化(change)与社会环境(setting)关系的简单散点图:
请注意,首先指定的变量是在Y轴。如果变量有定义标签,则坐标轴显示变量标签名,若无定义则显示变量名。如果这是唯一的图,该命令可以缩写为 twoway scatter ,或者 scatter 。现在我们将添加一些东西。
假设我们也想显示拟合的回归线。在某些软件包中,您需要运行回归,计算拟合线,然后对其进行绘制。Stata可以使用 lfit 绘图类型一步完成所有操作(还有一个二次拟合绘图类型 qfit )。通过将每个子图封闭在括号内,可以将它与散点图结合使用(也可以使用两条竖线来分隔它们)。
现在假设我们想在回归线上放置置信区间。Stata可以通过 lfitci 来实现这一点,该绘图类型将置信区域绘制为灰色带。(还有一个 qfitci 类型用于二次拟合的频带。)因为置信带会遮蔽一些点,所以我们先绘制该区域再绘制点
请注意,该命令不会标记y轴,而是使用图例。您可以使用该 ytitle() 选项为y轴指定标签,并隐藏图例 legend(off) :
有很多选项可以让你控制点的标签,包括它们的形状和颜色,参见 help marker_options 。使用 mlabel(varname) 选项也可以用变量的值标记点。在下一步中,我们将国名添加到图中:
标签中的一个小问题是哥斯达黎加和特立尼达多巴哥(以及巴拿马和尼加拉瓜)相互重叠。我们可以使用12小时时钟指定标签相对于标记的位置来解决这个问题(12是上面的,3是右边,6是下面,9是在标记的左边)。
我们创建一个变量,将默认设置的位置保持为3点,然后将哥斯达黎加移动到9点,特立尼达多巴哥移动到11点以上的位置(我们也可以将尼加拉瓜和巴拿马上移位,到2点方向):
生成此版本图形的命令如下
有些选项适用于所有双向图形,包括标题,标签和图例等。Stata图表的 title() 和 subtitle() 通常在顶部, legend() , note() 和 caption() 通常在底部,更多信息键入 help title_options 。通常你只需了解标题即可。Stata 11允许图形中的文本包括粗体,斜体,希腊字母,数学符号和字体选择。Stata 14引入了Unicode,大大扩展了可以完成的工作。 help graph text 以了解更多信息。
我们对图表的最后调整是添加一个图例来指定线性拟合和95%置信区间。我们使用 order(2 "linear fit" 1 "95% CI") 命令,图例的选项按照该顺序标记第二个和第一个项目。我们还使用 ring(0) 将图例移动到绘图区域内,并使用 pos(5) 将图例框放置在5点钟位置附近。完整命令就是:
结果就是本节开始处显示的图形
有一些选项可以控制轴的缩放比例和范围,包括 xscale() 和 yscale() 。可以是算术,对数值等。更多信息 help axis_scale_options 。其它选项控制主要和次要记号和标签,如 xlabel() , xtick() and mtick() ,同样地,对于y轴,见 help axis_label_options 。通常默认值是可以接受的,但还是很高兴您知道它们是可以更改的。
将使用美国预期寿命数据来说明线图,这试数据Stata附带的数据集之一(试试 sysuse dir 看看还有什么可用的)。
我们的目标是绘制20世纪美国白人和黑人男性的预期寿命。为了激发你的兴趣,将先向你展示最终成果,然后我们将一点一点地构建图表。
最简单的图形所有参数使用默认值:
如果这就是我们所要的图形,可以将命令缩写为 twoway line ,或者 line (只适用于散点图和线图)。
线图允许我们指定多个“y”变量,顺序为y1,y2,...,ym,x。本例中,我们指定了两个——对应于白人男性和黑人男性的预期寿命。或者,我们可以使用两条线图: (line le_wmale year) (line le_bmale year) 。
默认图形很好,但图例似乎太罗嗦。我们会将大部分信息转移到标题中,并且只保留肤色信息:
在这里,我使用了三个选项: title , subtitle 和 legend 。 legend 选项有许多子选项此处用 order 列出关键点(即 1 和 2 )及其标签,说明第一条线代表白人,第二条线代表黑人。要省略关键点,只需将其从列表中移除即可。其他的图例选项,请参阅 help legend_option 。
下面我希望在画图区域内移动图例来改善空间,比如说在5点钟左右的位置有空余空间。如前所述,我们可以通过使用 ring(0) 将图例移动到绘图区域内,并通过 pos(5) 将其置于5点钟位置附近。因为这些都是图例子选项,所以都在 legend() 命令括号中输入:
我不知道你感觉如何,但我自己很难区分图画中的默认线条。Stata中有不同的方式控制线条样式。 clstyle() 选项可以让你使用已命名的不同风格,比如 foreground , grid , yxline ,或是根据线1~15使用样式命名的 p1-p15 ,详情请参阅 help linestyle 。如果您想根据方案选择合适样式元素,这非常有用。
您也可以指定样式的三个成分从而确定风格:线条样式,宽度和颜色:
我们将白人指定为蓝色,黑人指定为红色:
请注意,这 clcolor() 是线图的一个选项,所以我将括号放在 line 命令的周围并把 clcolor() 插入那里。
由上图我们可以看出,预期寿命的提升速度在20世纪下半叶有所减缓。使用对数刻度可以更直观的理解,需要注意的是对数刻度中直线表示恒定的改善幅度。这由 help axis_options 可以很容易完成。尤其是 yscale() ,它可以让你选择算数( arithmetic ),对数( log )或倒置刻度( reversed )。其中倒置刻度是指y轴是从最大的值开始的,最小值反而在最上方。还有一个子选项 range() 可以控制绘图范围。在这里,我将y范围指定为25到80,以便将曲线稍微向上移动:
Stata使用方案来控制图的外观,参见 help scheme 。您可以设置默认方案并在所有图形中应用 set scheme_name 。您也可以使用不同的方案对所作的最后一个图形重新展示,选出效果最好的方案 graph display, scheme(scheme_name) 。
使用 graph query, schemes 查看可用方案类型列表。 s2color 方案适用于屏幕图表, s1manual 是Stata手册中的风格。 economist 是经济学人杂志使用的风格。我们可以获得本节开头所示的图形使用的是 economist 风格。
条形图可用于绘制分类变量的频数分布,或绘制由分类变量定义的组内连续变量的描述性统计。我们将使用Stata附带的城市温度数据集为例说明。
如果我只是键入 graph bar, over(region) 我将获得区域变量的频数分布。让我们来展示一月和七月的平均气温的区域分布。要做到这一点,我可以指定 (mean) tempjan (mean) tempjuly ,但由于默认统计是平均值,我们可以简写如下。我认为默认图例太长,所以也指定了一个自定义图例。
我使用 over() 这样所以区域出现在同一个图表中· by() 则相反,每个区域都会产生一个单独的坐标轴。 bargap() 选项则控制同一个组中不同统计的小节之间的间隔在这里我放了一个小空间。 gap() (此处未使用)选项控制不同组别的空间。我还将颜色填充强度设置为70%,我认为这看起来更好。
显然,1月份东北部和北部中部地区比南部和西部冷得多。七月份的变化较少,但南部的气温较高。
使用箱线图可以快速获得变量分布的特征,箱线图是取值范围为1~3分位数的箱子,将中位数用横线显示,并且在盒子上下方增加了“wiskers”,定义为距离中值不超过四分位数间距的1.5倍的最高和最低值。在wiskers上下方的点用圆圈表示为异常值。
让我们画一个地区1月份的温度箱形图。我将使用 over(region) 选项,并用 sort(1) 选项控制排列顺序——按照第一个变量 tempjan 中位数大小排列。我还通过设定RGB值将颜色设置为蓝色:
我们看到,1月份的气温在东北部和北部中部地区较低,变化较小,相当一部分城市气温异常偏冷。
对变量分布更详细的展示需要用到平滑直方图,可以使用 kdensity 命令使用核密度平滑器计算平滑直方图。
让我们使用默认设置对每个区域的1月温度进行单独的核密度估计,并保存结果。
接下来我们做出核密度估计图。由于密度图重叠,我使用Stata 15中引入的不透明选项使它们透明度达到50%。在这种情况下,我使用颜色名称后面跟着一个%符号和不透明度。我也简化了图例,匹配密度的顺序,并把它放在图示的右上角。
这个图示使我们清楚地看到了1月份气温的区域差异,东北部和北部中心地区的气候分布更冷,更窄,南部和西部的气候相当相似。
Stata默认在内存中保存您绘制的最后一个图形,并将其称为“Graph”。如果你在在创建图形时使用 name() 为图形单独命名,在内存中可以保留多个图形。这对于组合图形很有用, help graph combine 了解更多。请注意,即使您保存了数据,保存在内存中的图表也会在您退出Stata时消失,除非您保存图形本身。
要使用Stata自己的格式将当前图形保存到磁盘上,输入 graph save filename 。该命令有两个选项 replace 和 asis ,如果该文件已存在,则需要使用 replace 选项替代原有图形,而 asis 选项会冻结图形(包括其当前风格),然后将其保存。默认情况下,将图形保存为可在未来可编辑的实时格式。以Stata格式保存图形后,可以使用 graph use filename 命令从磁盘加载它。( graph save 和 graph use 类似于 save 和 use )存储在内存中的任何图形可以使用 graph display [name] 显示。 help graph_manipulation 了解更多信息。
如果您打算将图表合并到另一个文档中,您可能需要将其保存为更便携的格式。Stata的命令 graph export filename 可以使用各种矢量或光栅格式导出图形,通常由文件扩展名指定。您还可以使用 graph print 打印图形,或使用Windows剪贴板将其复制并粘贴到文档中。
//lecture 6
cd /Victor/stata
use "nei_sample.dta",clear
edit zipcode
//split默认根据空格拆分 stub前缀 prase on these strings根据什么拆分(通过观察)
split facilityname_origin, generate(varnew) parse(,)
split zipcode,generate(zipnew) parse(-)//在2894行 有的没有破折号需要提取前五位
//按照某种符号拆分字符串
edit zipcode
help substr
//截取
gen zip5=substr(zipcode,1,5)
//生成zip5,表示截取zipcode的前五位 从第一位 截取五位
edit zipcode zip5 if length(zip5) ~=5
//展示长度不等于5的zip5和zipcode
edit zip5
gen len_cn = ustrlen(zipcode)
//生成中文字符串长度
edit fips
gen fips2 = substr(fips, 1,2)
edit fips2
gen fips3 = substr(fips, 3,3)
edit fips2 fips3
destring fips2, replace force
destring fips3, replace force
//字符变数值
tostring fips2 fips3, replace force
//数值变字符
edit fips2 fips3
replace fips2="0"+fips2 if length(fips2)==1
replace fips3="0"+fips3 if length(fips3)==2
replace fips3="00"+fips3 if length(fips3)==1
//前面用零补齐,补成五位
help duplicates
//重复观测值
sort newid
duplicates report newid year
//报告重复观测值
//copies代表这个数据一共有多少个 =1就代表没有重复 第4541只有一个观测值newid
duplicates tag newid year, gen(dup)
//标注重复观测值
tab dup
//展示
edit new year if dup>=177
duplicates drop newid year, force
//去掉重复样本//两个都一样才丢掉
duplicates report newid year
ssc install unique
//安装unique
unique newid year
//展示有几个是唯一的
unique fips
use nei_sample.dta, clear
help collapse
//压缩
collapse (sum) so2 co nox nh3 voc (first) facilityname_origin fips zipcode , by(newid year)
//根据newid year重复的字符串变量 (first)后面的三个只取第一个数据 数值变量so2等等。。加总(sum) 没涉及的变量就丢掉了
duplicates report newid year
collapse (sum) so2 co nox nh3 voc (count) newid, by(fips year)
//关于fips year 加总。数出newid(在fips year全都相同的情况下有几个newid(企业))
//每个地区每一年污染物的多少,企业有多少
gen id = newid
//replace
//改变面板数据的结构
use nei_sample.dta, clear
help reshape
keep newid year so2
duplicates drop newid year, force
reshape wide so2 , i(newid) j(year)
reshape long so2 co nox voc nh3, i(newid) j(time)
//将宽表和长表相互转换
keep newid year co
reshape wide co,i(newid) j(year)
duplicates drop newid year,force
reshape wide co,i(newid) j(year)
reshape long co,i(newid) j(year)//观测值变成了999*12,转换两次之后,数据变成
*balanced data(平衡面板数据)了 也是为了便于做可视化分析,计量分析
//lecture 7
cd /Victor/stata
use "nei_sample.dta",clear
keep newid year so2
//保留这三个
help reshape
//数据重排
duplicates drop newid year, force
reshape wide so2 , i(newid) j(year)
//不同问题下i不同 这里的i是企业 j是时间
reshape long so2 co nox voc nh3, i(newid) j(time)
//reshape//long wide lecture7
use "nei_sample.dta",clear
keep newid year so2 co nox voc nh3 sic
duplicates drop newid year, force
reshape wide so2 co nox voc nh3, i(newid sic) j(year)
keep newid year so2 co nox voc nh3 sic
reshape wide so2 co nox voc nh3, i(newid sic) j(year)
//数据变少了是因为有的newid对应多个sic
reshape long so2 co nox voc nh3, i(newid sic) j(year)
//通过这种方式将它强行变成平衡面板 先wide 后long(意义重大)
use nei_sample,clear
keep so2 co nox voc nh3 newid year
duplicates drop newid year,force
reshape wide so2 co nox voc nh3,i(newid) j(year)
reshape long so2 co nox voc nh3,i(newid) j(time)//三千多个变成了一万多个
*reshape之后每一个企业都在每一年1990——2011有观测值,强行将数据变为balanced
ren (so2 co nh3 nox voc) (pol1 pol2 pol3 pol4 pol5)
//更改变量名 为了保证前缀都一样 才能转换
*sample
rename so2 pu1
rename co pu2
rename nox pu3
rename voc pu4
rename nh3 pu5
reshape long pu,i(newid time) j(type)
tostring type,replace
replace type="so2" if type=="1"
replace type="co" if type=="2"
replace type="nox" if type=="3"
replace type="voc" if type=="4"
replace type="nh3" if type=="5"
keep newid year pol1 pol2 pol3 pol4 pol5
reshape long pol, i(newid year) j(type)
//??? 没有drop
tostring type, replace force
//???
replace type = "so2" if type == 1
//替代污染物名称
use "nei_sample.dta",clear
duplicates drop newid year, force
//去掉重复值
edit newid year so2
sort newid year
by newid: gen l1so2 = so2[_n-1]
//so2[1] so2[_N] n-1代表上一行的观测值 通过企业来分 每个n对于企业来说是不一样的
by newid: gen l2so2 = so2[_n-2]
//上两行
by newid: gen l0so2 = so2[_n]
by newid: gen f1so2 = so2[_n+1]
//滞后一期
bys newid: gen Nso2 = so2[_N]
//展示这个企业最后一年的数据
bys newid: gen n1so2 = so2[1]
//有时需要保证它是一个平衡面板:可利用以下命令
xtset newid year
//set panel variable 让他成为面板数据 如果不告诉它 它永远按上一行处理
gen lso2 = l.so2
//l.代表上一期的滞后变量(上一年)这个和上一行的数据不一样喔 有时可能上一行不是上一年 就没有上一期了
use "nei_sample.dta",clear
duplicates drop newid year, force
edit fips year newid
sort fips year newid
by fips year: egen id_sum = count(newid)
//通过fips year来分 如果两个都相同就算一次
edit fips year newid so2
by fips year: egen so2_fips = sum(so2)
//missing values
//得到地区层面的数据 用于变量的构造 通过微观数据做加总数据又保留微观数据本身
//
use "nei_sample.dta",clear
help collapse
collapse (sum) so2 co nox nh3 voc (first) facilityname_origin fips zipcode , by(newid year)
//构造更高层面的行业数据 微观数据全部损失了. 加总相同年份的污染量,(first)后面的是只保留第一行
duplicates report newid year
collapse (sum) so2 co nox nh3 voc (count) newid, by(fips year)
gen id = newid
//replace
//collapse by 2_digit sic and fips_stata (2_dight fips), and year,
use "nei_sample.dta",clear
gen fips3 = substr(fips,1,2)
gen sic2 = substr(sic,1,2)
collapse (sum) so2 co nox nh3 voc ,by( fips3 sic2 year)
//lecture 8
//图形的组成
sysuse uslifeexp2
decribe
scatter le year
//第一个是y 第二个是x轴
//connect(l) 表示以直线的方式连接相邻的两个点
//msymbol(i) 表示散点的显示方式为“看不见”
scatter le year, connect(l)
scatter le year, connect(l) msymbol(i)
scatter le year, connect(l) msymbol(smdiamond)
//散点形状改为棱形
scatter le year, connect(l) msymbol(smdiamond) mcolor(lime)
//标记间连线的方式,标记本身的形状,标记的颜色
help marker_options
//标记标签的选择
graph query symbolstyle
help marker_label_options
sysuse lifeexp.dta, clear
describe
list country lexp gnppc if region == 2
scatter lexp gnppc if region == 2, mlabel(country)
scatter lexp gnppc if region == 2, mlabel(country) mlabpos(9)
//将标签调整到九点钟方向 这样美国就可以显示出来了
//下面尝试利用 mlabvposition(varname) 选项为某些特殊选项的观测值设定标签的位置 为了单独为美国和洪都拉斯设定标签显示方向,
//需要生成一个指标方向的变量,命名为破碎,然后利用这个变量对每个案例的不同附值来调整各个散点的标签位置
generate pos = 3
//所有国家都是3
replace pos = 12 if country == "Honduras"
replace pos = 9 if country == "United States"
scatter lexp gnppc if region == 2, mlabel(country) mlabv(pos)
//下面尝试利用改变坐标轴的覆盖范围来设定标签
//方法一:利用xscale(range())指定作图的区域
scatter lexp gnppc if region ==2,mlabel(country) mlabv(pos) xscale(range(-500 3500))
//方法二:利用plotregion( margin())来解决作图区域的微小变动
scatter lexp gnppc if region == 2,mlabel(country) mlabv(pos) plotregion(margin(l+9))
sysuse autornd, clear
descrbe
scatter mpg weight
scatter mpg weight, jitter(7)
//由于数据点太密集了,产生重叠,需要将数据点轻微地挪动位置,jitter(#)震荡选项
//二维绘图选项,help twoway
//标题选项,坐标,图例,增加线,by
sysuse lifeexp.dta, clear
scatter lexp gnppc
gen log_gnppc = log(gnppc)
//对数化,更线性
scatter lexp log_gnppc
//另一种方法:
scatter lexp gnppc, xscale(log)
//做散点图,并对比y轴刻度使用正常尺度与逆向尺度的异同
sysuse auto.dta, clear
scatter mpg weight
scatter mpg weight, yscale(rev)
//车重与油耗正相关
//下面绘制完全没有任何坐标的散点图和有坐标刻度但没有坐标线的散点图
scatter mpg weight, yscale(off)
//不要y轴
scatter mpg weight, yscale(noline) xscale(noline)
//去掉了坐标线,保留刻度
help axis_label_options
sysuse auto, clear
describe
sum
//下面分别绘值mpg、weight的标有大约坐标轴上5个10个刻度标识的mpg和weight散点图
scatter mpg weight
scatter mpg weight, ylabel(#5) xlabel(#5)
scatter mpg weight, ylabel(#10) xlabel(#10)
scatter mpg weight, ylabel(10(5)45) xlabel(1500 1970 2500(1000)4500)
//自定义规则
scatter mpg weight, ytick(#10) xtick(#15)
//绘制x轴大约有15个刻度,y大约10个刻度
scatter mpg weight, ymlabel(##5) xmtick(##10)
//把小刻度的标识也标上去,x轴主刻度之间有10个小刻度
scatter mpg weight , ymlabel(##5) xmlabel(##10)
//时间序列散点图时的轴线刻度标识问题
sysuse uslifeexp, clear
scatter le year, c(l)
scatter le year, c(l) xlabel(#10,grid)
//网格,用线连
scatter le year, c(l) xlabel(1900(10)2000,grid)
scatter le year, c(l) xlabel(1900 1918 1936 1950(20)2000,nogrid)
scatter le year, lcolor(yellow) c(l) xlabel(1900 1918 1936 1950(20)2000,nogrid)
line le year, lcolor(navy) lpattern(dot)
sysuse uslifeexp, clear
scatter le year, c(l) xlabel(1990 1918 1940(20)2000,grid) legend(on)
label var le_male "男人,人均寿命"
scatter le_male le_female year, legend(label(1 "Male") label(2 "Female"))
//绘制散点图并添加图例,将图例分别改为”male”和”female“
scatter le_male le_female year, c(l) legend(on)
//legend是图例
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)