G7. 绘制中国地图

作者: 张弛 (中山大学)
邮箱:

Source: 本文主体部分源自如下博客文章。需要说明的是,原文中使用的中国地图数据不准确,本文进行了核对和更新。

  • Jamel Saadaoui, 2023, Drawing Maps for the Chinese regions with Stata [Updated with Geoplot], EconMacro Blog, -Link-

1. 绘制中国地图的步骤

1.1 下载地图并转换为 dta 文件

首先,用户需要自行找到中国地图的图形文件,使用 spshape2dta 将地图的图形文件分别转换为 dta 文件,这个命令是 Stata 自带的,无需另外安装。该命令的主要功能是把地图的图形文件转换为 dta 文件。最后会转换出两个 dta 文件,在后续绘图中都会用到。

spshape2dta chinaprov, replace  // 转换省份边界文件

若数据转换成功,会有如下输出:

. spshape2dta chinaprov, replace 

  (importing .shp file)
  (importing .dbf file)
  (creating _ID spatial-unit id)
  (creating _CX coordinate)
  (creating _CY coordinate)

  file chinaprov_shp.dta created   // 生成的两个新 dta 文件
  file chinaprov.dta     created

类似命令还有 shp2dta ,其功能与 spshape2dta 基本类似,后文我们主要采用 spshape2dta 转换而成的数据。

shp2dta using shpfilename, database(filename) coordinates(filename) 

其中,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, activate
grmap length using chinaprov2021long_shp.dta ///
 , 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 这个命令的主要功能为可视化空间数据。它的基本语法是这样的:

*通用的基本命令*
grmap [attribute] [if] [in] [, basemap_options supplots]  
*面板数据的命令*
grmap [attribute] [if] [in], t(#) [basemap_options supplots]
// 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 

*绘图,运行 preserverestore 里的命令*
preserve
grmap gdp_yi using chinaprov2021long_shp.dta ///
 , 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 这个子选项为例子:

geoframe create [frame] [using] filename [, options ]

这个命令的意思是:将 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 ///
 (area province gdp_2022, color(Blues) ///
    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 == ""

*第一个图层的地图框:省会点位*
geoframe create name ///
 "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 ///
 (area province gdp_2022, color(Blues) ///
    level(3, quantile weight(gdp_2022)) ///
    nolegend) ///
 (line province) ///
 (point name, color(red)) ///
 (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