查看原文
其他

如何绘制任泽平《鼓励生育基金》的几幅图

爬虫俱乐部 Stata and Python数据分析 2022-03-15
本文作者:邱沣,河南大学经济学院

本文编辑:喻淑敏

技术总编:李婷婷

Stata&Python云端课程来啦!

        为了平衡团队运营成本,维系公众号的运营,也与国内动辄数千元的Stata课程缩短差距,我们的网课不得不上调价格,我们决定于2022年1月15日起调价,Python课程的价格调整为299.9元Stata进阶课程调为299.9元Stata基础课程调整到329.9元。大家可以告知一下身边想要购买的小伙伴,欲购从速哦,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言~我们在这篇推文提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~此外,凭考研准考证和任意一篇推文集够50个赞,购买爬虫俱乐部的主要课程,即可获得50元的优惠,大家赶快行动起来吧~




导读

 近日来,著名学者任泽平提出的关于鼓励生育基金的几件回应,在互联网上一石激起千层浪,尤其是印2万亿,用10年时间让社会多生5000万孩子,争议颇多。我们不想评价是否应该让75后85前抓住青春的尾巴赶快生娃儿这个建议有多馊,但是任经济学家毕竟是最值钱的首席经济学家,特别是他们绘制的几幅图还是很有参考价值的,绘图人绝对是学会了Stata绘图的真传。今天我们一起来展示一下这些图是如何通过Stata编程一步步绘制的,读者们学会这些绘图技巧,也许再有皮带哥聘用首席,你可能就有机会了!

一、绘制给每个点打上标签的散点图


首先,我们来观察一下这两幅图形,都是散点图,有标题和备注,还根据数据拟合了一条虚线,最为关键的是每一个点都有其对应的国家,即每一个点都打上了标签。而这一点在Stata中我们可以通过twoway命令的mlabel( )选项实现。

  接下来,我们先看一下如何绘制简单的散点图:

[twoway] scatter varlist [if] [in] [weight] [, options]
 在 Stata 中我们利用 twoway scatter或者直接使用scatter命令即可绘制散点图,其后直接加上变量名即可,之后可再加上一些判断语句,图形设置选项等。比如设置点的标签(mlable),设置点的颜色(mcolor),设置点的大小(msize)等。更多选项可以通过help scatter来了解。
我们利用auto数据来进行一个演示,选用其中50-60行的观测值,将纵坐标设为 mpg,横坐标设为weight,并标上每个点所代表的汽车品牌(make),当然这里也可以设置为其他变量,比如价格(price)等。
sysuse auto,cleartwoway scatter mpg weight in 50/60, mlabel(make)

这样我们就绘制出了每个点都带有特定标签的散点图了,这样看起来并不美观,但Stata为我们提供了对标签的方位,角度,颜色等进行个性化设置的选项。
1.设置标签的方位和角度

 设置标签的方位和角度可以通过两个选项来实现。即mlabposition(clockposlist)mlabangle(anglestylelist)

mlabposition(clockposlist) :设置标签的方位,需要注意的是这里的方位是指时钟方位,0-12分别对应时钟的12个点位,比如12点位对应的就是正上方。

mlabangle(anglestylelist) :设置标签倾斜的角度,这里直接输入对应的角度即可,比如倾斜45度即用 mlabangle(45)表示。

twoway scatter mpg weight in 50/60, mlabel(make) mlabposition(12) mlabangle(45)
我们可以使用上边的程序改变标签的方位和角度。画出的图如下:

2.设置标签的颜色

至于颜色我们通过选项 mlabcolor(colorstylelist) 即可改变,比如设置标签颜色为黑色:mlabcolor(black) 。下面插入一张Stata的色卡供大家参考。

此外,我们除了可以设置标签的颜色,还可以设置点的颜色,如果我们想将点设置为浅蓝色,借助选项mcolor(midblue) 即可实现。

3.设置标签的大小

 设置标签大小,使用mlabsize(textsizestylelist) 选项即可,简单来说从小到大可供选择的有tiny small medium large huge。更多选择见help textsizestyle。这里我们将标签颜色设置为黑色,标签大小设置为medium。
twoway scatter mpg weight in 50/60, mlabel(make) mlabposition(12) mlabangle(20) ///mlabcolor(black) mcolor(midblue) mlabsize(medium)

此外我们还可利用选项mlabgap() 来设置点和标签之间的距离,大家可以自己试一试~

4.拟合直线

  Stata中我们利用twoway lfit选项即可拟合直线,具体用法如下:
twoway lfit yvar xvar [if] [in] [weight] [, options]
可以看出用法和twoway scatter类似,这里我们需要将两个图形画在同一个坐标系中,其实只需放在一个twoway命令中,用括号分隔来即可。例如:
twoway (scatter mpg weight in 50/60, mlabel(make) mlabposition(12) mlabangle(20) mlabcolor(black) mcolor(midblue) mlabsize(medium)) ///(lfit mpg weight in 50/60,lpattern(dot) lcolor(blue))

  其中lpattern() 为设置直线的连接方式,这里为还原原图的画法设置为点状。lcolor() 为设置线条的颜色,这里还原原图的样式设为蓝色。

5.图形的标题和备注

  最后,我们再给图形加上标题和备注,使用title、note选项即可。
twoway (scatter mpg weight in 50/60, mlabel(make) mlabposition(12) mlabangle(20) mlabcolor(black) mcolor(midblue) mlabsize(medium)) ///(lfit mpg weight in 50/60,lpattern(dot) lcolor(blue)) , ///title(美国1978年汽车行业横截面数据) note(Data Source: 1978 automobile data,size(large)) xtitle("") legend(off)

经过以上一系列的修改和完善,利用这些命令和选项,我们就可以画出类似原图样式的美观详实的图形了。
二、绘制双x轴的条形图


和上文一致,我们先观察一下这幅图形,这四个图都有一个最关键的共同特征:拥有双x轴的条形图且都是水平方向,即在同一个坐标系上共用一个y轴,以此分为左右两边两个条形图,从而更为直观的比较两个图形的差别。接下来我们来看如何用Stata绘制这样的图形。
首先我们看一下如何绘制二维条形图,语法如下:
twoway bar yvar xvar [if] [in] [, options]
  可以看出语法结构和上文都类似,而绘制双x轴的条形图关键在于选项xvarlab( ) :指定变量x对应的坐标轴,当然这样做的前提是共用一个变量y。此外要将两个图形画在同一个坐标系中,需放在一个twoway命令中,并用括号分隔开来。
  接下来,我们先使用人口普查数据pop2000.dta,绘制左半边图形试试,来看年龄结构如何。
sysuse pop2000, clear list agegrp maletotal femtotalreplace maletotal = -maletotal/1e+6replace femtotal = femtotal/1e+6*转换数据单位为百万twoway bar maletotal agegrp, horizontal xtitle("Population in millions") ytitle("")
 其中horizontal是将条形图改为水平方向,xtitle() , ytitle() 为设置横纵坐标轴标题。

  我们和原图对比一下会发现,Y轴标签未反应真实的年龄结构,而且原图颜色为蓝色且每个小条形之间是有空隙的。接下来,我们针对这些问题进一步美化和完善。

twoway bar maletotal agegrp, horizontal barwidth(0.8) color(blue) /// ylabel(1(1)17, angle(horizontal) valuelabel labsize(*.8)) xtitle("Population in millions") ytitle("")

  其中barwidth设置条形图的宽度(默认为1,即条与条没有空隙);color( ) 设置条形图的颜色;valuelabel是显示真实的变量标签;ylabel为设置纵坐标刻度,其中angle为设置刻度值的倾斜角度,这里同样设为了水平方向;labsize(*.8) 设置y轴刻度值大小为原来的0.8倍。

  接下来,我们再画一个类似的图形,利用选项xvarlab( ) 将二者“拼接”起来即可。
twoway (bar maletotal agegrp, horizontal xvarlab(Males) barwidth(0.8) color(blue)) ///(bar femtotal agegrp, horizontal xvarlab(Females) barwidth(0.8)), ///ylabel(1(1)17, angle(horizontal) valuelabel labsize(*.8)) xtitle("Population in millions") ytitle("") ///xlabel(-10 "10" -7.5 "7.5" -5 "5" -2.5 "2.5" 2.5 5 7.5 10)legend(label(1 Males) label(2 Females) position(1))title("US Male and Female Population by Age")subtitle("Year 2000")note("Source: U.S. Census Bureau, Census 2000, Tables 1, 2 and 3",span)
  利用这些神奇的选项,我们就可以几乎还原原图的模样了。其中legend为设置图例的样式,这里为设置第一个图例为Males,第二个为Females。

   但我们也发现,原图中的Y轴处在两个条形图的中间,我们怎样让Y轴显示在中间呢?其实这里有个非常巧妙的方法,我们先隐藏真实的Y轴,利用选项yscale(noline) ylabel(none) (设Y轴为无刻度线,无标签)。再生成一个数值为零的变量,用变量agegrp为纵坐标,零变量为横坐标,生成散点图。这样一来这些点都会落在条形图的正中间,最后利用选项mlabel(agegrp)为每个点打上所属的年龄标签,就构成了我们所需要的“Y轴”。

gen zero = 0twoway (bar maletotal agegrp, horizontal xvarlab(Males) barwidth(0.8) color(blue)) ///(bar femtotal agegrp, horizontal xvarlab(Females) barwidth(0.8)) ///(scatter agegrp zero , mlabel(agegrp) mlabcolor(black) msymbol(i)), ///yscale(noline) ylabel(none) xtitle("Population in millions") ytitle("")xlabel(-10 "10" -7.5 "7.5" -5 "5" -2.5 "2.5" 2.5 5 7.5 10) ///legend(label(1 Males) label(2 Females) position(1)) legend(order(1 2)) title("US Male and Female Population by Age")subtitle("Year 2000")note("Source: U.S. Census Bureau, Census 2000, Tables 1, 2 and 3",span)
其中msymbol() 为设置散点图中点的样式,这里i代指none,即一个看不见的符号。

 经过不断的完善和美观,我们终于近乎完美地画出了原图样式的条形图。  

最后,如果我们和原图一样有多年的数据,那我们如何让将多张图放在一起呢?Stata同样为我们提供了一个强大的命令graph combine,使用语法如下:
graph combine name [name ...] [, options]
  需要注意的是这里的图片文件格式必须为Stata可编辑的格式:gph
graph combine 1.gph 2.gph, saving(3)

结语

通过一步步不停地探索和实践,我们终于画出了样式精美Stata图形,从中可以看出Stata在图形处理方面的强大,而无所不能的Stata又还能画出怎样精妙的图形呢?欢迎大家和我们一起学习和探索!

END
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。




腾讯课堂课程二维码








            


 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!











往期推文推荐

      Python 第六天——字符串

      findname——想要什么找什么

      Python字符串之“分分合合”

       PDF转docx可批量操作?——wordconvert的小技巧

       考研之后,文科生需以“do”躬“do”!

       手绘五星兴家国——用Stata绘制五星红旗

       Seminar丨董事会的性别多样化和企业创新:来自国际的证据

      Python与数据库交互——窗口函数

       Stata之post命令——数据邮递 

       爬虫俱乐部成员的Stata学习经验分享来啦!

       Seminar丨2002年萨班斯·奥克斯利法案的经济后果

        我几乎画出了“隔壁三哥”家的国旗

        Python基础——三大数字类型,你都了解吗?
        如何用Stata绘制带指向性箭头标注的图像       
        Seminar丨荐仆贷款——19世纪中国的信任辅助贷款【技能篇】多进程队列间通信

Seminar丨公司董事会的人才增长:来自中国的证据

正则表达式--懒惰模式

爬完独立董事的年薪,我的眼镜跌破了!识别旅游“照骗”——看风景名胜是否名副其实主成分分析的Python实现

正则表达式--贪婪模式

Seminar丨谁更重要:高管股权薪酬与财务报告欺诈DOS能量,超乎你想象!

爬虫实战丨走进哈利波特的魔法世界

数据集合并的新路子-frlink命令

Seminar丨附近的公司:利用卫星图像研究本地信息优势

线性同余法生成伪随机数 

[技能篇]多线程爬虫

“好哭”是衡量一部好电影的标准吗?

Stata&Python云端课程来啦!

带你了解Stata中的矩阵

Seminar|总统的朋友:政治关联与企业价值
爬虫实战 | 爬取中国天气网

爬虫实战 | 爬取东方财富网经济数据——以居民消费价格指数(CPI)为例

关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



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

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存