使用 Stata 绘制欧洲各国地图(带指北针和比例尺)

最近有小伙伴需要使用 Stata 绘制欧洲地图,不过 Stata 绘制地图的时候自带的指北针和比例尺很丑,所以我制作了一套使用 Stata 绘制欧洲各国地图的数据,分为两个版本,带比例尺和指北针的 & 不带的比例尺和指北针的:

带指北针和比例尺的

该套数据包含如下几个文件:

  1. Europe_db.dta:欧洲各国属性数据;
  2. Europe_coord.dta:底图矢量数据;
  3. Europe_label.dta:各国文本标签坐标数据;
  4. Europe_line_db.dta:边界线条属性数据;
  5. Europe_line_coord.dta:边界线条矢量数据(还有比例尺和指北针的线条);
  6. polygon.dta:比例尺和指北针中黑色区域的矢量数据。

使用这份数据绘制填充地图的代码如下:

cd "/Users/ac/Desktop/使用 Stata 绘制欧洲各国地图/含指北针和比例尺/"

*- 填充地图绘制
use Europe_db.dta, clear
*- 生成个随机变量
set seed 100
gen value = uniform() * 100
spmap value using Europe_coord, id(ID) ///
osize(vvthin ...) ocolor(white ...) ///
clmethod(custom) clbreaks(0 20 40 60 80 100) ///
fcolor("224 242 241" "178 223 219" "128 203 196" "77 182 172" "38 166 154") ///
graphr(margin(medium)) ///
polygon(data(polygon) fcolor(black) ///
osize(vvthin)) ///
label(data(Europe_label) x(X) y(Y) ///
label(country) length(20) size(*0.6)) ///
line(data(Europe_line_coord.dta) size(vthin ...) ///
pattern(solid ...) ///
color(black ...)) ///
leg(order(2 "0~20" 3 "20~40" 4 "40~60" 5 "60~80" 6 "80~100") ///
ring(1) pos(6) row(1))

gr export "pic1.png", width(2400) replace

绘制气泡地图,也就是在地图上添加散点,然后使用散点的大小表示值的大小。

data.csv 数据是全球 2016 年人口超过 100 万的大城市,ratio 变量是 2000~2016 年这些城市的人口增长率。

import delimited using "data.csv", clear

*- 转换坐标系(底图的 crs 是 "+proj=aea +lat_0=0 +lon_0=105 +lat_1=25 +lat_2=47 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs")
geo2xy lat lon, gen(lat1 lon1) projection(albers, 6378137 298.257223563 23 53 0 23) replace

*- 保留欧洲部分的
keep if inrange(lat1, 3447099, 7974770) & inrange(lon1, -2702645, 1600000)
destring, replace
save pointdata, replace

然后就可以把这个散点数据绘制到地图上了:

*- 绘制到地图上
use Europe_db.dta, clear
*- 生成个随机变量
set seed 100
gen value = uniform() * 100
spmap value using Europe_coord, id(ID) ///
osize(vvthin ...) ocolor(white ...) ///
clmethod(custom) clbreaks(0 20 40 60 80 100) ///
fcolor("224 242 241" "178 223 219" "128 203 196" "77 182 172" "38 166 154") ///
graphr(margin(medium)) ///
polygon(data(polygon) fcolor(black) ///
osize(vvthin)) ///
label(data(Europe_label) x(X) y(Y) ///
label(country) length(20) size(*0.6)) ///
line(data(Europe_line_coord.dta) size(vthin ...) ///
pattern(solid ...) ///
color(black ...)) ///
leg(order(2 "0~20" 3 "20~40" 4 "40~60" 5 "60~80" 6 "80~100") ///
ring(1) pos(6) row(1)) ///
point(data(pointdata) x(lon1) y(lat1) proportional(ratio) ///
shape(Oh ...) size(*0.4))
gr export "pic2.png", width(2400) replace

不带指北针和比例尺的

不带指北针和比例尺的数据使用方法类似:

use Europe2_db.dta, clear
*- 生成个随机变量
set seed 100
gen value = uniform() * 100
spmap value using Europe2_coord, id(ID) ///
osize(vvthin ...) ocolor(white ...) ///
clmethod(custom) clbreaks(0 20 40 60 80 100) ///
fcolor("224 242 241" "178 223 219" "128 203 196" "77 182 172" "38 166 154") ///
graphr(margin(medium)) ///
label(data(Europe2_label) x(X) y(Y) ///
label(country) length(20) size(*0.6)) ///
line(data(Europe2_line_coord.dta) size(vthin ...) ///
pattern(solid ...) ///
color(black ...)) ///
leg(order(2 "0~20" 3 "20~40" 4 "40~60" 5 "60~80" 6 "80~100") ///
ring(1) pos(6) row(1))

gr export "pic3.png", width(2400) replace

*- 添加散点
*- data.csv 数据是全球 2016 年人口超过 100 万的大城市,ratio 变量是 2000~2016 年这些城市的人口增长率
import delimited using "data.csv", clear

*- 转换坐标系(底图的 crs 是 "+proj=aea +lat_0=0 +lon_0=105 +lat_1=25 +lat_2=47 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs")
geo2xy lat lon, gen(lat1 lon1) projection(albers, 6378137 298.257223563 23 53 0 23) replace

*- 保留欧洲部分的
keep if inrange(lat1, 3447099, 7974770) & inrange(lon1, -2702645, 1600000)
destring, replace
save pointdata, replace

use Europe2_db.dta, clear

*- 生成个随机变量
set seed 100
gen value = uniform() * 100
spmap value using Europe2_coord, id(ID) ///
osize(vvthin ...) ocolor(white ...) ///
clmethod(custom) clbreaks(0 20 40 60 80 100) ///
fcolor("224 242 241" "178 223 219" "128 203 196" "77 182 172" "38 166 154") ///
graphr(margin(medium)) ///
label(data(Europe2_label) x(X) y(Y) ///
label(country) length(20) size(*0.6)) ///
line(data(Europe2_line_coord.dta) size(vthin ...) ///
pattern(solid ...) ///
color(black ...)) ///
leg(order(2 "0~20" 3 "20~40" 4 "40~60" 5 "60~80" 6 "80~100") ///
ring(1) pos(6) row(1)) ///
point(data(pointdata) x(lon1) y(lat1) proportional(ratio) ///
shape(Oh ...) size(*0.4))
gr export "pic4.png", width(2400) replace

点击这里跳转到 RStata 短书平台获取附件:使用 Stata 绘制欧洲各国地图(带指北针和比例尺)

评论