哈喽,诸君安。自从我们公众号推出有问必答栏目,陆陆续续有很多朋友向我们投来自己的问题。我们本着有问必答的态度,认真对待每一个问题,并及时帮大家答疑解惑。近日,又有一位朋友提出一个问题,问题是酱婶的:
这是一个stata的作图问题,他要绘制1978-1996年全国不同省份大豆收购量和时间关系。
例如:
上图是吉林省1978-1996年大豆收购量的关系图。但是注意到左边y轴刻度是以20为起点,终值为100,现在问题是想让左边y轴起点从0开始,终点到该省大豆收购量最大值结束。但是每个省大豆收购量最大值是不同的;若修改的话只能每个省手动修改,这样耗时费力,还有可能出现错误。怎么办呢?接下来小编就带你解决这个问题。
鉴于没有提问者的数据,小编找了一个类似的面板数据进行解答,数据已放入百度云(http://pan.baidu.com/s/1kVAtimz),读者可自行下载。
clear
set more off
use d:/question_exam
这是一个非平衡的面板数据,为了方便观察,笔者选择了4个地区一段时间内的GDP。
数据有了,接下来对数据进行处理,我们的目的是把每个地区GDP的最大值作为y轴的终值,那么首先我们要找出每个地区GDP的最大值。
程序如下:
sort country year
by country: gen id=(_n==1)
replace id= sum(id) //生成id,是每一个国家对应一个id
replace GDP = GDP/1000000 //为了方便观察,把GDP除以1百万,相应的单位变为(百万美元)
bysort id :egen maxgdp=max(GDP) //得到每个国家GDP的最大值
结果如下:
这样我们就得到了每个地区GDP的最大值。接下来,开始做图!对多个地区分别作出相应的图标,我们可以利用循环。
我们先进行尝试,程序如下:
capture mkdir d:/statagraph/
forvalue i=1(1)4 {
gen maxgdp`i' = maxgdp if id ==`i'
graph twoway (bar GDP year, yaxis(1) barwidth(0.5) ylabel(0(`=maxgdp`i'/3')`=maxgdp`i'')) ///
(con GDP year, yaxis(2) ) if id == `i'
graph export "d:/statagraph/`i'.tif",replace
}
结果出现了错误: 我们再看一下程序,当进行第一次循环生成 maxgdp1时,条件是id=1,那么id不等于1的,都将变为缺失值。如下图:
在下边作图时,我们设定ylabel(0(`=maxgdp`i'/3')`=maxgdp`i''),因为stata把缺失值默认为无穷大,所以ylabel中将出现缺失值,程序无法继续运行。当然,我们想到可以把缺失值drop掉,可是缺失值所在的行也会一并的drop掉,我们将无法完成第二个图的绘制。相信经常关注我们公众号的朋友到了这里,会马上找到解决办法,那就是preserve restore--stata的起死回生之术。我们可以将这一命令写入循环中,使每一次循环结束,都还原一个完整的原始数据。(更多关于preserve-restore的命令,请查看推文preserve restore——stata的起死回生之术)
程序如下:
capture mkdir d:/statagraph/
forvalue i=1(1)4 {
preserve
gen maxgdp`i' = maxgdp if id ==`i'
drop if maxgdp`i' ==.
graph twoway (bar GDP year, yaxis(1) barwidth(0.5) ylabel(0(`=maxgdp`i'/3')`=maxgdp`i'')) ///
(con GDP year, yaxis(2) ) if id == `i'
graph export "d:/statagraph/`i'.tif",replace
restore
}
结果储存在d:/statagraph
可以看到这四幅图左边y轴的终值都为每个地区GDP的最大值。问题解决了!
以上就是今天小编与大家分享的全部内容了,如果各位看官喜欢今天的分享,不要吝啬您的打赏哦!~~想了解更多有关stata的小秘密,请继续关注我们的公众号哦,更多惊喜等着您!~~
编辑by谢慧蓉 徐苾雯
往期推文推荐:
7.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度
10.I have a Stata, I have a python
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
长按二维码关注你懂哟!~~
微信扫一扫
关注该公众号