暨南大学所有大陆学生的家乡分布图绘制

暨南大学所有大陆学生的家乡分布图绘制

这篇博客介绍了如何使用昨天获得的暨大所有学生的身份信息绘制大家的分布图。
点击下面的链接耐心等待片刻即可浏览最终绘制的图:
暨大大陆学生分布图.html

封面上的图是使用Stata+AmCharts绘制的,下面将介绍如何绘制这幅图。

从身份证号码到家乡的位置

cuse数据库的介绍

这个数据库是为了存放我的常用数据集而编写的一套Stata命令,同时里面还存放里一些常用数据集,这个数据库的安装方法为:

1
github install czxa/cuse, replace

数据库的主页是cuse,欢迎大家fork然后修改成自己的。
这个数据库主要有三个命令,cuse调用数据集,cuselist显示当前数据仓库中的已有数据集(记得经常更新)。我还为这个数据库编写了一个GUI界面,运行db cuse即可打开。
cuse的用法在cuse上有详细的介绍,cuselist可以直接运行列示所有的数据集,db cuse可以打开下面的这个对话框(这个在Stata中是使用dlg编写的)。

使用chinagcode命令产生经纬度数据

  • 首先需要生成一份全国各区县的经纬度坐标的数据集
  • 在我的cuse数据库里面有一个countycode数据是全国每个县的身份证前六位是什么的,下面就可以这个数据为基础再计算每个县的经纬度坐标。chinagcode命令需要百度密钥,可以到百度地图注册一个自己的,也可以暂时用我的,但是注意不要滥用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cuse countycode, c w
chinagcode, baidukey(tXvh2UTmo4z0zq5t41XLPTm1kQbMHjYl) province(province) district(county_name)
save countycode_jwd, replace

use 暨南大学学生信息表.dta, clear
gen county_code = substr(身份证号, 1, 6)
* 只看大陆学生的
drop if length(身份证号) < 18
destring, replace
merge m:1 county_code using countycode_jwd
compress
drop if 学号 == .
keep if _m == 3
drop _m
format 姓名 %15s
replace 年级 = subinstr(年级, "年级", "", .)
destring, replace
gen 专业 = ustrregexs(0) if ustrregexm(行政班级, "[\u4e00-\u9fa5]+")
save 暨南大学大陆学生生源地信息表, replace

上面用到了正则表达式提取汉字。
这样我们就确定每个暨南大学大陆学生的家乡位置。下面我们开始绘制一张中国地图把它们都标注出来。

使用AmCharts绘制地图

AmCharts是一个JavaScript图表库,虽然之前我更多是ECharts,但是后来发现AmCharts的图表更加惊艳,所以今天就用AmCharts了,也是我第一次用AmCharts。
Stata+AmCharts绘图同样需要使用我自己编写的fw 命令,关于这个命令的介绍可以查看这个命令的主页fw,虽然这个命令是为ECharts写的,但是用这里也是完全OK的,下面的程序最终会生成一个html文件,如下:

暨大大陆学生分布图.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use 暨南大学大陆学生生源地信息表, clear
fw, s h(暨大大陆学生分布图)
fw `"<meta http-equiv="content-type" content="text/html;charset=utf-8">"'
fw `"<style>"'
fw `"body { background-color: #3f3e3b; color: #fff; }"'
fw `"#chartdiv {"'
fw `" width: 100%;"'
fw `" height: 100%;"'
fw `"}"'
fw `"</style>"'
fw `"<script src="./ajs/ammap.js"></script>"'
fw `"<script src="./ajs/chinaLow.js"></script>"'
fw `"<script src="./ajs/export.min.js"></script>"'
fw `"<link rel="stylesheet" href="./ajs/export.css" type="text/css" media="all" />"'
fw `"<script src="./ajs/chalk.js"></script>"'
fw `"<script>"'
fw `"var targetSVG = "M9,0C4.029,0,0,4.029,0,9s4.029,9,9,9s9-4.029,9-9S13.971,0,9,0z M9,15.93 c-3.83,0-6.93-3.1-6.93-6.93S5.17,2.07,9,2.07s6.93,3.1,6.93,6.93S12.83,15.93,9,15.93 M12.5,9c0,1.933-1.567,3.5-3.5,3.5S5.5,10.933,5.5,9S7.067,5.5,9,5.5 S12.5,7.067,12.5,9z";"'
fw `"var map = AmCharts.makeChart( "chartdiv", {"'
fw `" "type": "map","'
fw `" "projection": "mercator","'
fw `" "theme": "chalk","'
fw `" "imagesSettings": {"'
fw `" "rollOverColor": "#089282","'
fw `" "rollOverScale": 3,"'
fw `" "selectedScale": 3,"'
fw `" "selectedColor": "#089282","'
fw `" "color": "#13564e""'
fw `" },"'
fw `" "areasSettings": {"'
fw `" "unlistedAreasColor": "#fff","'
fw `" "outlineThickness": 0.2"'
fw `" },"'
fw `" "dataProvider": {"'
fw `" "map": "chinaLow","'
fw `" "images": [ "'
forval i = 1/`=_N'{
fw `"{ "svgPath": targetSVG, "zoomLevel": 5, "scale": 0.5, "title": "姓名:`=姓名[`i']' <br> 性别:`=性别[`i']' <br> 专业:`=专业[`i']' <br> 地址:`=province[`i']'`=county_name[`i']'", "latitude": `=latitude[`i']', "longitude": `=longitude[`i']'},"'
}
fw `" ]"'
fw `" },"'
fw `" "export": {"'
fw `" "enabled": true"'
fw `" }"'
fw `"} );"'
fw `"</script>"'
fw `"<div id="chartdiv"></div>"'
fw, e

然后打开html文件就能得到封面图片了!

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×