使用 Stata 绘制河南省区县地图

今天给大家分享一份使用 Stata 绘制河南省区县地图的数据和方法。

首先需要准备我特别设计的河南地图数据(包含指北针和比例尺):

  • henanmap 文件夹:地理矢量数据;
  • labeldf.dta 数据:文本标签位置数据;

这份数据是使用 R 语言设计的,感兴趣的小伙伴可以参考附件中的 main.R 文件。

下面我们看一下如何在 Stata 中绘制河南区县地图。

首先把 shp 文件转换成 dta 文件:

*- 把 shp 文件转换成 dta 文件
local name = "henanmap"
shp2dta using `name'/`name', database(`name'_db) coordinates(`name'_coord) genid(ID) gencentroids(centroids) replace
shp2dta using `name'/`name'_line, database(`name'_line_db) coordinates(`name'_line_coord) genid(ID) gencentroids(centroids) replace

这样就会得到四个文件:

  • henanmap_db.dta
  • henanmap_coord.dta
  • henanmap_line_db.dta
  • henanmap_line_coord.dta

其中前两个是底图的属性数据和坐标系数据,后面两个是线条的。

下面还需要对数据进行下调整。

首先是删除底图上的比例尺和指北针数据,因为这两个元素计划使用线条和多边形选项绘制:

use henanmap_db.dta, clear
*- 删除比例尺和指北针
drop if index(县, "_")
save henanmap_db.dta, replace

再创建比例尺和指北针的多边形数据:

use henanmap_coord.dta, clear
*- 保留指北针和比例尺对应的观测值
keep if _ID > 158
gen value = 1
save henanmap_polyon, replace

再对线条进行分组:

*- 线条
use henanmap_line_db.dta, clear
*- 分组
gen group = 1 // 区县边界
replace group = 2 if index(市, "边界") // 市边界
replace group = 3 if index(省, "边界") // 省边界
replace group = 4 if index(省, "_") // 指北针和比例尺的线条
keep ID group
ren ID _ID
save temp, replace

use henanmap_line_coord.dta, clear
merge m:1 _ID using temp
drop _m
save henanmap_line_coord, replace

这里我把线条分为四类:

  1. 区县边界;
  2. 城市边界;
  3. 省份边界;
  4. 比例尺和指北针的线条。

后面的代码中也会根据不同的线条类型使用不同的颜色和粗细。

统计 2021 年每个区县的年均 PM2.5 浓度:

import excel using "1998~2021年中国各区县PM2_5面板数据.xlsx", clear first
keep if inlist(省, "河南省") & 年份 == 2021
drop 年份 sum min max sd
ren mean PM2_5
keep 县代码 PM2_5
save "PM2_5", replace

标签数据也需要处理下:

use labeldf.dta, clear
encode class, gen(classnum)
save labeldf2, replace
codebook classnum

然后就可以绘制地图了:

use henanmap_db.dta, clear
merge 1:1 县代码 using PM2_5
drop if _m == 2
drop _m

*- 缺失值替换成 -1
replace PM2_5 = -1 if mi(PM2_5)

hist PM2_5
grmap PM2_5 using henanmap_coord.dta, ///
id(ID) osize(vvvthin ...) ocolor(white ...) ///
clmethod(custom) clbreaks(-1 0 10 20 30 40 50 60) ///
fcolor("gs12" "237 231 246" "209 196 233" "179 157 219" "149 117 205" "126 87 194" "103 58 183") ///
graphr(margin(medium)) ///
line(data(henanmap_line_coord.dta) by(group) ///
size(vvvthin *0.7 *1.2 *0.5) pattern(solid ...) ///
color("247 247 247" "150 150 150" black black)) ///
polygon(data(henanmap_polyon.dta) by(value) ///
osize(vvvthin ...) ocolor(black ...) ///
fcolor(black ...)) ///
label(data(labeldf2.dta) x(X) y(Y) ///
select(keep if inlist(class, "指北针标签", ///
"比例尺标签", "城市标签")) ///
by(classnum) ///
color("gs3" "black") ///
size(*0.8 *0.7) ///
label(cname) length(40 ...)) ///
ti("2021 年河南各区县年均 PM2.5 浓度", size(*1)) ///
subti("数据处理&绘制:微信公众号 RStata,单位:µg/m{sup:3}", size(*1)) ///
caption("数据来源:华盛顿大学路易斯分校", size(*0.7)) ///
leg(order(2 "无数据" 3 "0~10" 4 "10~20" 5 "20~30" 6 "30~40" ///
7 "40~50" 8 ">50") row(1) pos(6) ring(1))

点击这里跳转到 RStata 短书平台获取附件:使用 Stata 绘制河南省区县地图

评论