手把手教你使用ggplot2繪製中國地圖

2021-03-02 表哥有話講

自從用了ggplot2包,越來越覺得其博大精深,通過圖層的概念可以繪製豐富的可視化圖形,如常見的散點圖、直方圖、條形圖、折線圖等。今天就教大家如何使用ggplot2實現地圖的繪製,以及如何在地圖中加入氣泡圖和條形圖。

本文所使用的數據來自於經管之家moonstone作者提供的流行病學樣本數據。有關地理信息數據可至文後的下載連結。

實操開始:

library(dplyr)
library(maptools)
library(ggplot2)

map_data <- readShapePoly(file.choose())

df_map <- map_data@data[,c('PINYIN_NAM', 'NAME')]
head(df_map)



df_map$id <- as.character(0:33)
head(df_map)


注意!這裡必須強調一點:不可以單獨將.shp文件放置在某個路徑下,還需同時將.dbf和.shx文件放到一起,否則會出現讀取數據失敗的問題。

可以通過fortify()函數將.shp文件中經緯度信息返回出來。

latitude_longitude <- fortify(map_data)
head(latitude_longitude)


下面將latitude_longitudd與df_map表進行關聯,目的是將經緯度信息對應到自個的省份中。

latitude_longitude <- latitude_longitude[, c('long', 'lat', 'id')] %>% left_join(., df_map, by = 'id')
head(latitude_longitude)


但數據集中並不是每個省只對應一個經緯度,而是各省輪廓的經緯度,下面需要為每個省創建一個經緯度,用以下文中的繪圖需要。

latitude_longitude <- tbl_df(latitude_longitude)

group_id <- group_by(.data = latitude_longitude, id)

center <- function(x) mean(range(x))
#聚合操作
province_location <- summarise(.data = group_id, latitude = center(lat), longitude = center(long))
#查看數據前6行
head(province_location)



doc_data <- read.csv(file = file.choose())
head(doc_data)



doc_data_select <- select(.data = doc_data, NAME1, Population, Dct_nur)
head(doc_data_select )



doc_data_select <- rename(.data = doc_data_select, NAME = NAME1)
head(doc_data_select)


下面將latitude_longitude表數據與doc_data_select表數據進行關聯,目的是將各省份的位置、名稱、人口和平均每千人醫護人員數鎖定到一起,用於下文的繪圖需要。

Province_Info <- province_location %>% left_join(., df_map, by = 'id') %>% left_join(., doc_data_select, by = 'NAME')
head(Province_Info)


將各省份詳細的輪廓經緯度數據與各省的醫療數據關聯。

latitude_longitude <- latitude_longitude %>% left_join(., Province_Info[, c('id','Population','Dct_nur')], by = 'id')
head(latitude_longitude)


目前所需數據均已準備好,包括各省中心點的經緯度、各省輪廓經緯度數據和各省流行病數據。下面就使用這些數據實現地圖的繪製。

#使用多邊形繪圖函數geom_polygon()繪製空的地圖
ggplot(data = latitude_longitude, mapping = aes(x = long, y = lat,  group = id)) + geom_polygon(colour = 'black', fill = 'white')


總覺得圖中坐標軸的存在很彆扭,該如何清除這些不必要的東西呢?

#清除不必要的附件(軸標籤、刻度標籤、刻度標記和網格線)
ggplot(data = latitude_longitude, mapping = aes(x = long, y = lat,  group = id)) + geom_polygon(colour = 'black', fill = 'white') + theme(axis.title = element_blank()) + theme(axis.text = element_blank()) + theme(axis.ticks = element_blank()) + theme(panel.grid = element_blank())


theme(axis.title = element_blank())用於清除圖中的x軸和y軸標籤

theme(axis.text = element_blank())用於清除圖中x軸和y軸的刻度標籤

theme(axis.ticks = element_blank())用於清除圖中x軸和y軸的刻度標記

theme(panel.grid = element_blank())用於清除圖中的網格線

現在,我想將各個省份的名稱貼在地圖的各個省份中,該如何實現呢?

#將各省份的名稱顯示在地圖中,這裡多個主題函數theme()可以將參數寫到一起。
ggplot(data = latitude_longitude, mapping = aes(x = long, y = lat,  group = id)) + geom_polygon(colour = 'black', fill = 'white') + scale_fill_manual(values=colours(),guide=FALSE) + geom_text(mapping = aes(x = longitude, y = latitude, label = NAME), data = Province_Info, colour = 'steelblue') + theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), panel.grid = element_blank())


不錯,就是通過圖層疊加的方法,將對於位置的省份名稱貼在地圖中。這裡通過geom_text()函數實現,需要注意的是,geom_text()函數又使用了另一個數據框的數據內容。

現在,我又想通過顏色深淺來表示「平均每千人醫護人員數」的多少,該如何操作呢?

只需將欄位Dct_nur(「平均每千人醫護人員數」)映射給地圖的填充色即可。

ggplot(data = latitude_longitude, mapping = aes(x = long, y = lat,  group = id, fill = Dct_nur)) + geom_polygon(colour = 'black') + scale_fill_gradient(low = 'green', high = 'blue') + labs(title ="Numbers of doctor nand nurse per 1000 persons in China") +  theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), panel.grid = element_blank())


發現圖中,臺灣地區的顏色為灰色,並不在對於的色階中,是因為醫療數據中沒有對應的臺灣數據。其實香港和澳門也沒響應的數據,這裡並沒法發現,是因為這兩個地區面積太小而無法識別出。

如果,我還想在地圖中再添加一個人口數量的維度,並使用氣泡圖的大小表示,該如何實現呢?

#在上一幅圖的基礎上,在繪製氣泡圖,氣泡大小表示人口數量
ggplot(data = latitude_longitude, mapping = aes(x = long, y = lat,  group = id, fill = Dct_nur)) + geom_polygon(colour = 'black') + geom_point(mapping = aes(x = longitude, y = latitude, size = Population), data = Province_Info, colour = 'red') + scale_fill_gradient(low = 'white', high = 'blue') + labs(title ="Numbers of doctor nand nurse per 1000 persons in China") + scale_size_area() + theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), panel.grid = element_blank())


這裡港澳臺地區的人口數位置,故沒有響應的氣泡。

除了可以在地圖裡添加氣泡圖,還可以往地圖裡添加條形圖,具體如下:

#實際上不是用geom_bar()函數往地圖裡添加條形圖,而是通過geom_errorbar()函數實現「條形圖」的,異曲同工,目的是在各省份中呈現條帶狀圖形。
ggplot() + geom_polygon(data = latitude_longitude, mapping = aes(x = long, y = lat,  group = id, fill = Dct_nur), colour = 'black') + geom_errorbar(mapping = aes(x = longitude, ymin = latitude, ymax =latitude + Population*50), data = Province_Info, colour = 'brown', size = 3, width = 1, alpha = 0.8) + geom_text(mapping = aes(x = longitude, y = latitude, label = NAME), data = Province_Info, colour = 'black') + scale_fill_gradient(low = 'white', high = 'blue') + labs(title ="Numbers of doctor nand nurse per 1000 persons in China") + scale_size_area() + theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), panel.grid = element_blank())


需要提醒的是,ggplot()函數裡不能傳任何參數,地圖只能在geom_polygon()函數中繪製,否則又將報錯。

由於省份中心位置不是很準確,導致有些省名稱、氣泡和條形圖沒有落在準確的位置,後期將對省份中心位置的經緯度做進一步調整。

劉順祥,天善智能社區專家。公眾號:每天進步一點點2015

Blog:https://ask.hellobi.com/blog/lsxxx2011


回復 R              R語言快速入門免費視頻 
回復 統計          統計方法及其在R中的實現
回復 用戶畫像   民生銀行客戶畫像搭建與應用 
回復 大數據      大數據系列免費視頻教程
回復 可視化      利用R語言做數據可視化
回復 數據挖掘   數據挖掘算法原理解釋與應用
回復 機器學習   R&Python機器學習入門 

相關焦點

  • 手把手教你使用ggplot2繪製折線圖
    下面來解釋一下關於折線圖的繪製。一、繪製單條折線圖有關時間序列的折線圖library(ggplot2)library(lubridate) #處理日期時間相關的R包,非常有用,強烈推薦Year <- year(seq(from = as.Date('
  • 手把手教你使用ggplot2繪製散點圖
    繪製簡單的散點圖ggplot包中的geom_point()函數可以非常方便繪製出所需的散點圖。library(ggplot2)set.seed(1234)x <- rnorm(100,mean = 2, sd = 3)y <- -1.5 + 2*x + rnorm(100)df <- data.frame(x = x, y = y)ggplot(data = df, mapping = aes
  • 【R畫圖】手把手教你使用ggplot2繪製折線圖
    一、繪製單條折線圖library(ggplot2)#有關時間序列的折線圖library(lubridate) #處理日期時間相關的R包,非常有用,強烈推薦Year <- year(seq(from = as.Date('2006-01-01'), to = as.Date('2015-01-01'), by = 'year'))Weight <- c
  • 使用REmap繪製中國地圖
    上次我們介紹了使用ggplot2繪製中國熱力地圖,需要溫習的同學可以點擊以下連結 使用ggplot2繪製中國地圖  。
  • R-ggplot2 標準中國地圖製作
    由於基礎圖表繪製系列推文還在加緊準備中,所以這期推文還是對一些感興趣的圖表進行繪製,這期涉及空間圖表繪製,主要涉及知識點如下:ggplot2 + sf 中國標準地圖繪製本期的繪圖我們是按照如下圖表進行繪製的(該圖來自朋友公號):
  • R筆記7:ggplot繪製商務圖表--地圖上的迷你柱形圖
    本例用ggplot來繪製商業圖表仿的第025號案例,地圖上的迷你柱形圖。
  • ggplot2|從0開始繪製折線圖
    其中折線圖可以反映某種現象的趨勢,本文利用R語言的ggplot2包,從頭帶您繪製各式各樣的線形圖。一  繪製單條折線圖載入數據及函數包library(ggplot2)df <- data.frame(dose=c("A", "B", "C"), len=c(5.16, 10.10, 30))head(df) dose len1 A 5.162
  • ggplot2|繪製GO富集柱形圖
    本文利用R語言的ggplot2包,從頭帶您繪製可發表級別的GO富集分析結果圖。利用各種生信工具得到富集分析結果,數據列可能不一致,但關鍵幾列都有。library(ggplot2)data <- read.csv("GO_enrichment_significant.csv",header=TRUE)head(data)參照之前ggplot2使用方法,更改geom即可繪製簡單的bar圖,按照
  • ggplot2繪製面積圖
    繪製圍繞x軸創建對稱的面積圖。) +  labs(title = "Box office per genre 1977-2019",       x = NULL,       y = "Current dollars, billions")下面來個實際的例子,使用tidytuesday提供的數據來繪製肯亞各縣的不同水源的分布圖
  • 地圖可視化繪製 | R-ggplot2 NC地圖文件可視化
    nc數據的可視化繪製由於我們使用的是ggplot2進行繪製,所以我們直接使用raster包進行nc文件的讀取(其實也是調用ncdf4包進行處理),數據我們就使用昨天分享數據的數據:數據(代碼)分享 | 全球生物氣候指標數據集。
  • R與生物專題 |第十二講 R作圖-ggplot2繪製箱式圖
    缺口在中位數及其置信區間,該置信區間通常基於中位數+/- 1.58 * IQR / sqrt(n)。缺口用於比較組;如果兩個箱式的缺口不重疊,則有力證明中位數不同。# 將可變劑量從數字轉換為因子變量ToothGrowth$dose<-as.factor(ToothGrowth$dose)head(ToothGrowth)len supp dose 1 4.2 VC 0.5 2 11.5 VC 0.5 3 7.3 VC 0.5 4 5.8
  • ggplot2繪製時間序列變化圖
    ggplot2繪製時間序列變化圖疫情時間序列變化涉及主要方法:list.files遍歷文件read_excel讀取EXCEL文件theme標題、坐標軸、圖例等文字格式、文字大小、位置設置geom_smooth平滑曲線繪製geom_point散點繪製
  • 使用Python和R繪製數據地圖的十七個經典案例
    然後,創建地圖本身就像創建任何其他ggplot可視化一樣熟悉。 這裡,還有一些更好的資源用於使用地圖、mapsdata和ggplot2: 在R中繪製地圖 http://eriqande.github.io/rep-res-web/lectures/making-maps-with-R.html 使用ggplot2軟體包在R中繪製地圖 http://zevross.com/blog/2014/
  • 數據分享|使用 R 語言繪製全球各國(地區)省級行政區劃地圖矢量數據 & 代碼
    另外你也可以從 RStata 平臺獲取:https://rstata.duanshu.com/ (會員專享,掃描開頭二維碼或點擊文末的閱讀原文即可跳轉)之前給大家分享了一份全球各國(地區)的二級行政區劃數據:數據 & 代碼分享|使用 R 語言繪製全球各國市級行政區劃地圖數據 & 代碼,這一次給大家分享一份全球各國(地區)的一級行政區劃數據和
  • 技術貼 | R語言:手把手教你畫upset集合圖
    導讀:venn可以分析不同數據集的交集,另外使用R語言UpSet函數包upset函數繪製集合圖可以更清晰的展示不同數據集的交集情況。你可能還喜歡技術貼 | R語言:ROC分析多樣性指數技術貼 | R語言:ggplot畫柱形圖、排序、著色技術貼 | R語言:手把手教你搞定ggplot柱形圖(一)技術貼 | R語言:手把手教你搞定
  • 超棒教程:如何用ggplot2繪製漂亮的統計圖形
    尺度還會繪製圖例和坐標軸,這使得從圖中讀取原始數據的值成為可能(反向映射);3)坐標系統:描述數據坐標如何映射到圖形的平面上。它還提供軸線(axes)和網格線(gridlines)來幫助閱讀圖表。我們通常使用笛卡爾坐標系,但也有其他一些方法,包括極坐標和地圖投影。4)分面:指定如何分解數據子集並將其顯示為小的圖形。
  • R語言ggplot繪製峰巒圖繪製
    峰巒圖繪製清除當前環境中的變量rm(list=ls())設置工作目錄setwd("C:/Users/Dell/Desktop/R_Plots/19ridge/")使用ggridges包繪製峰巒圖library(ggridges)library(ggplot2)#### Attaching package: 'ggplot2'## The following object is masked from 'package:ggridges':#### scale_discrete_manual# 查看示例數據head
  • 不講」武德「的論文插圖繪製,手把手教你!
    你還在為審稿人要求修改圖片煩惱嗎?你還在為圖片的排版而發愁嗎?在論文寫作中肯定需要經常繪製各種各樣的圖表,科研論文中的圖表是研究結果一種直觀的顯示方式。古語云「字如其人」,本文講「圖如其文」。首先,我們有必要了解下位圖和矢量圖的概念。位圖矢量圖矢量圖又稱為「向量圖」。矢量圖是計算機圖形中用點,直線或者多邊形等基於數學方程的幾何圖元表示的圖像。
  • 用R在地圖上繪製網絡圖的三種方法
    需要將這些節點放置在地圖上,然後繪製他們之間的連結。除了需要世界地圖(country_shape)中國家邊界外,我們還需要三個幾何對象:geom_point:繪製節點;geom_text:添加節點的標籤名字;geom_curve:繪製節點間的連線(edge)。
  • 基於ggplot2包繪製SCI學術箱線圖的保姆級教程
    具體含義可通過如下圖表進行說明:圖源網絡,侵刪本期推文使用ggplot2包來繪製箱線圖。1. 加載數據、數據在後臺回復箱線圖即可免費獲取。2. 繪製基本箱線圖使用ggplot2包繪製箱線圖很簡單,主要使用geom_boxplot()函數,先採用默認的參數繪製。