查看原文
其他

如何使用Stata绘制一幅好看的柱状图?

爬虫俱乐部 Stata and Python数据分析 2023-01-01

本文作者:赵一帆,中南财经政法大学金融学院

本文编辑:谭   可

技术总编:戴   雯

Stata&Python云端课程来啦!

      为了平衡团队运营成本,维系公众号的运营,也与国内动辄数千元的Stata课程缩短差距,我们的网课不得不上调价格,我们决定于2022年4月1日起调价,Python课程的价格调整为399.9元Stata基础课程调为399.9元Stata进阶课程调整到399.9元。大家可以告知一下身边想要购买的小伙伴,欲购从速哦,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言~我们在这篇推文提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~

引言
众所周知,Stata本身具备强大的绘图功能,提供了各种绘图命令,比如点(scatter),线(line),面(area),饼图(pie),直方图(histogram)和条形图(bar)等等。有时候,我们会想要把某个变量使用表直观展示,这时候我们可以使用柱状图。但是遇到二维变量我们需要怎么把它们放在同一个图中呢?本文就带着大家解决这类问题,一起来看看吧!


 一、Stata绘图命令的一般语法结构 

首先我们来看一下Stata绘制各类图形的一般语法结构是什么样的:

graph-command(plot-command,plot-options)(plot-command,plot-options),graph-options //第一种写法graph-command plot-command,plot-options||plot-command,plot-options||,graph options //第二种写法其中,graph-command 定义了图的类型;plot-command定义曲线的类型(比如点、线、面)。同一个图中如果有多种曲线,可以使用括号或者“||”分开。曲线的选项是plot-options,整张图的选项是graph-options那么,我们了解了Stata绘图的基本语法结构之后,下面将会分别介绍一下简单柱状图和多维柱状图将如何绘制。 二、简单柱状图 

首先,本文以国家统计局中的数据为例,数据集中主要的变量有三个,年份(year),研究人员全时当量(单位:万人/年),简记为people;研究人员经费支出(单位:亿元),简记为expense。如果我们想绘制一个简单的条形图展示出某个变量的分布情况,我们可以考虑使用twoway bar命令。这里我们使用import excel命令导入这个数据集。

*简单柱状图的绘制clear //清空数据内存cap mkdir E:\推文cd E:\推文 import excel using "2011-2020年全国科技数据.xls",first //导入数据集save tech.dta,replace#delimit ; //更改Stata默认的换行方式graph twoway bar people year,color(orange) //绘制条形图barwidth(0.5) xlabel(2011(1)2020)ylabel(250(50)550,angle(horizontal))title("近十年研究人员全时当量")ytitle("研究人员全时当量(单位:万人)")xtitle("年份") saving(tech1.gph, replace);#delimit cr

输入上述命令,我们可以得到下面的简单柱形图啦~

  • Stata换行方式的更改:我们可以把Stata的换行方式由默认的回车键改为;。在绘图命令开始之前使用命令 #delimit ;  (#delimit ; 可以简写为 #d ;),待绘图命令结束后,用 #delimit cr 恢复默认设定,这样就可以避免一行命令过长,显得比较冗余复杂。
  • 绘制简单柱状图的命令是graph twoway bar ,在这里也可以简写成twoway bar。具体的语句是twoway bar yvar xvar [if] [in] [, options],其中,yvar表示被解释变量;xvar表示解释变量。
  • 下面简单介绍一下常用的选项:
    1.设置柱体的颜色:color(colorstyle),我们可以将颜色设置为black,blue,orange等等,这里小编设为了橙色。
    2.设置柱体的宽度:barwidth(#),表示柱体的宽度,Stata默认宽度为1。如果设置宽度为1,绘制的条形图都是紧密相连没有缝隙的。为了让每个柱体更好辨别,我们一般设置为0-1之间。
    3.设定坐标轴的刻度:ylabel(rule_or_values),这里我们可以设置坐标轴的起始点为多少和中间的间隔。加上angle(horizontal)的选项表示刻度的数字会呈现水平的情况,如果不设置的话默认是垂直的情况。
    4.设置图片的标题:title(#) ;设置坐标轴的标题ytitle(axis_title)、xtitle(axis_title),这需要根据数据的内容去设置。
 三、双坐标轴柱状图 

(一)绘制柱状图

根据上面的步骤画完了展示出某个变量的简单柱状图,我们还想在一幅图片里得到科研经费支出和科研人员全时当量的直观数据展示。但是,这时候我们发现两个变量的单位和数据范围是截然不同的,因此考虑尝试来画一个双坐标轴的柱状图。
*多维柱状图的绘制clearcd E:\推文use tech.dta,replacegen year1 = year-0.15 //生成两个year变量,用于把两个柱形分开gen year2 = year+0.15#delimit ;twoway(bar expense year1,barwidth(0.3) bargap(50)) (bar people year2,barwidth(0.3) bargap(50) color(white) lcolor(black) yaxis(2)),xlabel(2011/2020)ylabel(5000(5000)25000,angle(horizontal))ylabel(250(50)550,axis(2) angle(horizontal))title("2011年-2020年科技研发情况")xtitle("年份") ytitle("经费支出(单位:亿元)",axis(1))ytitle("人员当量(单位:万人)",axis(2))legend(label(1 "科研经费支出") label(2 "科研人员数量"))saving(tech2.gph,replace);#delimit cr

输入上述命令,我们可以得到如下的图片:

  • 首先,在year变量的基础上加减0.15来生成两个新变量year1和year2,并作为条形图的横坐标,否则共用year变量会导致两个柱形重叠,无法展示清楚。
  • 然后,我们使用twoway的命令,分别生成两个条形图并设置同样地柱体宽度和组内间隔。这里在设置纵坐标轴的时候需要注意,选项ylabel()和ytitle()的时候默认是对主坐标轴y1轴进行设定,如果需要设定副坐标轴y2轴的刻度或者标题,需要再加上选项axis(2)。
  • 一些选项(如barwidth(#),xlabel()等)与简单柱状图的选项类似,上文已经介绍过,这里不再赘述。其他常用的选项包括:设置组内的间隔的选项,bargap()可以设定组内柱体之间所留空隙的大小。在默认情况为bargap(0),表示组内柱体之间是紧密相连的。这里我们设置参数为bargap(50),则表示组内条形之间所留的空隙为条形宽度的50%。

(二)为柱形图增加标签

如果我们还需要将具体的数据作为标签展示在条形图上方,因为条形图没有直接添加标签的mlabel选项。我们这时候有一个巧妙的tip,可以添加一个散点图来为我们的条形图增加标签,即在条形图后面加入散点图的图层,隐藏点的位置只显示出具体的数值。
*为柱形图增加标签clearcd E:\推文use tech.dta,replacegen year1 = year-0.15 //生成两个year变量,用于把两个柱形分开gen year2 = year+0.15#delimit ;twoway(bar expense year1,barwidth(0.3) bargap(50))(scatter expense year1, m(none) mlabel(expense) mlabangle(90) mlabposition(1) mlabcolor(black))(bar people year2,barwidth(0.3) bargap(50) color(white) lcolor(black) yaxis(2))(scatter people year2, m(none) mlabel(people) yaxis(2) mlabangle(90) mlabposition(1) mlabcolor(black)),legend(order(1 "科研经费支出" 3 "科研人员当量")) //合并两种图的图例xlabel(2011/2020)ylabel(5000(5000)25000,angle(horizontal))ylabel(250(50)550,axis(2) angle(horizontal))title("2011年-2020年科技研发情况")xtitle("年份") ytitle("经费支出(单位:亿元)",axis(1))ytitle("人员当量(单位:万人)",axis(2))saving(tech3.gph,replace);#delimit cr我们可以得到:

下面对上述添加的scatter图时,用的选项进行介绍。
  • m(none)代表不显示散点图的点,以更清晰地展示出标签值。

  • mlabel()代表对某变量添加标签值。

  • mlabangle(90) 代表标签值竖向排列。

  • mlabposition(1)即设置标签值的放在一点钟方向,使得条形图和标签图不互相遮挡。

(三)设置柱形图的颜色主题为黑白

在论文中使用到的条形图,不能使用彩色的条形图,那么我们还需要加入scheme(s2mono)这个选项是用于设置柱状图为黑白色主题。做法也很简单,就是在上述命令的后面补上一个子选项scheme(s2mono)即可。由于与上述命令大体相似,本文不再列出所有完整的命令,仅对结果做展示。未加数据标签的柱状图为:

加上数据标签的柱形图为:

以上就是对于简单柱状图和双坐标轴柱状图的简单介绍了,小伙伴快动手试一试呀~END最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。




腾讯课堂课程二维码





            


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














往期推文推荐

【爬虫篇】基于selenium爬取美团评论

 双标的莱万——足球无关政治?!

 Stata处理重复值:duplicates

It's time to send a flower to your lover!        2021各省GDP新鲜出炉

 爬虫实战-采集全国各省疫情数据

 log——为你的操作保驾护航

 一行代码教你玩转emoji

 票房遇冷的春节档口碑冠军丨《狙击手》影评分析

 学习丰县,营造良好营商环境!

 大国丢娃图:从川渝到徐州!

 丰县“失火”,殃及徐州:股市超跌近30亿!

 Unicode转义字符——编码与解码

        徐州!徐州!

        B站弹幕爬虫——冬奥顶流冰墩墩&雪容融

        不会用Stata做描述性统计表?so easy!

        丰沛之地:备足姨妈巾

 过年啦,用Python绘制一幅属于你的春联吧!

       登上爬虫俱乐部“时光机” |上“机”出发 开启一段奇妙之旅

       【基础篇】查找并输出子字符串的定位

        Stata中的小清新命令——添加观测值

        PCA(主成分分析法)降维——Python实现

       超好用的事件研究法

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

        Python 第六天——字符串

        findname——想要什么找什么

        Python字符串之“分分合合”

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

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

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

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

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

        Stata之post命令——数据邮递 

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

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

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

关于我们 


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

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



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

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

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


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

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