有问必答——一题多解

2017-07-19 高金凤 爬虫俱乐部 爬虫俱乐部

诸君安!前不久我们一位粉丝问到一个作图的问题,大致是酱紫的:如何让条形图和折线图组合在一起,并且在条形图上显示变量的观测值。乍一听,似乎这个问题应该不难,到底是不是呢?听爬虫小将细细道来!

绘制条形图的命令有twoway bar或者graph bar,绘制折线图的命令有twoway line或者直接是line。首先,我们help一下这些绘图命令,正如下图所示的语法结构,要使得条形图和折线图放在同一张图上,我们只能用到命令twoway。

但是,我们也发现只有在命令graph bar中有选项blabel可以直接在条形图上加上变量观测值。用twoway不能直接用相关的选项,我们只好先采用简单粗暴的方法了!看例子如下,首先我们输入数据:

clear

input year meantotaltax

2011 2700.95

2012 2199.98

2013 2410.99

2014 2492.7

2015 2907.98

end

接着我们用到选项text()将变量的观测值直接添加到条形图上,操作如下:

twoway(bar meantotaltax year, fcolor(midgreen) barwidth(0.5)ylabel(2000(200)3000)  ///

xlabel(2011(1)2015)text(2700.95 2011 "2700.95",placement(12)) text(2199.98 2012 "2199.98"///   

placement(12))text(2410.99 2013 "2410.99",placement(12)) text(2492.7 2014 "2492.7"  ///

,placement(12))text(2907.98 2015 "2907.98",placement(12)))   ///

(linemeantotaltax year,lwidth(medthick) lcolor(red) legend(off))

注:

barwidth():表示每一个条形的宽度。

text(xy "z")x表示标签的横坐标,y表示标签的纵坐标,z表示所要添加的标签。

placement():表示标签的位置。12表示北方,0表示中间。

得到结果如下所示:

这种方法是可以达到我们的目的,但是程序不够精简。如果我们的数据不止有5年,这样一个个添加标签值就有点繁琐,那么我们如何用简单的方法实现这一目的呢?观察上图可以发现,条形图上的点正好也在折线图上,既然不能直接在条形图上加标签,我们可以考虑在折线图上加标签。大家还记得往期推文“混搭图形”中我们介绍的那个图形吗?在这里我们可以借鉴那个方法,看如下操作:

twoway (bar meantotaltax year, yscale(range(20003000)) barwidth(0.5) fcolor(blue*0.4))  ///

(scatter meantotaltax year,ms(O)mcolor(green)  lcolor(red)      ///

lwidth(0.5) connect(l)mlabel("meantotaltax") mlabposition(12) mlabcolor(black)legend(off))

ms():设置点的形状,O表示圆形,none表示无点。

fcolor():设置条形体内的颜色。

mcolor():设置点的颜色。

mlabel():设置点的标签。

lcolor():设置线的颜色。

lwidth():设置线的宽度。

connect():设置连接线的形状,l表示直线连接。

mlabposition():设置点标签的位置,12表示钟表的12点钟方向。

mlabcolor()设置点标签的颜色

可以看到,同样得到了这样的图形。但是,如果条形图和折线图没有共同的点,失去了这样的巧合,我们如何用更一般的方法去实现这一目的呢?在这里我们随机生成一个变量newvar,同样使用刚才的思想,在这里我们将条形图和“省去点”(ms(none))的散点图结合在一起,并在散点图上加上标签,看如下所示的操作:

gennewvar=meantotaltax+int(1000*uniform())

twoway (bar meantotaltaxyear,fcolor(midgreen) barwidth(0.5) ylabel(2000(500)4000) ///

xlabel(2011(1)2015))(scattermeantotaltax year,ylabel(2000(500)4000) ms(none) ///

mlabel("meantotaltax")mlabposition(6)mlabcolor(white)) (scatter newvar year,m(o) ///

mc(black) lc(midblue) lwidth(0.5)c(l) mlabel("newvar") mlabposition(12) ///

mlabcolor(black)ylabel(2000(500)4000) legend(off)) 

END

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

                           文字编辑:司海涛

技术总编:刘贝贝



往期推文推荐:

1.高校学术大神:你的导师上榜了吗?

2.中国高校财经、管理与综合类期刊灌水排行榜

3.关于RTF你不知道的命令之番外篇

4.免费事件研究,一片片从邮局寄来

5.免费的股价同步性,一片片从邮局寄来

6.Stata叫你回家听音乐了!

7.一言不合就用stata写邮件(Outlook/Foxmail)

8.听说你想知道怎么用stata画地图?

9.I have a Stata, I have a python

10.I have a Stata, I have a Python之二——pdf转word




关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

欢迎关注爬虫俱乐部  


微信扫一扫
关注该公众号