一、数据准备
1.获取地理数据
中国各省数据
a. 来源:可以从多种来源获取中国省级行政区划的地理数据,如自然资源部、国家基础地理信息中心等官方网站。
b. 格式:通常以 Shapefile (.shp) 格式提供,也可以是 GeoJSON
或其他矢量格式。
c. R 包:可以使用 rnaturalearth
包中的高分辨率地图数据,或者从其他数据源下载并转换为 R
可用的格式(如 sf 对象)。
\# 安装必要的包
\# install.packages(\"rnaturalearth\")
\# install.packages(\"rnaturalearthdata\")
\# 加载包
library(rnaturalearth)
library(rnaturalearthdata)
library(rnaturalearthhires)
\# 获取中国省级边界数据
china_map \<- ne_states(country = \"China\", returnclass = \"sf\")
中国湖泊水系数据
a. 来源:可以从中国科学院资源环境科学数据中心或其他地理信息数据提供商获取。
b. 格式:通常也是 Shapefile 或 GeoJSON 格式。
c. 处理:需要将数据读入 R 并转换为 sf 对象。
# 假设你已经下载了湖泊数据并保存为 lakes.shp
lakes <- st_read(“path/to/lakes.shp”)
中国九段线数据
a. 来源:可以从公开的数据集或政府网站获取。
b. 格式:通常是 Shapefile 或其他矢量格式。
c. 处理:同样需要读入 R 并转换为 sf 对象。
# 假设你已经下载了九段线数据并保存为 nine_dotted_line.shp
nine_dotted_line <- st_read(“path/to/nine_dotted_line.shp”)
中国海岸线数据
a. 来源:可以从公开的数据集或政府网站获取。
b. 格式:通常是 Shapefile 或其他矢量格式。
c. 处理:同样需要读入 R 并转换为 sf 对象。
# 假设你已经下载了海岸线数据并保存为 coastline.shp
coastline <- st_read(“path/to/coastline.shp”)
2.数据下载
DATAV.GeoAltas
http://datav.aliyun.com/portal/school/atlas/area_selector
该平台下载的数据最多能提供市内区、县边界图
AntV L7
可以在该网站下载json格式的地图数据,包括省市县三级的数据以及国界线、海南线等等。
https://l7.antv.antgroup.com/custom/tools/map
二、地图绘制
1.Hchinamap
hchinamap
是一个R语言包,它结合了highcharter包来创建中国及其省份、直辖市和自治区的地图可视化。这个包简化了使用Highmaps(Highcharts的一个模块)来绘制中国地理数据的过程。通过hchinamap,用户可以轻松地将中国的行政区划边界集成到他们的R代码中,从而生成交互式的地图图表。
Usage
hchinamap(name, value, region = \"China\", width = NULL, height = NULL,
elementId = NULL, itermName = \"Random data\", title = \"\",
titleAlign = \"center\", titleSize = \"20px\", titleColor = \"#333333\",
subtitle = \"\", subtitleAlign = \"center\", subtitleSize = \"\",
subtitleColor = \"#666666\", min = 0, minColor = \"rgb(255,255,255)\",
maxColor = \"#006cee\", legendLayout = \"horizontal\",
legendAlign = \"center\", legendTitle = \"\",
legendVerticalAlign = \"bottom\", hoverColor = \"#a4edba\",
theme = \"sunset\")
参数名称 | 描述 |
---|---|
name | 指定数据框中包含地理区域名称(如省份、直辖市等)的列名。这些名称需要与地图上的区域标识相匹配。 |
value | 指定数据框中包含与name中指定地区相对应数值的列名。这些数值用于确定地图上各个地区的颜色深浅。 |
region | 指定要绘制的地图区域,默认为"China",代表整个中国。如果希望绘制特定省份或更小级别的地图,可以更改此参数。 |
width | 设置生成的地图图表的宽度。如果不指定,则使用默认尺寸。 |
height | 设置生成的地图图表的高度。如果不指定,则使用默认尺寸。 |
elementId | 为Highcharts容器设置HTML元素ID。如果未提供,将自动创建一个。 |
itermName | 如果没有提供实际的数据,这个参数可以用来指定图例中显示的示例数据项的名字,默认是"Random data"。 |
title | 地图标题文本。 |
titleAlign | 标题对齐方式,可以是"left", “center”, 或 “right”。 |
titleSize | 标题字体大小,例如"20px"。 |
titleColor | 标题文字颜色,例如"#333333"。 |
subtitle | 地图副标题文本。 |
subtitleAlign | 副标题对齐方式,同titleAlign。 |
subtitleSize | 副标题字体大小,格式同titleSize。 |
subtitleColor | 副标题文字颜色,格式同titleColor。 |
min | 定义颜色范围的最小值。 |
minColor | 最低值的颜色,默认为白色。 |
maxColor | 最高值的颜色,默认为蓝色。 |
legendLayout | 图例布局方式,可以是"horizontal"或"vertical"。 |
legendAlign | 图例水平对齐方式,可以是"left", “center”, 或 “right”。 |
legendTitle | 图例标题文本。 |
legendVerticalAlign | 图例垂直对齐方式,可以是"top", “middle”, 或 “bottom”。 |
hoverColor | 当鼠标悬停在某个区域时,该区域的颜色。 |
(1)全国地图
\# 加载必要的库
library(hchinamap)
\# 创建数据框
province \<- c(\"上海\", \"江苏\", \"浙江\", \"湖北\", \"北京\",
\"天津\", \"广东\")
population \<- c(12, 12, 8, 15, 9, 4, 6)
df \<- data.frame(province = province, population = population)
\# 定义颜色
\# 设置最小值的颜色为黄色
minColor \<- \"#FFFF00\" \# 黄色
\# 设置最大值的颜色为红色
maxColor \<- \"#FF0000\" \# 红色
\# 绘制地图,并设置颜色和其他参数
map \<- hchinamap(name = df\$province, value = df\$population,
width = \"1000px\", height = \"500px\",
title = \"Map of China\", region = \"China\",
minColor = minColor, maxColor = maxColor, \# 设置颜色
theme = \"sunset\") \# 使用预设的主题
这个图是可交互的,鼠标移动每个地区上方,就可以显示相应的值
鼠标滚轮或者点击左边的"+ -"符号,可以对地图进行放大缩小。
按住鼠标左键,可以对地图进行拖动
(2)市级地图
把region的改成相应的省份,再输入相应的市名
\# 加载必要的库
library(hchinamap)
\# 浙江省的所有地级市
cities \<- c(\"杭州\", \"宁波\", \"绍兴\", \"衢州\", \"金华\", \"温州\",
\"嘉兴\", \"湖州\", \"台州\", \"舟山\", \"丽水\")
\# 设置随机种子以确保结果可重复
set.seed(123) \# 您可以更改或删除此行以获得不同的随机序列
\# 为每个城市生成一个100到200之间的随机整数
random_values \<- sample(100:200, length(cities), replace = TRUE)
\# 创建数据框
df \<- data.frame(City = cities, P = random_values)
\# 定义颜色
\# 设置最小值的颜色为黄色
minColor \<- \"#FFFF00\" \# 黄色
\# 设置最大值的颜色为红色
maxColor \<- \"#FF0000\" \# 红色
\# 绘制地图,并设置颜色和其他参数
map \<- hchinamap(name = df\$City, value = df\$P,
width = \"1000px\", height = \"500px\",
title = \"Map of Zhejiang\", region = \"Zhejiang\",
minColor = minColor, maxColor = maxColor, \# 设置颜色
theme = \"sunset\") \# 使用预设的主题
\# 显示地图到PDF设备
print(map)
2.REmap
REmap
是一个用于在R语言中创建交互式地图的包,它基于ECharts(一个由百度开发的开源可视化库)来实现。通过REmap,用户可以轻松地制作出美观且功能丰富的地图,包括但不限于世界地图、中国地图等,并且支持多种图表类型,如散点图、热力图等。
(1)扩散图
\# 加载REmap包,使其功能可用
library(REmap)
\# 定义自定义主题
custom_theme \<- get_theme(
theme = \"Sky\", \#
总体配色方案,默认有\"Dark\"、\"Bright\"、\"Sky\"、"none"等选项
lineColor = \"Random\", \# 线条颜色,默认随机,也可以指定如\'blue\'
backgroundColor = \"#1b1b1b\", \# 地图背景颜色(深灰色,接近黑色)
titleColor = \"fff\", \# 标题颜色,这里改为白色以适应深色背景
borderColor = \"rgba(100,149,237,1)\", \# 地域边缘颜色
regionColor = \"green\", \# 地域显示颜色
labelShow = T, \# 是否显示地域名称,默认为TRUE
pointShow = F, \# 是否显示地域所在点,默认为FALSE
pointColor = \"gold\" \# 如果显示点,点的颜色
)
\# 以浙江为例,创建一个城市向量
city_vec = c(\"北京\", \"上海\", \"杭州\", \"深圳\", \"天津\", \"青岛\",
\"成都\", \"昆明\")
\# 获取这些城市的地理坐标(经纬度)
geo_positions = get_geo_position(city_vec)
print(geo_positions) \# 打印获取到的城市经纬度
\# 设置随机种子以确保结果可复现
set.seed(1234)
\# 创建出发地数据,所有路线均从浙江(以杭州为代表)出发
origin = rep(\"杭州\", 25) \# 将路线数量增加到25条
\# 创建目的地数据,包括多个城市
destination = c(\'上海\', \'北京\', \'大连\', \'南宁\', \'南昌\',
\'杭州\', \'南京\', \'哈尔滨\', \'合肥\', \'长沙\',
\'拉萨\', \'长春\', \'乌鲁木齐\', \'重庆\', \'兰州\',
\'天津\', \'青岛\', \'成都\', \'昆明\', \'西安\',
\'福州\', \'厦门\', \'广州\', \'海口\', \'三亚\')
\# 将出发地和目的地组合成一个数据框
dat = data.frame(origin, destination)
\# 使用REmap绘制地图,并设置标题和主题
out = remap(mapdata = dat,
title = \"REmap Great\",
subtitle = \"浙江\", \# 更新副标题为浙江
theme = custom_theme) \# 使用自定义的主题
\# 显示绘制好的地图
out
)
(2)路径图
两列数据,左侧是起点,右侧是终点,并且每一行的终点是下一行的起点
\# 加载REmap包
library(REmap)
\# 示例中的REmap主题参数配置
get_theme(
theme = \"Dark\", \#
总体配色方案,默认有\"Dark\"、\"Bright\"、\"Sky\"、"none"等选项
lineColor = \"Random\", \# 线条颜色,默认随机,也可以指定如\'blue\'
backgroundColor = \"#1b1b1b\", \# 地图背景颜色
titleColor = \"fff\", \# 标题颜色
borderColor = \"rgba(100,149,237,1)\", \# 地域边缘颜色
regionColor = \"#1b1b1b\", \# 地域显示颜色
labelShow = T, \# 是否显示地域名称,默认为TRUE
pointShow = F, \# 是否显示地域所在点,默认为FALSE
pointColor = \"gold\" \# 如果显示点,点的颜色
)
\# 起点
origin \<- c(\"上海\", \"北京\", \"大连\", \"南宁\", \"南昌\",
\"杭州\", \"南京\", \"哈尔滨\", \"合肥\", \"长沙\",
\"拉萨\", \"长春\", \"乌鲁木齐\", \"重庆\", \"兰州\",
\"天津\", \"青岛\", \"成都\", \"昆明\", \"西安\")
\# 终点
destination \<- c(origin\[-1\], origin\[1\]) \# 首尾相连接
\# 创建数据框
map_data \<- data.frame(origin, destination)
\# 使用REmap绘制路径图,并设置标题和主题
map_out1 \<- remap(mapdata = map_data,
title = \"路径图\",
subtitle = \"上海\", \# 副标题为上海
theme = get_theme(theme = \"Dark\"))
\# 显示绘制好的路径图
map_out1
(3)REmapB
REmapB 函数是 R 语言中 REmap 包提供的一个用于创建气泡地图的函数。与
REmap 函数类似,REmapB
专门用来绘制带有大小和颜色变化的气泡的地图,通常用来展示地理数据中的数值分布情况。气泡的大小和颜色可以用来表示不同的变量值。
数据准备:
-
需要一个包含地理信息(如经纬度或地区名称)的数据框。
-
数据框中还需要有至少一个数值列,这个数值将决定气泡的大小。
-
可选地,可以有一个颜色列,用于指定每个气泡的颜色。
基本参数:
-
mapdata: 这是一个数据框,包含了所有必要的数据。
-
lat 和 lng: 这两个参数指定了数据框中哪两列是纬度和经度。
-
value: 这个参数指定了哪个列的数值将被用来决定气泡的大小。
-
colorField:
如果您想根据数据中的某个字段来设置气泡的颜色,可以使用这个参数。 -
title 和 subtitle: 分别设置地图的标题和副标题。
-
theme: 可以设置地图的主题,例如背景色、线条颜色等。
高级选项:
-
bubbleSizeScale: 控制气泡大小的比例。
-
bubbleColorScale: 如果您使用了 colorField
参数,那么可以通过这个参数来控制颜色梯度。 -
legendTitle: 设置图例的标题。
-
tooltip: 定义当鼠标悬停在气泡上时显示的信息。
library(REmap)
\# 示例数据生成
set.seed(1234) \# 设置随机数种子以确保结果可重复
\# 创建一个包含15个\"杭州\"的向量作为新的起点
origin = rep(\"杭州\", 15)
destination = c(\'上海\',\'北京\',\'大连\',\'南宁\',\'南昌\',
\'杭州\',\'南京\',\'哈尔滨\',\'合肥\',\'长沙\',
\'福州\', \'厦门\', \'广州\', \'海口\', \'三亚\') \# 目的地列表
dat = data.frame(origin, destination) \# 将起点与目的地组合成数据框
\# 使用 remapB 函数创建地图,并设置相关参数
map_out \<- remapB(
zoom = 5, \# 设置地图缩放级别为5,代表全国地图
color = \"dark\", \# 设置地图颜色主题为暗色
title = \"流向图\", \# 设置地图标题
subtitle = \"星星\", \# 设置地图副标题
markLineData = dat, \# 用于绘制线条的数据,
markPointData = destination, \# 用于标记点的数据,
markLineTheme = markLineControl( \# 线条样式控制
symbol = NA, \# 不使用线条两端的标记
symbolSize = c(0, 4), \# 标记大小范围
smooth = TRUE, \# 启用平滑处理
smoothness = 0.2, \# 平滑程度
effect = TRUE, \# 启用动画效果
lineWidth = 2, \# 线条宽度
lineType = \"dotted\", \# 线条类型为虚线
color = \"white\" \# 线条颜色为白色
),
markPointTheme = markPointControl( \# 点样式控制
symbol = \"star\", \# 点的形状为星形
symbolSize = \"Random\", \# 点的大小随机
effect = TRUE, \# 启用动态效果
effectType = \"scale\", \# 动态效果类型为放大
color = \"white\" \# 点的颜色为白色
)
)
\# 显示生成的地图
map_out
(4)REmapH
REmapH函数是R语言中的一个函数,主要用于绘制中心辐射的热力图。这种热力图在气象、人口密度、海拔测绘等领域有广泛应用,特别是在与地理信息相关的数据呈现方面非常有用
\# remapH(
\# data, \# 输入的数据,数据框格式,包含三列:经度(lon)、纬度(lat)
和密度/概率(prob)
\# maptype = \'china\', \# 地图类型,可选值为
\"china\"(中国地图)、\"world\"(世界地图)或中国各省份的名字
\# theme = get_theme(\"Dark\"), \# 地图主题类型,使用 get_theme 函数获取
\# blurSize = 30, \# 热力效果的泛化范围,控制热力点中心的扩散程度
\# color = c(\'blue\', \'cyan\', \'lime\', \'yellow\', \'red\'), \#
热力的渐变颜色
\# minAlpha = 0.05, \# 热力点的展示阈值,低于该值的点将不显示
\# opacity = 1, \# 透明度,0 表示完全透明,1 表示完全不透明
\# \... \# 其他可能的参数
\# )
自带数据sampleData()
lon lat prob
1 105.6052 32.62212 0.85545589
2 104.0839 31.10454 0.05013991
3 102.6748 39.18987 0.67443409
4 106.5136 31.23973 0.84589330
5 103.1012 27.05001 0.74639832
6 102.5992 39.86575 0.82956440
(5)REmapC
REmapC 函数是 remaps包中的一个函数,它用于创建基于中国地图的热力图或点分布图。这个函数允许用户根据提供的地理坐标数据(通常是经纬度)来绘制不同类型的图表,如热力图、散点图等,并且可以定制样式和参数
热力图
library(REmap)
\# 从地图数据中提取全国省份名称
province \<- mapNames(\"china\") \# 获取中国的省份列表
\# 为每个省份生成随机值,这些值将用于热力图的颜色映射
value \<- rnorm(34, 100, 50) \#
生成34个正态分布的随机数(均值100,标准差50)
\# 将省份名称与对应的随机值合并成一个数据框
data \<- data.frame(province = province, value = value) \#
创建包含省份和对应值的数据框
\# 使用remapC函数绘制热力图
remapC(data, color = c(\"grey\", \"red\"), title = \"全国各省热地图\",
subtitle = \"\") \# 绘制热力图,颜色渐变从黄色到红色
省份地图
`# 从地图数据中获取浙江省的地名
ad <- mapNames(“浙江”)
# 生成11个随机数,代表浙江省内各地区的数据值
value <- rnorm(11, 100, 36)
# 创建一个数据框,包含地名和对应的数据值
data <- data.frame(ad, value)
# 使用remapC函数绘制浙江省的热力地图
map_out <- remapC(
data = data, # 输入数据
maptype = “浙江”, # 地图类型
color = c(‘#1e90ff’, ‘#f0ffff’), # 颜色渐变
title = “浙江省热力地图”, # 地图标题
theme = get_theme(“Bright”), # 应用主题
maxdata = 200 # 图例最大值
)
# 显示或保存地图对象
map_out
模拟迁徙
library(REmap)
\# 获取中国所有省份的地名
province \<- mapNames(\"china\")
\# 移除浙江省
province \<- province\[province != \"浙江\"\]
\# 随机生成分省值(注意:现在是33个省份)
value \<- round(rnorm(33, 1000, 36), 0)
\# 合并数据
data \<- data.frame(province, value)
\# 选择迁徙值最大的前10个省份
labelper \<- data\[order(data\[,\"value\"\], decreasing = TRUE),
\]\[1:10, \]
\# 设置迁出地为浙江
origin \<- rep(\"杭州\", length(labelper))
\# 目的地为迁徙值最大的前10个省份
destination \<- labelper\$province
\# 创建连线数据
line_data \<- data.frame(origin, destination)
\# 绘制地图
map_out \<- remapC(
data = data,
maptype = \"china\",
title = \"浙江人口迁徙地图\",
theme = get_theme(\"Dark\"),
color = c(\"#CD0000\", \"#FFEC8B\"),
markLineData = line_data,
markLineTheme = markLineControl(
color = \"white\",
lineWidth = 2,
lineType = \"dashed\"
),
markPointData = line_data, \#
这里使用整个line_data,因为需要显示所有目的地
markPointTheme = markPointControl(
symbolSize = 13,
effect = TRUE,
effectType = \"scale\",
color = \"white\"
)
)
\# 显示或保存地图对象
map_out
##### \# 检查省份列表
\> print(province)
\[1\] \"新疆\" \"西藏\" \"内蒙古\" \"青海\" \"四川\" \"黑龙江\" \"甘肃\"
\"云南\" \"广西\" \"湖南\"
\[11\] \"陕西\" \"广东\" \"吉林\" \"河北\" \"湖北\" \"贵州\" \"山东\"
\"江西\" \"河南\" \"辽宁\"
\[21\] \"山西\" \"安徽\" \"福建\" \"江苏\" \"重庆\" \"宁夏\" \"海南\"
\"台湾\" \"北京\" \"天津\"
\[31\] \"上海\" \"香港\" \"澳门\"
检查合并后的数据
print(data)
province value
1 新疆 1033
2 西藏 1082
3 内蒙古 1004
4 青海 905
5 四川 1055
6 黑龙江 1066
7 甘肃 1013
8 云南 1056
9 广西 1015
10 湖南 1010
11 陕西 1007
12 广东 973
13 吉林 1002
14 河北 1008
15 湖北 1051
16 贵州 1053
17 山东 989
18 江西 906
19 河南 1008
20 辽宁 980
21 山西 1017
22 安徽 984
23 福建 1017
24 江苏 1000
25 重庆 1020
26 宁夏 948
27 海南 967
28 台湾 1018
29 北京 1050
30 天津 985
31 上海 972
32 香港 1048
33 澳门 1063
检查迁徙值最大的前10个省份
print(labelper)
province value
2 西藏 1082
6 黑龙江 1066
33 澳门 1063
8 云南 1056
5 四川 1055
16 贵州 1053
15 湖北 1051
29 北京 1050
32 香港 1048
1 新疆 1033
检查连线数据
> print(line_data)
origin destination
1 杭州 西藏
2 杭州 黑龙江
3 杭州 澳门
4 杭州 云南
5 杭州 四川
6 杭州 贵州
7 杭州 湖北
8 杭州 北京
9 杭州 香港
10 杭州 新疆
3.ggplot2
(1)绘制全国地图
library(ggplot2)
library(sf)
library(tidyverse)
\# 读取地图
china \<- sf::st_read(\"中华人民共和国.json\")
zhejiang \<- sf::st_read(\"zhejiang.json\")
\# 简单地图绘制
\# 绘制中国数据
ggplot(data = china) +
geom_sf() +
theme_minimal()
(2)绘制浙江省市界数据
ggplot(data = zhejiang) +
\# geom_sf() +
geom_sf(color = \"#29484d\", \# 填充的颜色
fill = \"#80b3ff\", \# 边界的颜色
size = 1) + \# 边界的粗细
theme_minimal()
(3)绘制热力地图
\# 加载必要的库
library(dplyr)
library(ggplot2)
library(sf)
library(tidyverse)
\# 读取地图
china \<- sf::st_read(\"中华人民共和国.json\")
zhejiang \<- sf::st_read(\"zhejiang.json\")
\# 假设的GDP值,实际数值应根据官方发布的数据进行更新
zhejiang_gdp \<- structure(list(name = c(\"杭州市\", \"宁波市\",
\"温州市\",
\"绍兴市\", \"湖州市\", \"嘉兴市\", \"金华市\",
\"衢州市\", \"舟山市\", \"台州市\", \"丽水市\"),
gdp = c(20059, 16452.8, 7000, 5500, 3500, 3200, 4800,
1800, 1200, 5200, 1600)),
class = c(\"tbl_df\", \"tbl\", \"data.frame\"),
row.names = c(NA, -11L))
\# 使用str_remove去掉\"市\"
zhejiang_gdp \<- zhejiang_gdp %\>%
mutate(name = str_remove(name, \"市\"))
\# 将GDP数据与地理空间数据合并
zhejiang_gd \<- zhejiang %\>%
left_join(zhejiang_gdp, by = \"name\")
\# 绘制地图
ggplot(data = zhejiang_gd) +
geom_sf(aes(fill = gdp), \# 使用GDP值填充颜色
color = \"black\", \# 设置轮廓线颜色
size = 1) + \# 设置轮廓线宽度
theme_minimal() + \# 应用极简主题
scale_fill_gradient(low = \"yellow\", high = \"red\", name = \"GDP
(亿)\") + \# 设置颜色梯度
labs(title = \"2023年浙江省各市GDP分布图\") + \# 添加标题
theme(legend.position = \"right\", \# 设置图例位置
plot.title = element_text(hjust = 0.5) , \# 设置标题居中
panel.grid.major = element_blank(), \# 去掉主要网格线
panel.grid.minor = element_blank(), \# 去掉次要网格线
axis.text.x = element_blank(), \# 去掉X轴(经度)标签
axis.text.y = element_blank(), \# 去掉Y轴(纬度)标签
axis.ticks.x = element_blank(), \# 去掉X轴(经度)刻度线
axis.ticks.y = element_blank() \# 去掉Y轴(纬度)刻度线
)
# 在 ggplot2 中,theme(legend.position = …)
可以用来设置图例的位置。legend.position 参数接受以下几种值:
#
# “top”:图例位于绘图区域的顶部。
# “bottom”:图例位于绘图区域的底部。
# “left”:图例位于绘图区域的左侧。
# “right”:图例位于绘图区域的右侧。
# “none”:不显示图例。
#
# 此外,您还可以使用坐标来指定图例的具体位置。例如,legend.position =
c(x, y),其中 x 和 y 是相对于绘图区域的比例值(0 到 1 之间)。例如:
#
# c(0, 0) 表示左下角。
# c(0, 1) 表示左上角。
# c(1, 0) 表示右下角。
# c(1, 1) 表示右上角。
# c(0.5, 0.5) 表示中心位置。
(4)条形图
\# 加载必要的库
library(dplyr)
library(ggplot2)
library(sf)
library(tidyverse)
\# 2023年全国34个省份的人均GDP数据
province_names \<- c(
\"香港特别行政区\", \"澳门特别行政区\", \"台湾省\", \"北京市\",
\"上海市\", \"江苏省\",
\"福建省\", \"浙江省\", \"天津市\", \"广东省\", \"内蒙古自治区\",
\"湖北省\", \"重庆市\", \"山东省\",
\"陕西省\", \"安徽省\", \"山西省\", \"湖南省\", \"江西省\",
\"宁夏回族自治区\",
\"新疆维吾尔自治区\", \"辽宁省\", \"四川省\", \"海南省\", \"河南省\",
\"云南省\",
\"青海省\", \"西藏自治区\", \"河北省\", \"吉林省\", \"贵州省\",
\"广西壮族自治区\",
\"黑龙江省\", \"甘肃省\"
)
\# 假设您已经获得了2023年的数据
gdp_values \<- c(
32.5, 28.5, 21.5, 19.2, 18.2, 14.6, 12.8, 12.0, 12.0, 10.3,
9.7, 9.3, 9.1, 8.7, 8.4, 7.5, 7.5, 7.5, 7.2, 7.0, 6.9, 6.9, 6.8, 6.7,
6.3,
6.2, 6.1, 5.9, 5.7, 5.5, 5.3, 5.2, 4.5
)
\# 检查向量长度
length_province \<- length(province_names)
length_gdp \<- length(gdp_values)
\# 如果长度不匹配,进行修正
if (length_province != length_gdp) {
cat(\"警告:province_names 和 gdp_values
向量长度不匹配,请检查数据。\\n\")
\# 假设是 gdp_values 少了一个值,我们暂时用 NA 填充
if (length_province \> length_gdp) {
gdp_values \<- c(gdp_values, rep(NA, length_province - length_gdp))
} else {
province_names \<- province_names\[1:length_gdp\]
}
}
\# 创建一个新的数据框,包含两个变量:province(省市名称)和
gdp(人均GDP)
data_2023 \<- data.frame(
province = province_names,
gdp = gdp_values,
stringsAsFactors = FALSE \# 防止字符向量被转换为因子
)
ggplot(data_2023, aes(x = reorder(province, gdp), y = gdp, fill =
gdp)) + \#
设置x轴为重新排序后的省份名称,y轴为人均GDP值,填充颜色也根据人均GDP值变化
geom_bar(stat = \'identity\') + \#
绘制条形图,stat=\'identity\'表示使用数据框中的值作为条形的高度
scale_fill_gradient(low = \"yellow\", high = \"red\") + \#
设置填充颜色黄色白色到红色
geom_text(aes(label = round(gdp, 2)), size = 3, hjust = -0.3, vjust =
0.5) + \#
在条形图上添加文本标签,显示人均GDP的值,四舍五入到小数点后两位
scale_y\_continuous(limits = c(0, 35), expand = c(0, 0)) + \#
设置y轴的范围为0到35,没有额外的扩展
theme_bw() + \# 设置图表的主题为白色背景
labs(title = \"2023年全国34个省市人均GDP\", x = \"\", y =
\"人均GDP(单位:万元)\") + \# 设置图表的标题和轴标签
guides(fill = guide_legend(title = \"人均GDP(单位:万元)\")) + \#
设置图例的标题
coord_flip() + \# 将条形图翻转,使得条形图变为水平显示
theme(
plot.title = element_text(hjust = 0.5), \# 标题居中
axis.text.x = element_text(angle = 45, hjust = 1), \#
旋转X轴标签以便更好地显示
legend.position = \"right\" \# 图例位置在右侧
)
(5)九段线小地图
st_read 和 read_sf
都是用于读取空间数据的函数,但它们来自不同的包,并且有一些细微的差别。下面是这两个函数的详细解释和比较:
st_read 函数
-
来源:st_read 是 sf 包中的一个函数。
-
用途:用于读取多种格式的空间数据文件,包括
GeoJSON、Shapefile、GeoPackage 等。
st_read(dsn, layer, …, quiet = FALSE, stringsAsFactors = TRUE)
read_sf 函数
来源:read_sf 也是 sf 包中的一个函数,它是 st_read 的一个别名。
用途:与 st_read 完全相同,用于读取多种格式的空间数据文件。
read_sf(dsn, layer, …, quiet = FALSE, stringsAsFactors = TRUE)
# 查看前几行数据
head(china_sf)
head(nine_sf)
name childrenNum level code filename fullname center
1 北京 16 province 110000 110000 北京市 116.40529, 39.90499
2 天津 16 province 120000 120000 天津市 117.1902, 39.1256
3 河北 11 province 130000 130000 河北省 114.50246, 38.04547
4 山西 11 province 140000 140000 山西省 112.54925, 37.85701
5 内蒙古 12 province 150000 150000 内蒙古自治区 111.67080, 40.81831
6 辽宁 14 province 210000 210000 辽宁省 123.42910, 41.79677
绘制地图
\# 安装必要的包(如果尚未安装)
\# install.packages(\"sf\")
\# install.packages(\"cowplot\")
\# 加载必要的库
library(sf)
library(cowplot)
library(dplyr)
library(ggplot2)
library(tidyverse)
\# 2023年全国34个省份的人均GDP数据
province_names \<- c(
\"香港特别行政区\", \"澳门特别行政区\", \"台湾省\", \"北京市\",
\"上海市\", \"江苏省\",
\"福建省\", \"浙江省\", \"天津市\", \"广东省\", \"内蒙古自治区\",
\"湖北省\", \"重庆市\", \"山东省\",
\"陕西省\", \"安徽省\", \"山西省\", \"湖南省\", \"江西省\",
\"宁夏回族自治区\",
\"新疆维吾尔自治区\", \"辽宁省\", \"四川省\", \"海南省\", \"河南省\",
\"云南省\",
\"青海省\", \"西藏自治区\", \"河北省\", \"吉林省\", \"贵州省\",
\"广西壮族自治区\",
\"黑龙江省\", \"甘肃省\"
)
\# 假设您已经获得了2023年的数据
gdp_values \<- c(
32.5, 28.5, 21.5, 19.2, 18.2, 14.6, 12.8, 12.0, 12.0, 10.3,
9.7, 9.3, 9.1, 8.7, 8.4, 7.5, 7.5, 7.5, 7.2, 7.0, 6.9, 6.9, 6.8, 6.7,
6.3,
6.2, 6.1, 5.9, 5.7, 5.5, 5.3, 5.2, 4.5
)
\# 检查向量长度
length_province \<- length(province_names)
length_gdp \<- length(gdp_values)
\# 如果长度不匹配,进行修正
if (length_province != length_gdp) {
cat(\"警告:province_names 和 gdp_values
向量长度不匹配,请检查数据。\\n\")
\# 假设是 gdp_values 少了一个值,我们暂时用 NA 填充
if (length_province \> length_gdp) {
gdp_values \<- c(gdp_values, rep(NA, length_province - length_gdp))
} else {
province_names \<- province_names\[1:length_gdp\]
}
}
\# 创建一个新的数据框,包含两个变量:province(省市名称)和
gdp(人均GDP)
data_2023 \<- data.frame(
province = province_names,
gdp = gdp_values,
stringsAsFactors = FALSE \# 防止字符向量被转换为因子
)
\## 读取和处理地图
\# china \<- \"China.geojson\" \# 中国地图的GeoJSON文件路径
\# nine \<- \"nine_line.geojson\" \# 九段线的GeoJSON文件路径
\# 读取GeoJSON文件
china_sf \<- sf::st_read(\"china.json\") \# 读取中国地图数据
nine_sf \<- sf::st_read(\"十段线数据.json\") \# 读取九段线数据
\# 查看前几行数据
head(china_sf)
head(nine_sf)
\# 重命名 \`data_2023\` 数据框中的 \`province\` 列,使其与 \`china_sf\`
中的列名一致
data_2023 \<- data_2023 %\>% rename(fullname = province)
\# 将人均GDP数据与地图数据进行左连接
china \<- dplyr::left_join(china_sf, data_2023, by = \"fullname\")
\## 填充地图绘制
map \<- ggplot() +
geom_sf(data = china, aes(fill = gdp), size = 0.5, color = \"black\") +
\# 绘制中国地图并填充颜色
geom_sf(data = nine_sf) + \# 绘制九段线
coord_sf(ylim = c(1869414.769862395, 7187874.74616931), crs = 3857) + \#
设置坐标范围和投影
scale_fill_gradient(name = \"人均GDP(万元)\", \# 设置填充颜色的图例标题
low = \"yellow\", \# 低值颜色
high = \"red\", \# 高值颜色
n.breaks = 6, \# 图例分段数
guide = guide_legend(keywidth = 1.5, keyheight = 1.5)) + \#
设置图例的宽度和高度
labs(title = \"2023年全国34个省市人均GDP\") + \# 设置图表标题
theme(legend.position = \"right\", \# 设置图例位置
plot.title = element_text(hjust = 0.5) , \# 设置标题居中
panel.grid.major = element_blank(), \# 去掉主要网格线
panel.grid.minor = element_blank(), \# 去掉次要网格线
axis.text.x = element_blank(), \# 去掉X轴(经度)标签
axis.text.y = element_blank(), \# 去掉Y轴(纬度)标签
axis.ticks.x = element_blank(), \# 去掉X轴(经度)刻度线
axis.ticks.y = element_blank() \# 去掉Y轴(纬度)刻度线
)
map
绘制九段线小地图
\## 绘制九段线小地图
nine_map \<- ggplot() +
geom_sf(data = china, aes(fill = gdp)) + \# 绘制中国地图并填充颜色
geom_sf(data = nine_sf) + \# 绘制九段线
scale_fill_gradient(low = \"white\", \# 低值颜色
high = \"red\", \# 高值颜色
n.breaks = 6) + \# 图例分段数
coord_sf(ylim = c(278392.10080518876, 2991845.069153875), \# 设置y轴范围
xlim = c(11631734.185889415, 13868701.579770062), \# 设置x轴范围
crs = 3857) + \# 设置投影
theme(legend.position = \"none\", \# 移除图例
plot.margin = unit(c(0, 0, 0, 0), \"mm\"), \# 设置绘图边距
panel.border = element_rect(fill = NA, \# 设置面板边框
color = \"grey10\",
linetype = 1,
size = 0.5)) +
theme(
panel.grid.major = element_blank(), \# 去掉主要网格线
panel.grid.minor = element_blank(), \# 去掉次要网格线
axis.text.x = element_blank(), \# 去掉X轴(经度)标签
axis.text.y = element_blank(), \# 去掉Y轴(纬度)标签
axis.ticks.x = element_blank(), \# 去掉X轴(经度)刻度线
axis.ticks.y = element_blank() \# 去掉Y轴(纬度)刻度线
)
nine_map
拼图
\## 拼图
figure \<-
ggdraw(map) + \# 创建主图
draw_plot(nine_map, \# 添加九段线小地图
x = 1.2, y = 0.15, \# 调整九段线小地图的位置
width = 0.2, height = 0.5) \# 调整九段线小地图的大小
\# 显示最终的拼图
figure
\## 拼图
figure \<-
ggdraw(map) + \# 创建主图
draw_plot(nine_map, \# 添加九段线小地图
x = 1.2, y = 0.15, \# 调整九段线小地图的位置
width = 0.2, height = 0.5) \# 调整九段线小地图的大小
\# 显示最终的拼图
figure
添加指北针和比例尺
\# 通过 ggspatial 包来添加指北针
\# install.packages(\"ggspatial\")
\# 在 ggplot2 中,可以通过 ggspatial 包来添加指北针
\# ggplot2 本身提供了添加比例尺的功能
\## 填充地图绘制
map \<- ggplot() +
geom_sf(data = china, aes(fill = gdp), size = 0.5, color = \"black\") +
\# 绘制中国地图并填充颜色
geom_sf(data = nine_sf) + \# 绘制九段线
coord_sf(ylim = c(1869414.769862395, 7187874.74616931), crs = 3857) + \#
设置坐标范围和投影
scale_fill_gradient(name = \"人均GDP(万元)\", \# 设置填充颜色的图例标题
low = \"yellow\", \# 低值颜色
high = \"red\", \# 高值颜色
n.breaks = 6, \# 图例分段数
guide = guide_legend(keywidth = 1.5, keyheight = 1.5)) + \#
设置图例的宽度和高度
labs(title = \"2023年全国34个省市人均GDP\") + \# 设置图表标题
annotation_north_arrow(location = \"tl\", which_north = \"false\",
style = north_arrow_fancy_orienteering) + #添加指北针
annotation_scale(location = \"bl\") + #添加比例尺
theme(legend.position = \"right\", \# 设置图例位置
plot.title = element_text(hjust = 0.5) , \# 设置标题居中
panel.grid.major = element_blank(), \# 去掉主要网格线
panel.grid.minor = element_blank(), \# 去掉次要网格线
axis.text.x = element_blank(), \# 去掉X轴(经度)标签
axis.text.y = element_blank(), \# 去掉Y轴(纬度)标签
axis.ticks.x = element_blank(), \# 去掉X轴(经度)刻度线
axis.ticks.y = element_blank() \# 去掉Y轴(纬度)刻度线
)
map