實用帖之R-ggplot2 標準中國地圖製作

2021-02-15 俊紅的數據分析之路

這期涉及空間圖表繪製,主要涉及知識點如下:

ggplot2 + sf 中國標準地圖繪製

本期的繪圖我們是按照如下圖表進行繪製的(該圖來自朋友公號):

其實我很早就想試著用R進行此類圖表的繪製了,但由於強大的Arcgis和繪圖進度等原因,導致遲遲沒有進行,這期就進行此類圖表的繪製。註:圖中散點的經緯度信息已從朋友那獲知,但涉及具體數據則是虛構的。

地圖讀取和散點標註

這裡的中國地圖格式為 geojson 格式,還是使用sf包進行靈活讀取,具體代碼如下:

china_shp <- "中國省級地圖GS(2019)1719號.geojson"
nine <- "九段線GS(2019)1719號.geojson"
china <- sf::read_sf(china_shp)
nine_line <- sf::read_sf(nine)

數據預覽如下(部分):

接下來我們進行探索性繪圖,主要使用geom_sf() 進行繪製,代碼如下:

library(ggspatial)
ggplot() + 
  geom_sf(data = china,fill="NA",size=1,color="black") + 
  geom_sf(data = nine_line) + 
  coord_sf(crs = "+proj=laea +lat_0=40 +lon_0=104")+
  annotation_scale(location = "bl") +
      # spatial-aware automagic north arrow
       annotation_north_arrow(location = "tl", which_north = "false",
                             style = north_arrow_fancy_orienteering)

這裡可以看到,我們沒有使用常規的WGS84坐標,而是採用 +proj=laea +lat_0=40 +lon_0=104 進行繪製,可視化結果如下:

比例尺和指北針的添加,則是依靠ggspatial包。

散點數據的讀取

由於只獲得數據經緯度信息,其他數據均為虛構,數據預覽如下:

這裡注意點,要想使數據繪製在地圖上,我們需使用st_as_sf()對其進行轉換,處理:

scatter_df_tro <- st_as_sf(scatter_df,coords = c("lon", "lat"),crs = 4326)

結果如下:注意紅色框中的內容

接下來將數據在地圖中顯示,具體代碼如下:

ggplot() + 
  geom_sf(data = china,fill="NA",size=.5,color="black") + 
  geom_sf(data = nine_line) + 
  geom_sf(data = scatter_df_tro,aes(fill=class,size=data),shape=21,colour='black',stroke=.25)+
  coord_sf(crs = "+proj=laea +lat_0=40 +lon_0=104")+
  scale_fill_manual(values = c("#E21C21","#3A7CB5","#51AE4F"))+
  scale_size(range = c(1,5))+
  annotation_scale(location = "bl") +
      # spatial-aware automagic north arrow
       annotation_north_arrow(location = "tl", which_north = "false",
                             style = north_arrow_fancy_orienteering)+
  theme_linedraw()+
  theme(text = element_text(family = 'Times_New_Roman',size = 12,face = "bold"),
        panel.background = element_rect(fill = NA),
        panel.grid.major = element_line(colour = "grey50"),
        #axis.line = element_line(size = 1, colour = "black"),
        panel.ontop = FALSE
        )

可視化結果如下:

這裡還存在如下問題:

(1) 儘量將南海部分放置在右下角(雖然這樣也可以)

(2) 圖例只是默認的,沒有進行定製化操作,影響美觀

cowplot包子圖添加

cowplot包可是實現對繪圖結果的任意組合,很適合繪製地圖子圖的繪製,這裡直接給出繪圖代碼,如下:

library(cowplot)

map <- ggplot() + 
  geom_sf(data = china,fill=NA) + 
  geom_sf(data = nine_line,color='gray50',size=.8)+
  geom_sf(data = scatter_df_tro,aes(fill=class,size=data),shape=21)+
  coord_sf(ylim = c(-2387082,1654989),crs="+proj=laea +lat_0=40 +lon_0=104")+
  scale_fill_manual(values = c("#E21C21","#3A7CB5","#51AE4F"))+
  scale_size(range = c(1,5))+
  annotation_scale(location = "bl",text_face = "bold",
                   text_family = "Times_New_Roman") +
      # spatial-aware automagic north arrow
       annotation_north_arrow(location = "tl", which_north = "false",
                             style = north_arrow_fancy_orienteering,
                            )+
  #定製化圖例:這一步可以設計出亮眼的圖例哦
  guides(fill = guide_legend(override.aes = list(size = 3),
                             title = "",
                             label.position = "right",
                             ncol=3,
                             ),
         size = guide_legend(
                             title = "",
                             label.position = "right",
                             ncol=5)) +
 labs(
          caption = 'Visualization by DataCharm')+
 #theme_bw()+
 theme(
     text = element_text(family = 'Times_New_Roman',size = 18,face = "bold"),
     
     panel.background = element_rect(fill = NA),
     panel.grid.major = element_line(colour = "grey80",size=.2),
     legend.key = element_rect(fill = "white"),
     legend.position = "bottom",
 )

nine_map <- ggplot() +
  geom_sf(data = china,fill='NA') + 
  geom_sf(data = nine_line,color='gray70',size=1.)+
  #geom_sf(data = scatter_df_tro,aes(fill=class,size=data),shape=21,colour='black',stroke=.25)+
  coord_sf(ylim = c(-4028017,-1877844),xlim = c(117131.4,2115095),crs="+proj=laea +lat_0=40 +lon_0=104")+
  theme(
    #aspect.ratio = 1.25, #調節長寬比
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    panel.background = element_blank(),
    panel.border = element_rect(fill=NA,color="grey10",linetype=1,size=1.),
    plot.margin=unit(c(0,0,0,0),"mm"))


gg_inset_map = ggdraw() +
  draw_plot(map) +
  draw_plot(nine_map, x = 0.8, y = 0.15, width = 0.1, height = 0.3)

可視化效果如下:

這裡需注意的是xlim和ylim的設置,具體值都是在 +proj=laea +lat_0=40 +lon_0=104 投影坐標系下的值,而常規坐標轉不同坐標下的操作也很簡單,可使用st_transform進行操作。如下:

df2 <- tibble(lon = c(105,125),
       lat = c(3,25),
       ) 

df2 %>% 
  st_as_sf(coords = c("lon", "lat"), crs = 4326) -> df2_sf

df2_sf_pre <- sf::st_transform(df2_sf,crs="+proj=laea +lat_0=40 +lon_0=104")
df2_sf_pre

即可獲取對應值,進而進行範圍設置。

總結

該期推文也是基於自己對地圖的喜歡進行繪製,後面還是會以基礎圖表的繪製為主,希望大家能夠喜歡,多多支持。更多想法可以在留言區進行留言告知。

相關焦點

  • R-ggplot2 標準中國地圖製作
    ggplot2 + sf 中國標準地圖繪製cowplot 包實現地圖子圖插入ggplot2 + sf 中國標準地圖繪製本期的繪圖我們是按照如下圖表進行繪製的(該圖來自朋友公號):其實我很早就想試著用R進行此類圖表的繪製了,但由於強大的Arcgis和繪圖進度等原因
  • 手把手教你使用ggplot2繪製中國地圖
    自從用了ggplot2包,越來越覺得其博大精深,通過圖層的概念可以繪製豐富的可視化圖形,如常見的散點圖、直方圖、條形圖、折線圖等。
  • R數據科學之ggplot2入門
    displacement, in litres(發動機排量)year:year of manufacture(製造年份)cyl:number of cylinders(氣缸數)trans:type of transmission(變速器類型)drv:the type of drive train, where f = front-wheel drive, r
  • R可視化01|ggplot2-ggplot2簡介
    PackagesDATA SCIENCE WITH THE TIDYVERSE**ggplot2**for visualising data.dplyr for manipulating data.stringr for working with strings.lubridate for working with date/times.
  • R-ggplot2 學術箱線圖製作
    本期推文就推出箱線圖(boxplot)的R-ggplot2 繪製方法,大家可以和 Python-matplotlib 箱線圖繪製 這篇文章對比下。(1)數據預覽由於數據和之前的數據一樣,且ggplot2 對繪圖數據也是有一定要求,現給出數據如下(部分):
  • R繪圖之ggplot2-散點圖(一)
    上次我們簡單的介紹了ggplot2的做圖基礎,並介紹了如何調整參數,設置分組並添加線性擬合,那麼今天大家跟著圖圖一起來系統的學習一下散點圖的製作
  • ggplot2 | 使用ggplot2工具包繪製地圖
    ggplot2工具包用於繪製地圖的有如下幾個函數:這些函數中,最常用的是前兩個函數,本篇就來介紹這兩個函數。加載相關工具包和示例數據:library(ggplot2)library(patchwork)library(sf)library(RColorBrewer)library(tidyverse)data <- socviz::county_data
  • 實用技術 | 如何用R繪製並填充相對正確的中國地圖
    標準地圖象徵著國家主權和領土完整。作為非地理信息專業但又要在研究過程中涉及地圖繪製的政治學專業學生,我們必須在繪製中國地圖並用作公開學術發表/出版時格外注意。圖1圖2中自上向下的幾塊紅色區域依次為中國的阿克賽欽地區、巴裡加斯地區、巨哇、曲惹地區、什布奇山口、桑、蔥莎、波林三多地區以及烏熱、然衝、拉不底地區),其中位於中國新疆和西藏交界的阿克賽欽地區經常被錯誤地繪入印度當局設立的所謂「拉達克中央直轄區」(原印度宣稱的查謨和克什米爾地區東部)中。
  • R|ggplot2(五)|scale 修改默認設置
    知乎專欄:https://zhuanlan.zhihu.com/Data-AnalysisR第一篇戳:R|ggplot2(一)|一個完整的繪圖流程第二篇戳:R|ggplot2(二)|覆蓋柱狀圖各種需求第三篇戳:R|ggplot2(三)|coord 系列函數坐標軸轉換第四篇戳:R|ggplot2(四)|stat_ geom_ 和position
  • R可視化:圖片為背景的氣泡地圖
    bubble map 是一種很常見的地理位置信息相關的很常見的可視化圖,可同時傳遞多維度信息,用氣泡的位置傳遞物理位置信息,氣泡的大小表示變量1值的大小,氣泡的顏色可以標識變量2的大小/類別,可以用時間frame製作.gif來表示各變量隨時間的變化。
  • R ggplot2 實用系列----折線圖
    ggplot2 是繪製科研論文圖片的強有力工具,是很多其它包依賴的做圖包。
  • 朝花夕拾(二)|《R時代,你要怎樣畫地圖》
    • 邱怡軒:用R軟體繪製中國分省市地圖(http:// cos.name /2009/07/drawing-china-map-using-r/)• 謝益輝:用R畫中國地圖並標註城市位置(http://yihui.name/cn/2008/10/china-map-and-city-locations-with-r/)• 謝益輝:終於搞定了中國分省市地圖(
  • 用R繪製最完整中國地圖(含臺灣,藏南,南海諸島,九段線)
    但是同時,我們推文中存在的一個「瑕疵」,正如有位朋友的留言(上圖中最後一個),一直讓投必得編輯部如鯁在喉,終於經過我們一段時間的努力,我們很驕傲的宣布:使用咱們投必得的地圖文件包,讓你繪製出一幅包含最全中國的世界地圖:中國一點都不能少!
  • R繪圖之ggplot2—添加注釋
    傳遞給圖層的其他基礎參數,如size, colour, alpha, fill, fontface等na.rm刪除缺失值時是否提醒annotate 函數的參數較為簡單,大多是layer()中的基礎參數第二部分: 添加文本添加文本類幾何對象library(ggplot2)library(ggsci)library
  • 【R】如何用 R 繪製地圖
    #install.packages("ggplot2")#install.packages("maps")library(ggplot2)library(maps) # 為了獲取數據#### # ATTENTION: maps v3.0 has an updated 'world' map. ### # Many country borders and names
  • 第五十七講:R作圖-ggplot2繪製小提琴圖
    小提琴圖類似於箱式圖,不同之處在於它們還顯示了數據的概率密度。
  • R語言畫展ggplot2篇-點圖
    今天用ggplot2實現點圖(Dotplot)的製作。點圖通常用於不同組別間的均數比較,也可以與箱形圖或小提琴圖結合在一起。#查看數據summary(iris)Sepal.Length Sepal.Width Petal.Length Petal.Width Species Min.
  • R可視化10|ggplot2-圖層圖形語法 (2)
    >  基本圖(GRAPHICAL PRIMITIVES)  輔助線圖(LINE SEGMENTS)  單個連續變量、單個離散變量圖  兩個連續變量圖  一個離散變量,一個連續變量圖   兩個離散變量圖   continuous bivariate distribution 圖  一個時間序列,一個連續變量圖   誤差棒圖   地圖
  • R語言ggplot繪製峰巒圖繪製
    rm(list=ls())設置工作目錄setwd("C:/Users/Dell/Desktop/R_Plots/19ridge/")使用ggridges包繪製峰巒圖library(ggridges)library(ggplot2
  • R語言可視化——中心放射狀路徑圖
    最近一直在研究ggplot剩餘還沒有涉略過的圖表類型,試圖挖掘出一些新的圖表形式,就像是該包的作者所暗示的那樣,ggplot2隻是給你搭建了一個圖層語法環境