G7. 绘制中国地图
作者: 张弛 (中山大学)
邮箱: zhangch369@mail2.sysu.edu.cn
Source: 本文主体部分源自如下博客文章。需要说明的是,原文中使用的中国地图数据不准确,本文进行了核对和更新。
- Jamel Saadaoui, 2023, Drawing Maps for the Chinese regions with Stata [Updated with Geoplot], EconMacro Blog, -Link-
- Title: Stata 绘图:用
geoplot
绘制中国地图 - Keywords: shapefile, grmap, spshape2dta, shp2dta, geoframe, Natural Earth Data, GIS, 数据可视化
1. 绘制中国地图的步骤
1.1 下载地图并转换为 dta 文件
首先,用户需要自行找到中国地图的图形文件,使用 spshape2dta
将地图的图形文件分别转换为 dta 文件,这个命令是 Stata 自带的,无需另外安装。该命令的主要功能是把地图的图形文件转换为 dta 文件。最后会转换出两个 dta 文件,在后续绘图中都会用到。
replace // 转换省份边界文件 spshape2dta chinaprov,
若数据转换成功,会有如下输出:
replace
. spshape2dta chinaprov,
(importing .shp file)
(importing .dbf file)
(creating _ID spatial-unit id)
(creating _CX coordinate)
(creating _CY coordinate)
// 生成的两个新 dta 文件
file chinaprov_shp.dta created file chinaprov.dta created
类似命令还有 shp2dta
,其功能与 spshape2dta
基本类似,后文我们主要采用 spshape2dta
转换而成的数据。
using shpfilename, database(filename) coordinates(filename) shp2dta
其中,shpfilename
要求填写 shp 文件名,database(filename)
括号内指定新的 dBase 数据集的文件名,coordinates(filename)
括号内指定新坐标数据集的文件名。使用这个命令后,会分别生成 dBase 的 dta 文件和含有坐标的 dta 文件。
1.2 绘制出中国大陆省份
在开始绘图前,假设用户们已经使用 spshape2dta
转换好了地图文件。我们构造省份中文名称长度变量 length
,希望每个省份的颜色深浅与省份的名称长度呈现正相关关系。省份名称字数越多,颜色越深。
use "chinaprov2021long.dta" // 使用刚刚转换好,后缀没有 shp 的 dta 文件
gen length_e = length(province) // province 是数据集里面的省份名称变量,里面的名称是中文的省份全名
gen length = length_e / 3 // Stata 中,一个汉字占 3 个字节
order province length, first
接着,我们开始绘制地图。
// 启动空间数据可视化功能
grmap, activate
*注意,using 使用的 dta 文件是后缀有 shp 的文件*
grmap, activatelength using chinaprov2021long_shp.dta ///
grmap ///
, id(_ID) ///
fcolor(Blues) title("省份名称长度")
*保存图片为 png*graph rename Graph china_regions_grmap, replace
graph export china_regions_grmap_long.png, as(png) ///
width(4000) replace
输出的图片如下:
其中,grmap
这个命令的主要功能为可视化空间数据。它的基本语法是这样的:
*通用的基本命令*if] [in] [, basemap_options supplots]
grmap [attribute] [
*面板数据的命令*if] [in], t(#) [basemap_options supplots]
grmap [attribute] [// t(#) 为面板数据指定时间变量
在 basemap_options
里可以调整很多地图可视化的样式,例如背景色 mfcolor()
,背景边框色 mocolor()
,背景边框厚度 mosize()
,背景边框样式 mopattern()
,地图内颜色 fcolor()
,地图边框颜色 ocolor
等许多功能,具体可以使用 help
查找。
1.3 应用案例:中国各省份 GDP 数据
首先,我们需要下载中国省份分年度的 GDP 数据,可以前往 国家统计局 自行下载,我们采用 2022 年中国各省份 GDP 数据绘制地图。
clear all
// 和地图数据合并
use "chinaprov2021long.dta", replace
* 利用省份名称将 GDP 数据合并到地图文件中
* 在 GDP 数据中,用户需要将省份名称的变量名设置成
* 与地图文件中的省份名称变量相同的变量名merge 1:1 province using gdp_province.dta, nogenerate
preserve 和 restore 里的命令*
*绘图,运行 preserve
using chinaprov2021long_shp.dta ///
grmap gdp_yi ///
, id(_ID) title("2022年各省份GDP(单位:亿元)") ///
fcolor(Blues)
*保存图片*graph rename Graph gdp_grmap, replace
graph export gdp_grmap_long.png, as(png) ///
width(4000) replace
restore
图片输出如下:
2. geoplot
命令简介
Stata 中,geoplot
命令可以方便地利用图形文件和数据集绘制地图。运行这个命令,首先需要利用 geoframe
命令分别创建包含原始数据的地图框架。在这个命令的帮助下,我们可以将不同的地图叠成一个地图 (例如:岩石、道路、湖面、标志等)。并且,使用 geoplot
命令后,我们可以给地图上不同的要素设置不同的颜色、大小等。
geoplot
命令的好处主要有以下两点: - 可以用比较简单的方式,将许多层要素堆叠在一起,例如区域边界、点等。并且,合并图层命令理解起来比较简单。 - 便于使用区域、线条和标签子命令中的选项分别自定义区域的外观、边框和区域名称等。
要使用 Stata 绘制地图,我们需要确保 Stata 版本在 16.1 及以上。在开始绘制地图前,我们需要安装如下命令:
ssc install geoplot, replace
ssc install palettes, replace
ssc install colrspace, replace
ssc install moremata, replace
在 geoplot
开始使用前,我们需要使用 geoframe
创建不同的地图图层。geoframe
的使用方法如下,我们以 create
这个子选项为例子:
using] filename [, options ] geoframe create [frame] [
这个命令的意思是:将 filename
中的数据加载到一个名为 frame
的新帧中。其中 filename
是一个有效的 Stata 数据集,并声明我们创建的框架作为地理绘图框架。如果省略 frame
,则使用 filename
的基名作为该框架的名称。通常,filename
是由 geoframe translate
(或 spshape2dta
) 转化创建的 dta 文件。
后面的常用子选项有:id(varname)
为单元 id 的名称;coordinates(X Y [X2 Y2])
指定包含坐标的变量的名称;shpfile(spec)
指定与主文件一起加载的自定义形状文件。
geoplot
使用的基本格式如下:
geoplot (layer) [(layer) ...] [, global_options ]// layer: 图层,使用 geoframe 定义出来的图层名
不同的 [(layer)]
代表不同的图层叠加。layer
的使用格式如下:
(layertype [frame] [...] [, zvar_options other_options ])
layertype
选项指定图层的样式,有点、线、面等可供选择,具体取决于用户叠
加的图层是什么性质。后面可以指定图层的颜色、标记大小等。
2.1 geoplot
应用实例:GDP 图和省会点位图合并
首先,我们用 geoplot
先绘制出中国各省份 2022 年 GDP 图:
use "chinaprov2021long.dta"
// 创建一个含有 GDP 数据的中国地图 dta 文件
///
geoframe create province "chinaprov2021long.dta", id(_ID) centroids(_CX _CY) ///
///
shpfile(chinaprov2021long_shp.dta) replace
*合并 2022 年 GDP 数据*merge 1:1 province using "gdp_2022_ID.dta", nogen
*使用 geoplot 绘制省份 GDP 图*///
geoplot color(Blues) ///
(area province gdp_2022, level(3, quantile weight(gdp_2022)) ///
///
nolegend) line province, lwidth(vthin))
(
*保存图片*graph rename Graph geoplot_gdp, replace
graph export geoplot_gdp.png, as(png) ///
width(4000) replace
上述代码中主要选项的含义和作用如下:
(area province gdp_2022)
:为第一个图层,用于指定绘制各省份的区域图,province
是省份的变量,gdp_2022
是 GDP 数据变量。color(Blues)
:设置区域颜色使用蓝色渐变(Blues)调色板,表示 GDP 的大小,GDP 值较大的省份会显示为较深的蓝色。level(3, quantile weight(gdp_2022))
:指定颜色的分级方法为三分位(quantile),并使用gdp_2022
作为加权变量,确保根据 GDP 值对省份进行分级。
nolegend
:去除图例,避免显示颜色映射的解释。(line province)
:为第二个图层,用于绘制各省的边界线,province
为用于划定边界的变量。lwidth(vthin)
:设置边界线宽度为非常细(vthin
),使省份的边界线更细致,不会干扰区域颜色的显示。
输出效果为:
如果想要多个不同元素的地图合并为一个地图,geoplot
命令就可体现出其优势所在,只需要一个命令就可以叠加各个图层。假设我们获取了中国各个省省会的点图,并已经通过 spshape2dta
转换为相应的数据文件,即可通过这个命令在 GDP 地图中标注出各个省省会的位置。
use "capital_new.dta", clear // 使用省会的点位图数据,
// 这个数据已经从地图格式的文件转换为 dta 文件
// 使用省份名称合并中国地图边框文件
merge 1:1 province using "chinaprov2021long.dta", nogen
drop if province == ""
*第一个图层的地图框:省会点位*name ///
geoframe create "capital_new.dta", id(_ID) centroids(_CX _CY) ///
///
shpfile(capital_new_shp.dta) replace
*第二个图层的地图框:中国地图*///
geoframe create province "chinaprov2021long.dta", id(_ID) centroids(_CX _CY) ///
///
shpfile(chinaprov2021long_shp.dta) replace
*合并省份 GDP 数据*merge 1:1 province using "gdp_2022_ID.dta", nogen
*绘制地图*///
geoplot color(Blues) ///
(area province gdp_2022, level(3, quantile weight(gdp_2022)) ///
///
nolegend) line province) ///
(name, color(red)) ///
(point label province province if gdp_2022 > 50000 & gdp_2022 ~= . ///
(color(black) size(tiny))
,
*保存图片*graph rename gdp_capital_geoplot, replace
graph export gdp_capital_long.png, as(png) ///
width(4000) replace
在这里一共有四个图层,放置在四对 ()
中: - 第一层是 GDP 对应的颜色数据; - 第二层是省份边界数据; - 第三层是红色的省会位置点; - 第四层是标注出了 2022 年 GDP 大于 5 万亿的省份名称。
输出的图片如下:
3. 参考资料
- Jamel Saadaoui, 2023, Drawing Maps for the Chinese regions with Stata [Updated with Geoplot], EconMacro Blog, Link
- 公众号推文,RStata, 使用 Stata 绘制历年中国省级行政区划地图, Link
4. 相关推文
Note:产生如下推文列表的 Stata 命令为:
lianxh 地图
安装最新版lianxh
命令:
ssc install lianxh, replace
- 专题:Stata绘图
- 万莉, 2021, Stata绘图:世行可视化案例-条形图-密度函数图-地图-断点回归图-散点图, 连享会 No.560.
- 万莉, 2020, Stata:空间计量之用-spmap-绘制地图, 连享会 No.401.
- 冷萱, 2021, Stata:我和她离多远?基于百度地图API的地理距离计算, 连享会 No.509.
- 张弛, 2024, Stata 绘图:用 geoplot 绘制中国地图, 连享会 No.1401.
- 彭显耿, 2020, GIS地图制作栅格计算器的应用, 连享会 No.475.
- 浦进博, 2024, Stata地图:geoboundary-轻松获取全球地图数据, 连享会 No.1527.
- 浦进博, 邓铨雄, 2024, Stata绘图:地图神器geoplot, 连享会 No.1383.
- 王卓, 2022, Python:绘制动态地图-pyecharts, 连享会 No.922.
- 王卓, 2024, Stata绘图:政治关联可视化, 连享会 No.1428.
- 王卓, 2024, Stata绘图:政治关联可视化-B612, 连享会 No.1427.
- 肖蕊, 2022, Stata:地图绘制命令介绍-maptile, 连享会 No.925.
- 谢嘉伟, 2025, Stata 地图:cntraveltime-助你足不出户丈量中国, 连享会 No.1539.
- 谢嘉伟, 2025, Stata:更适合中国的坐标命令-cngcode-cnaddress, 连享会 No.1549.
- 陈卓然, 2022, Stata绘图:绘制二维地图和中国地图-geo2xy, 连享会 No.984.