实时疫情与 Stata 地图绘制

实时疫情与 Stata 地图绘制

之前一直是用 R 语言绘制新冠病毒肺炎疫情发展的地域分布图,今天我们用 Stata 试试!

首先可以从知识星球下载本文代码运行所需要的附件。里面包含了中国地图、世界地图、疫情省份分布、疫情世界分布的数据。地图数据我提供了 GEOJSON 格式的和 SHP 格式的,Stata 可以使用 shp2dta 命令转换 SHP 格式的数据。下面我们首先绘制疫情的省份分布地图:

地图数据转换

首先可以从 SHP 文件生成标签数据和坐标系数据:

1
2
3
4
5
clear all
/* 设定工作目录 */
cd "~/Desktop/Stata绘制地图/"
shp2dta using chinamap/china, database(cndb) coordinates(cncoord) genid(ID) replace
shp2dta using worldmap/world, database(worlddb) coordinates(worldcoord) genid(ID) replace

中国地图

我提供的省份数据是 csv 文件,UTF-8 编码,先把 csv 文件保存为 dta 文件:

1
2
3
/* 当前省份数据 */
import delimited using "省份分布.csv", clear encoding(utf8)
save "省份分布.dta", replace

下面我们把地图数据和疫情数据合并绘制地图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 把中国地图数据和省份分布数据合并 */
use cndb, clear
local times "截至 2 月 14 日 11 时 00 分"
merge m:1 name using "省份分布.dta"
replace value = 0 if value == .
spmap value using cncoord, id(ID) ///
fcolor("68 1 84" "65 68 135" "42 120 142" "34 168 132" ///
"122 209 81" "253 231 37") ///
ocolor("white" ...) ///
clmethod(custom) clbreaks(0 0.9 9.9 99 999 9999 99999) ///
ti(新型冠状病毒肺炎疫情分布, size(*1.2) color(white)) ///
graphr(margin(medium)) ///
subti(`times', color(white)) ///
osize(vthin ...) ///
legend(size(*1.3) ///
order(2 "无" 3 "1~9 人" 4 "10~99 人" 5 "100~999 人" 6 "1000~9999人" 7 ">= 10000 人") ///
ti(确诊, size(*0.5) pos(11) color(white)) color(white)) ///
plotr(fcolor(24 24 24) lcolor(24 24 24)) ///
graphr(fcolor(24 24 24) lcolor(24 24 24))

gr export "省份分布.png", replace

世界分布

我提供的世界地图是一份带九段线的世界地图,为了把世界地图数据和疫情分布数据合并,我们还需要一份各国国籍代码数据。因为世界地图中的国家名称是英文的,疫情分布数据里面的国家名称是中文的,不过世界地图数据里面还有各国国家的三位 ISO 代码,所以我找了一份各国国籍代码数据作为中介数据进行匹配:

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
/* 世界疫情分布数据 */
import delimited using "世界分布.csv", clear encoding(utf8)
save "世界分布.dta", replace

/* 各国国籍代码 */
import excel using "各国国籍代码.xls", clear
drop in 1/5
nrow 1
compress
ren 代码 id
ren 内容 name
keep id name
save country_code, replace

/* 把世界地图数据和世界分布数据合并 */
use worlddb, clear
ren name enname
* 先使用 id 变量把该数据集和 country_code 数据集合并
merge m:1 id using country_code
drop _m
* 再使用 name 变量把合并后的数据集再和 世界分布.dta 数据集合并
merge m:1 name using "世界分布.dta"
replace value = 0 if missing(value)
* 绘制地图
spmap value using worldcoord, id(ID) ///
fcolor("68 1 84" "65 68 135" "42 120 142" "34 168 132" ///
"122 209 81" "253 231 37") ///
ocolor("white" ...) ///
clmethod(custom) clbreaks(0 0.9 9 99 999 9999 99999) ///
ti(新型冠状病毒肺炎疫情分布, size(*1.2) color(white)) ///
graphr(margin(medium)) ///
subti(`times', color(white)) ///
osize(vthin ...) ///
legend(size(*1.5) ///
order(2 "无" 3 "1~9 人" 4 "10~99 人" 5 "100~999 人" 6 "1000~9999人" 7 ">= 10000 人") ///
ti(确诊, size(*0.5) pos(11) color(white)) color(white)) ///
plotr(fcolor(24 24 24) lcolor(24 24 24)) ///
graphr(fcolor(24 24 24) lcolor(24 24 24))
gr export "世界分布.png", replace

  • 知识星球附件链接:该附件无法通过知识星球的审核,可以添加我的微信索要或者通过下面的面包多链接购买;
  • 单独购买链接:https://mianbaoduo.com/o/bread/Ypeampg=
# Stata

评论

Your browser is out-of-date!

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

×