使用 Stata 绘制中国地图+台风路径(线条+箭头)

之前给大家分享过使用 Stata 绘制中国地图的课程和数据资料:

使用 Stata 绘制地图课程汇总:https://mp.weixin.qq.com/s/wCVsicJaq-lXzrQmCRKXgQ

其中强烈建议学习这个课程:使用 Stata 绘制历年中国市级行政区划(小地图版本 + 长版):https://rstata.duanshu.com/#/brief/course/0e9d78633ae64fefa684d6aad89633bc

前不久也给大家分享了台风路径数据:

在数据介绍中我绘制了这么一幅图:

今天的课程中我们将分享这幅图的绘制方法。

首先是绘制各区县台风过境次数:

clear all
use "1949~2024年各区县每天是否有台风(有台风的天).dta", clear
gen year = yofd(日期)
collapse (sum) 是否有台风, by(省 省代码 市 市代码 县 县代码 year)
keep if year == 2024
merge 1:1 省 省代码 市 市代码 县 县代码 using chinacounty2021mini_db.dta
replace 是否有台风 = 0 if mi(是否有台风)
drop _m

grmap 是否有台风 using chinacounty2021mini_coord.dta, ///
id(ID) osize(vvthin ...) ocolor(white ...) ///
clmethod(unique) ///
fcolor("242 240 247" "203 201 226" ///
"158 154 200" "106 81 163") ///
graphr(margin(medium)) ///
leg(order(`r(legorder)')) ///
line(data(chinaprov2021mini_line_coord2.dta) by(group) ///
size(vvthin *1 *0.5 *0.5 *0.5) pattern(solid ...) ///
select(drop if inlist(group, 4, 7)) ///
color(gs20 /// 省界颜色
black /// 国界线颜色
"0 85 170" /// 海岸线颜色
black /// 小地图框格颜色
black /// 比例尺和指北针颜色
)) ///
polygon(data(polygon2) fcolor(black) ///
osize(vvthin)) ///
label(data(chinacounty2021mini_label2) x(X) y(Y) label(cname) length(20) size(*0.8)) ///
ti("2024年各区县台风(热带气旋)过境天数") ///
subti("数据整理 & 绘制:微信公众号 RStata") ///
caption("数据来源:中国气象局热带气旋资料中心" "<https://tcdata.typhoon.org.cn/zjljsjj.html>", size(*0.8))

gr export "2024年各区县台风(热带气旋)过境天数.png", replace width(2400)

这部分代码学习上面的课程就可以理解了。

由于现有的代码已经使用了 line 数据,也就是 chinaprov2021mini_line_coord2.dta 数据,所以如果还想添加台风路径线条,就需要把台风路径的线条数据和该数据合并。

先把台风路径的 shp 文件转换成 dta 文件:

shp2dta using "台风分日期路径/line.shp", database(tfline_db) coord(tfline_coord) replace

这里我们截取 2024 年以来的数据:

use tfline_db, clear
keep if date >= 20240101
keep _ID
joinby _ID using tfline_coord
keep if inrange(_X, -180, 180) | mi(_X)

由于使用的地图底图是 aea 坐标系,所以这里我们也需要把台风路径的数据也转换成和底图相同的坐标系:

geo2xy _Y _X, gen(y x) projection(albers, 6378137 298.257223563 25 47 0 105) replace
drop _Y _X
ren (y x) (_Y _X)

*- 保留中国周边的(这个范围就是中国地图主图的坐标范围)
keep if (inrange(_X, -2625586, 2206965) & inrange(_Y, 1836814.1, 5921583)) | mi(_X)
save 2024tfline_coord, replace

台风路径的最后两个点可以用来构造箭头:

use 2024tfline_coord, clear
bysort _ID: keep if _n == _N | _n == _N - 1
drop if mi(_X)
bysort _ID: gen order = _n
gather _X _Y
tostring order, replace
replace var = var + order
drop order
spread var value
save 2024arrow, replace

箭头数据的格式是这样的:

list in 1/10

*> +-------------------------------------------------------+
*> | _ID _X1 _X2 _Y1 _Y2 |
*> |-------------------------------------------------------|
*> 1. | 18804 2012746.9 2074545.5 1840813.5 1928910.8 |
*> 2. | 18805 2126568.9 2183960.5 2004878.6 2104597 |
*> 3. | 18811 759256.16 757734.94 1885722.1 1907261.7 |
*> 4. | 18812 685930.26 683071.68 2174476 2218075.4 |
*> 5. | 18813 866485.23 953791.25 2540490.9 2592759.1 |
*> |-------------------------------------------------------|
*> 6. | 18814 1193659.1 1227891 2640711.9 2611436.2 |
*> 7. | 18821 2183960.5 . 2104597 . |
*> 8. | 18822 2102173.1 2022566.5 2342652.3 2471601.2 |
*> 9. | 18823 1703833.2 1714694.1 2602877.1 2660714.3 |
*> 10. | 18824 1427029.5 1407064.9 2727280.2 2724425.5 |
*> +-------------------------------------------------------+

在原有线条数据 chinaprov2021mini_line_coord2.dta 里面,group 变量用以对线条数据分组,取值为 1-7。合并台风路径后可以把台风路径设置为 group = 8:

use chinaprov2021mini_line_coord2.dta, clear
append using 2024tfline_coord
replace group = 8 if mi(group)
save mylinecoord, replace

然后就可以在地图上添加台风路径和方向箭头了:

use "1949~2024年各区县每天是否有台风(有台风的天).dta", clear
gen year = yofd(日期)
collapse (sum) 是否有台风, by(省 省代码 市 市代码 县 县代码 year)
keep if year == 2024
merge 1:1 省 省代码 市 市代码 县 县代码 using chinacounty2021mini_db.dta
replace 是否有台风 = 0 if mi(是否有台风)
drop _m

*- 此处代码需下载讲义材料查看

gr export "2024年我国周边台风(热带气旋)路径.png", replace width(2400)

这样就搞定了这个图。

点击这里跳转到 RStata 短书平台获取附件:使用 Stata 绘制中国地图+台风路径(线条+箭头)

评论