当前位置: 首页 > news >正文

用R绘制世界地图及中国地图

在如今这个数据可视化无处不在的世界里,R语言不再只是统计分析的工具,它更像是一支画笔,能为你描绘出一幅幅地图。如果你曾经幻想过用代码勾勒出世界的轮廓,或者展现中国的山川河流,那么今天的探索正适合你~

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
require(maps)
## Loading required package: maps
## Warning: package 'maps' was built under R version 4.2.3
require(viridis)
## Loading required package: viridis
## Warning: package 'viridis' was built under R version 4.2.3
## Loading required package: viridisLite
## Warning: package 'viridisLite' was built under R version 4.2.3
## 
## Attaching package: 'viridis'
## The following object is masked from 'package:maps':
## 
##     unemp

1.世界地图绘制

绘制简单地图

world <- map_data("world")
worldplot <- ggplot() +geom_polygon(data = world, aes(x=long, y = lat, group = group),fill="lightgray",color="white") + coord_fixed(1.3)
worldplot

 根据指标填充颜色,如想绘制全球妊娠期糖尿病发病情况的分布比较图,可下载IDF文件。

加载数据


world_gdm <- read.csv("IDF_2021.csv", header = TRUE) #下载文件到本地文件夹head(world_gdm)
##   X.                       Region            Country.Territory X2000 X2011
## 1  1                       Africa                       Africa   N/A   N/A
## 2  2                       Europe                       Europe   N/A   N/A
## 3  3 Middle East and North Africa Middle East and North Africa   N/A   N/A
## 4  4  North America and Caribbean  North America and Caribbean   N/A   N/A
## 5  5    South and Central America    South and Central America   N/A   N/A
## 6  6              South-East Asia              South-East Asia   N/A   N/A
##   X2021 X2030 X2045   Type                      Country
## 1    13   N/A   N/A Region                       Africa
## 2    15   N/A   N/A Region                       Europe
## 3  14.1   N/A   N/A Region Middle East and North Africa
## 4  20.7   N/A   N/A Region  North America and Caribbean
## 5  15.8   N/A   N/A Region    South and Central America
## 6  25.9   N/A   N/A Region              South-East Asia
##查看两个数据集中变量名称不一致的部分
diff <- setdiff(world$region, world_gdm$Country)
diff
##  [1] "Antarctica"                          "French Southern and Antarctic Lands"
##  [3] "Barbuda"                             "Saint Barthelemy"                   
##  [5] "Brunei"                              "Ivory Coast"                        
##  [7] "Cape Verde"                          "Czech Republic"                     
##  [9] "Canary Islands"                      "Falkland Islands"                   
## [11] "Guernsey"                            "Heard Island"                       
## [13] "Cocos Islands"                       "Christmas Island"                   
## [15] "Chagos Archipelago"                  "Jersey"                             
## [17] "Siachen Glacier"                     "Nevis"                              
## [19] "Kosovo"                              "Saint Martin"                       
## [21] "Montserrat"                          "Norfolk Island"                     
## [23] "Bonaire"                             "Sint Eustatius"                     
## [25] "Saba"                                "Pitcairn Islands"                   
## [27] "Madeira Islands"                     "Azores"                             
## [29] "Western Sahara"                      "South Sandwich Islands"             
## [31] "South Georgia"                       "Saint Helena"                       
## [33] "Ascension Island"                    "Saint Pierre and Miquelon"          
## [35] "Swaziland"                           "Sint Maarten"                       
## [37] "Turks and Caicos Islands"            "Tobago"                             
## [39] "Vatican"                             "Grenadines"                         
## [41] "Wallis and Futuna"

通常需要对不一致的变量进行重命名,以使得world map数据和GDM发病数据中的国家名称一致,这里仅用作示例,不做修改。

## 将数据设置为数值型变量
world_gdm$X2021 <- as.numeric(as.character(world_gdm$X2021))
## Warning: NAs introduced by coercion
world_gdm$prevalence<-world_gdm$X2021
world_gdm$prevalence<-gsub("-","",world_gdm$prevalence)

合并数据集

worldSubset <- inner_join(world, world_gdm, by = c("region"="Country"))
head(worldSubset)
##        long      lat group order region subregion X.
## 1 -69.89912 12.45200     1     1  Aruba      <NA> 18
## 2 -69.89571 12.42300     1     2  Aruba      <NA> 18
## 3 -69.94219 12.43853     1     3  Aruba      <NA> 18
## 4 -70.00415 12.50049     1     4  Aruba      <NA> 18
## 5 -70.06612 12.54697     1     5  Aruba      <NA> 18
## 6 -70.05088 12.59707     1     6  Aruba      <NA> 18
##                        Region Country.Territory X2000 X2011 X2021 X2030 X2045
## 1 North America and Caribbean             Aruba     -     -    NA     -     -
## 2 North America and Caribbean             Aruba     -     -    NA     -     -
## 3 North America and Caribbean             Aruba     -     -    NA     -     -
## 4 North America and Caribbean             Aruba     -     -    NA     -     -
## 5 North America and Caribbean             Aruba     -     -    NA     -     -
## 6 North America and Caribbean             Aruba     -     -    NA     -     -
##      Type prevalence
## 1 Country       <NA>
## 2 Country       <NA>
## 3 Country       <NA>
## 4 Country       <NA>
## 5 Country       <NA>
## 6 Country       <NA>

绘制最终数据

## 设置绘图主题
plain <- theme(axis.text = element_blank(),axis.line = element_blank(),axis.ticks = element_blank(),panel.border = element_blank(),panel.grid = element_blank(),axis.title = element_blank(),panel.background = element_rect(fill = "white"),plot.title = element_text(hjust = 0.5)
)worldSubset$prevalence<-as.numeric(worldSubset$prevalence)
#绘图
worldHDI <- ggplot(data = worldSubset, mapping = aes(x = long, y = lat, group = group)) + coord_fixed(1.3) +geom_polygon(aes(fill = prevalence)) +# scale_fill_distiller(palette ="RdBu", direction = -1) + # or direction=1scale_fill_gradient2(low = "#ADC6AD", mid = "#e7b800", high = "red", midpoint = 10)+ggtitle("Prevalence of Gestational Diabetes in 2021 by WHO region") +plainworldHDI

2.绘制特定区域的地图

获取特定国家的地图数据

# Some EU Contries
some.eu.countries <- c("Portugal", "Spain", "France", "Switzerland", "Germany","Austria", "Belgium", "UK", "Netherlands","Denmark", "Poland", "Italy", "Croatia", "Slovenia", "Hungary", "Slovakia","Czech republic"
)
# Retrievethe map data
some.eu.maps <- map_data("world", region = some.eu.countries)
# Compute the centroid as the mean longitude and lattitude
# Used as label coordinate for country's names
region.lab.data <- some.eu.maps %>%dplyr::group_by(region) %>%dplyr::summarise(long = mean(long), lat = mean(lat))region.lab.data
## # A tibble: 17 × 3
##    region          long   lat
##    <chr>          <dbl> <dbl>
##  1 Austria        13.5   47.6
##  2 Belgium         4.73  50.6
##  3 Croatia        16.3   44.6
##  4 Czech Republic 15.4   49.9
##  5 Denmark        10.7   55.7
##  6 France          3.23  46.2
##  7 Germany        10.4   51.2
##  8 Hungary        19.4   47.2
##  9 Italy          11.8   42.2
## 10 Netherlands     5.32  52.1
## 11 Poland         19.1   51.4
## 12 Portugal       -7.89  39.9
## 13 Slovakia       19.6   48.8
## 14 Slovenia       14.8   46.1
## 15 Spain          -2.91  40.7
## 16 Switzerland     8.31  46.7
## 17 UK             -4.10  55.6

可视化

ggplot(some.eu.maps, aes(x = long, y = lat)) +geom_polygon(aes( group = group, fill = region))+geom_text(aes(label = region), data = region.lab.data,  size = 3, hjust = 0.5)+scale_fill_viridis_d()+theme_void()+theme(legend.position = "none")

3.中国地图绘制

下载中国地图json文件

DataV.GeoAtlas地理小工具系列

读取地图文件,绘制基础图形

library(sf)
## Warning: package 'sf' was built under R version 4.2.3
## Linking to GEOS 3.9.3, GDAL 3.5.2, PROJ 8.2.1; sf_use_s2() is TRUE
library(ggplot2)
library(cowplot)
## Warning: package 'cowplot' was built under R version 4.2.3
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'stringr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ✔ readr     2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter()    masks stats::filter()
## ✖ dplyr::lag()       masks stats::lag()
## ✖ purrr::map()       masks maps::map()
## ✖ lubridate::stamp() masks cowplot::stamp()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggspatial)
## Warning: package 'ggspatial' was built under R version 4.2.3
library(dplyr)
China_map=read_sf("China.json")
# 地图散点图2
p2=ggplot(China_map)+geom_sf(color='white',fill="lightgray",size=0.8)+#地图线条粗细annotation_scale(location = "bl", width_hint = 0.3) +#添加比例尺并调整位置及长度annotation_north_arrow(location = "tl", which_north = F, pad_x = unit(0.05, "in"), pad_y = unit(0.05, "in"),style = north_arrow_nautical)+#添加指北针,指北针类型style有north_arrow_orienteering;north_arrow_fancy_orienteering;north_arrow_minimal与north_arrow_nautical四种类型theme_map()
p2
## Scale on map varies by more than 10%, scale bar may be inaccurate

提取各个省份经纬度坐标

city_name<-China_map$name
location_center<-China_map$centerdata_province<-matrix(nrow = 34,ncol = 2)
colnames(data_province)<-c("LON","LAT")
for (i in 1:34) {data_province[i,1]<-location_center[[i]][1]data_province[i,2]<-location_center[[i]][2]# rownames(data_province[i,])<-city_name[i]
}
rownames(data_province)<-city_name[1:34]
#write.csv(data_province,file = "Data/Map/data_province_center.csv")
head(data_province)
##                   LON      LAT
## 北京市       116.4053 39.90499
## 天津市       117.1902 39.12560
## 河北省       114.5025 38.04547
## 山西省       112.5492 37.85701
## 内蒙古自治区 111.6708 40.81831
## 辽宁省       123.4291 41.79677

更简单点的,使用mapdata包中的map()函数,即可绘制中国地图。

获取经纬度坐标之后,就可以根据自己的数据填充感兴趣的数值了,具体方法同前,感兴趣的大家可以尝试一下。

希望可以通过今天的博文,大家可以稍微获得一点代码与地理的浪漫邂逅。

欲探索更多R包使用方法,请关注微信公众号《单细胞学会》。


http://www.mrgr.cn/news/18610.html

相关文章:

  • 《精通Transformer》ChatGPT:放弃战斗吧,向Transformer投降!
  • Isaac Sim 物理参数翻译
  • Docker 简介
  • 024集—— 正则表达式、replace、DateTime日期的用法——C#学习笔记
  • MovieSum:大型复杂文本摘要数据集,提供格式化剧本信息以及维基摘要 | ACL 2024
  • ‘rimraf‘ 不是内部或外部命令,也不是可运行的程序
  • 57-java csrf防御方案
  • 学习笔记---自动驾驶
  • 亚马逊云注册就送小礼品,数量充足,耳机键盘等你来拿!
  • 集合框架,List常用API,栈和队列初识
  • Android U 多任务启动分屏——Launcher流程(更新中)
  • Linux中MFS分布式文件系统(实战教程)全网最详细
  • debian系统安装mysql
  • 5、Django Admin后台移除“删除所选”操作
  • PrimeTime low power-多电压设计流程(3)
  • STM32开发资料
  • 共创AI+ 数智新引擎—2024 大模型创新应用线下沙龙上海站圆满落幕
  • VI改造计划补充篇
  • 科研|基于SprinBoot+vue的科研管理系统(源码+数据库+文档)
  • 世平安森美 NFAL5065L4BT IPM 应用于1500W 热泵热水器压缩机驱动器的方案介绍