查看原文
其他

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

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:邱   沣,河南大学经济学院

本文编辑:温和铭

技术总编:李婷婷

Stata&Python云端课程来啦!

       为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程Stata基础课程Stata进阶课程Stata文本分析正则表达式网络爬虫基本字符串课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~

导读
作为数据分析结果的一种展示,图形一直是Stata的强项,尤其是随着软件和命令包的更新,Stata作图能力逐步增强,输出图形的外观和选择也得以大大改进。但平常我们所看到的图形都是描述性统计一类的直方图、饼图、散点图等等。很少有人知道Stata还能画出很多有趣的图形,比如国旗
话不多说,我们先看图:

紧接着是我们使用 Stata 绘制的三哥国旗:

这样来看,还是非常神似的。

接下来我们就来看如何一步一步画出类似隔壁邻居家的国旗:

一、计算坐标

在这里,国旗的绘制过程需要注意两点:

  • 一是国旗的比例和尺寸。国旗的长宽比为3:2,在这里我们设置国旗的长为45个单位,宽为30个单位;
  • 二是国旗中间的车轮坐标。中心是(0,0),半径为4。
    首先我们绘制一个坐标轴。
#delimit ;twoway (pcarrowi -15 0 15 0 (8) "Y" 0 -22.5 0 22.5 (11) "X", headlabel lcolor(black)) // 绘制坐标轴 ,xsize(15) ysize(10) // 设置图形尺寸 xscale(off) yscale(off) // 不显坐标轴刻度 xlabel(-22.5(1)22.5, grid) ylabel(-15(1)15, grid ang(0)) // 设置坐标轴标签且带上网格xtitle("") ytitle("") // 不显示轴名称 legend(off) // 关闭图例 ;#delimit cr

接下来我们可以借助这个坐标图,来精准定位各个坐标点。其中#delimit ;为定义 ; 为换行分隔符,pcarrowi 命令用来绘制单向的箭头,后面跟着的是箭头的起点和终点的坐标,headlabel 指的是箭头标注在箭头的头部,而不是尾部。

基于坐标图,我们开始计算各个要素的坐标。

clearset obs 24gen l = .gen h = .gen _ID = .
**背景坐标replace l = -22.5 in 1replace h = 15 in 1replace l = 22.5 in 2replace h = 15 in 2replace l = 22.5 in 3replace h = 5 in 3replace l = -22.5 in 4replace h = 5 in 4replace l = -22.5 in 5replace h = 15 in 5replace _ID = 1 in 1/5
replace l = -22.5 in 6replace h = 5 in 6replace l = 22.5 in 7replace h = 5 in 7replace l = 22.5 in 8replace h = -5 in 8replace l = -22.5 in 9replace h = -5 in 9replace l = -22.5 in 10replace h = 5 in 10replace _ID = 2 in 6/10
replace l = -22.5 in 11replace h = -5 in 11replace l = 22.5 in 12replace h = -5 in 12replace l = 22.5 in 13replace h = -15 in 13replace l = -22.5 in 14replace h = -15 in 14replace l = -22.5 in 15replace h = -5 in 15replace _ID = 3 in 11/15
**车轮坐标gen theta = 2*_pi*_n/24gen x = 4*cos(theta)gen y = 4*sin(theta)gen x0 =0gen y0 =0gen x1 = x[_n-1]gen y1 = y[_n-1]replace x1 = x[24] if _n==1replace y1 = y[24] if _n==1

第2~5行,我们先设置观察值个数为24,然后生成变量l、h表示上述元素的坐标,_ID用来表示不同的元素,便于后续生成三种不同颜色的区域。

然后便是计算橙色背景的坐标。背景是一个矩形,共有4个顶点,要使其成为一个封闭图形,则需要5个点。第5个点和第1个点坐标要完全一致。我们将这个区域定义为1,方便后续上色。

随后的操作和上面类似,我们分别定义了白色和绿色背景的坐标,并分别将区域命名为2和3。

车轮的坐标就比较难计算了,首先我们先确定这个车轮有24个轮轴,借此生成24个等分的角,然后用cos(theta) 和sin(theta) 计算出x、y,因为半径为4,所以又乘以4,最后再生成原点坐标 的滞后一期的坐标 ,我们将()和(, )连接起来,便形成了一个完整的车轮。而轮轴则是将(, )和()连接起来即可绘制出来。
二、绘制国旗

下面我们将使用twoway areapcarrow绘制国旗。

twoway area 是带有区域阴影的双向线图,简单来说就是可以在两条线段之间的区域涂上颜色。

pcarrow绘制带有箭头的成对坐标图,它可以为数据集中的每个观察值绘制箭头。箭头从坐标(y1var,x1var)开始,在坐标(y2var,x2var)结束,并在结束坐标绘制一个箭头。用法类似于我们之间推文中介绍过的pcarrowi,只不过前者是对变量使用,后者针对于一个个的具体坐标值,比如 twoway pcarrow y1 x1 y2 x2 和 twoway pcarrowi 2  1  3  2  (6) "爬虫俱乐部"
pcarrow使用规范如下:
Directional arrowstwoway pcarrow y1var x1var y2var x2var [if] [in] [, options]
其中 y1var x1var y2var x2var 分别是数据中定义的变量,当作箭头的起点和终点的坐标,之后可以添加的选项具体可见《如何用Stata绘制带指向性箭头标注的图像》这篇推文。

了解了这些命令以后,我们先来绘制三哥家国旗的背景。

#delimit ;twoway (area h l if _ID==1, color(orange))(area h l if _ID==2, color(white)) (area h l if _ID==3, color(green)) ,aspect(1) legend(off) plotregion(margin(vlarge)) xtitle("") ytitle("") ;#delimit cr*设置区域为1的涂成橙色,区域为2的涂成白色,区域为3的涂成绿色

其中aspect(1) 为设置绘图区域纵横比,plotregion为设置绘图边缘大小。
接下来我们根据前文程序中计算出来的车轮坐标来画车轮:
twoway (pcarrow y0 x0 y x ,mcolor("0 47 167") lc("0 47 167") lw(medthick)mlwidth (medthick) barbsize (vhuge) mangle (80)) /// (pcarrow y x y1 x1,mcolor("0 47 167") lc("0 47 167") lw(thick)mlwidth (thin) barbsize (small) mangle (0)),aspect(1) plotregion(margin(vlarge)) xsize(22.5) ysize(15) legend(off) xtitle("") ytitle("")

坐标的生成前面已经介绍过了,其中 mcolor() 设置箭头的颜色和不透明度,包含内外,lc(lcolor) 设置箭柱的颜色和不透明度,"0  47  167" 为颜色的RGB值,mlwidthlw(lwidth) 设置箭头和箭柱的粗细,barbsize设置箭头填充部分的大小,mangle() 设置箭头的角度(箭头内角的大小)。

这里我们为了让车轮更接近原图,我们让箭头变小,变平(角度变大即可),但轮廓线都变粗,根据需要再设置箭头填充部分的大小,内部的大,外围的小。

最后我们将两个图形画在一起:

#delimit ;twoway (area h l if _ID==1, color(orange))(area h l if _ID==2, color(white)) (area h l if _ID==3, color(green))(pcarrow y0 x0 y x ,mcolor("0 47 167") lc("0 47 167") lw(medthick)mlwidth (medthick) barbsize (vhuge) mangle (80)) (pcarrow y x y1 x1,mcolor("0 47 167") lc("0 47 167") lw(medthick)mlwidth (thin) barbsize (small) mangle (0)),aspect(1) plotregion(margin(vlarge)) xsize(22.5) ysize(15) legend(off) xtitle("") ytitle("") ;#delimit cr


由此我们看到了Stata绘图功能的强大和完备,不仅有着完善的基础功能,对于各种“异想天开”的要求也都能很好地满足,当然这里只是简单还原了一下隔壁邻居家的国旗,Stata还有更多更有趣的绘图方法和命令等着我们去挖掘。欢迎大家和我们一起学习和补充。
END

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


腾讯课堂课程二维码








            


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











往期推文推荐
        Python基础——三大数字类型,你都了解吗?
        如何用Stata绘制带指向性箭头标注的图像       
        Seminar丨荐仆贷款——19世纪中国的信任辅助贷款

       【技能篇】多进程队列间通信

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

        正则表达式--懒惰模式

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

正则表达式--贪婪模式

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

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

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

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

线性同余法生成伪随机数 

[技能篇]多线程爬虫

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

Stata&Python云端课程来啦!

带你了解Stata中的矩阵

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

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

Seminar|媒体关联董事对融资和外部治理的影响神奇的组内交叉合并 PDF分章节转TXT并实现可视化——以胡景北知青日记1971至1978年为例

万物皆可开——shellout妙用

无处不在的系列配置项|从零开始的Pyecharts(三)

使用Python制作自动聊天机器人  

fillin一下,平衡回来~

order命令——快速改变变量顺序的利器 Ajax应用场景——以获取雪球网港股代码及公司名称为例

播放列表中的歌单排行 

关于我们 


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

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



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

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

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





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

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