1. 程式人生 > >利用R繪製漂亮的中國地圖(無需通過google獲取)

利用R繪製漂亮的中國地圖(無需通過google獲取)

ggmap

說起用R繪製中國地圖,很多有經驗的老司機肯定會推薦ggmap,無論是裡面自帶的各種地區繪圖、經緯度查詢以及可以與ggplot無縫銜接繪製地區統計圖,這都是R中其它繪製地圖所難以超越的優勢。

但奈何校園網現在時不時抽風,常年處於R無法獲取上ggmap裡面的地圖(其實是連不上google)。當我想匯入中國地圖時,就會出現如下圖所示的問題。
報錯資訊
由於數模所需,為了硬著頭皮進行繪製,那怕醜一些,所以探索出了下面兩種不需要翻牆的繪製中國地圖的方法。

maps + mapdata

這種方式繪製中國地圖非常的簡單,只需要一行程式碼(注意要先呼叫兩個R包maps, mapdata):

map("china", col = "red4", ylim = c(18, 54), panel.first = grid())

便可以得到如下圖所示的繪製結果。

但這幅圖只是一幅單純的中國地圖,如果我們想要插入部分城市的人口資料以及其它資訊,該如何新增呢?(資料來源:2015-2016年中國城市人口數量排名

首先來看看我們的資料資訊(程式碼有點醜,不要在意這些細節):

beijing = c('北京&天津', 39.90419989999999, 116.4073963, 1961.24 + 1293.82)
shanghai = c('上海', 31.2303904, 121.4737021, 2301.91)
zhengzhou = c('鄭州', 34.7472541716, 113.6249284647, 862.65)
wulumuqi = c('烏魯木齊', 43.8266013700, 87.6168405804, 311.03)
haerbin = c('哈爾濱', 45.8021755616, 126.5358247345, 1063.6)
xian = c('西安', 34.3412614674, 108.9398165260, 846.78)
wuhan = c('武漢', 30.5927599029, 114.3052387810, 978.54)
chengdu = c('成都', 30.5702183724, 104.0647735044, 1404.76)
lasa = c('拉薩', 29.6441135160, 91.1144530801, 55.94)
chongqing = c('重慶', 29.5647048135, 106.5507137149, 2884.62)
kunming = c('昆明', 24.8796595146, 102.8332118852, 643.2)
guangshen = c('廣州&深圳', 23.0206747828, 113.7517837567, 1270.08 + 1035.79)

cities = c(beijing, shanghai, zhengzhou, wulumuqi, haerbin, xian, wuhan,
           chengdu, lasa, chongqing, kunming, guangshen)
mat.cities = as.data.frame(matrix(cities, ncol = 4, byrow = T), stringsAsFactors = F)
names(mat.cities) = c('names', 'lat', 'long', 'population')
mat.cities$population = as.numeric(as.character(mat.cities$population)) / 100
mat.cities$lat = as.numeric(as.character(mat.cities$lat))
mat.cities$long = as.numeric(as.character(mat.cities$long))

具體操作其實也非常簡單:使用for迴圈搭配基礎的points()函式,使用如下所示的程式碼即可:

map("china", col = "red4", ylim = c(18, 54), panel.first = grid())
for (i in 1:12) {
  points(mat.cities$long[i], mat.cities$lat[i], cex = 1.5, pch = 16)
}
title('Population')

這裡應該還需要用其它資訊來展現我們的人口數,但是由於這個繪圖不是很漂亮,所以就不進行接下來的操作了。後面介紹一個更漂亮的不翻牆繪製人口地圖的方法——ggplot

+ mapdata

ggplot2 + mapdata

話不多說,直接用我們前面生成的資料進行繪製。這裡講一下大概的流程:

  • 同上一種方式,利用map()函式產生中國地圖的輪廓(如果能上google,使用ggmap當然更好)。
  • 使用ggplot進行繪圖:
    1. 使用geom_path()函式將我們生成的中國地圖的輪廓繪製出來,這裡修改顏色,選擇清新自然的粉色;
    2. geom_point()將各個城市的位置用散點點上,同時點的大小表示人口的多少,這裡用清新藍;
    3. geom_text()在每個點上新增上城市的名稱;
    4. 修改各個標籤以及各種title的名稱;
    5. 進行修改主題、Mac上顯示中文字等操作。
china <- map("china", plot = F)
ggplot() + 
  geom_path(data = china, aes(long, lat, group = group), color = '#FD9FA4', show.legend = F) +
  geom_point(data = mat.cities, aes(x = long, y = lat, size = population), alpha = 0.8, color = '#8BB6D6') +
  # geom_text_repel(data = mat.cities, aes(x = long, y = lat, label = names), family = "STHeiti") +
  geom_text(data = mat.cities, aes(x = long, y = lat, label = names), family = "STHeiti") +
  labs(x = '經度', y = '緯度', title = '中國十二個地區人口地圖', size = '人口(百萬)') + 
  theme_bw() +
  theme(panel.border = element_blank(),
        text = element_text(family = "STHeiti"),
        plot.title = element_text(hjust = 0.5))

產生出來的影象如下圖所示:
人口圖1

這樣的圖已經基本算作是能看的了,但這並不是強迫症患者所最終追求的繪圖。其美中不足的是每個城市的名稱覆蓋在我們的散點上了。

通常我們的做法非常簡單,在geom_text()中設定引數,將所有的文字向上下左右選一個方向,防止覆蓋。這樣做當然沒問題,這裡介紹另一種方法,可以進行自適應調整以防覆蓋。

ggrepel

我們的做法是使用ggrepel包中的geom_text_repel()函式替換掉我們原本的geom_text(),細心的同學已經發現,這就是我們上面程式碼註釋掉的部分。這時只需將其封印解除,同時封印住geom_text()這個小頑皮,我們的繪圖就大功告成了!
人口地圖2

最後吐槽一下:這個新版CSDN編輯器的插入R程式碼是怎麼肥四,全是一種顏色,程式碼看著很難受。

相關推薦

利用R繪製漂亮中國地圖無需通過google獲取

ggmap 說起用R繪製中國地圖,很多有經驗的老司機肯定會推薦ggmap,無論是裡面自帶的各種地區繪圖、經緯度查詢以及可以與ggplot無縫銜接繪製地區統計圖,這都是R中其它繪製地圖所難以超越的優勢。 但奈何校園網現在時不時抽風,常年處於R無法獲取上ggmap裡

百度地圖API繪製計程車流向地圖:將起始GPS點對映到地圖

打算在年前實現用百度地圖API繪製NYC計程車流向地圖。目前實現了將出租車的起始點的GPS點對映到地圖上,繪製了GPS點的熱力圖。記錄在此。 所用資料:NYC綠色計程車資料 時間:2016.01.01 0:00-24:00 共24小時 GPS點個數:64398 繪圖方式:熱力圖 百度地圖

如何利用github搭建個人網站無需購買雲伺服器

1.建立GithubPage 這裡的作用就是說在github上建立一個倉庫,並且將它設定成github的網頁模式,其實我們後面的域名只是跳轉到這個倉庫的頁面 首先新建一個倉庫 然後注意設定倉庫名字時要和你的githubID一模一樣,即xxx.github.io 然後建

使用EXCEL繪製三維地圖超簡單的五分鐘繪製地圖方法,媽媽再也不用擔心我不會畫地圖啦~

    博主為從區域規劃轉行地圖學的小學渣一枚,最近處理資料希望對結果進行三維視覺化,意外發現從小用到大的EXCEL可以繪製地圖且功能非常強大,在這裡做一下簡單介紹,希望可以給看官提供些許幫助。那下面就開始吧1 前戲1.1版本    Office2013及以上版本。1.2Po

R語言 : 畫中國地圖

from http://www.klshu.com/1323.html china_map.R 程式碼如下 par(mar=rep(0,4)) dat <- read.csv("D:/test/china.csv", header=T) library(maps)

Windows下快速安裝Xgboost無需Git或者VS

nor port 最終 比賽 http 無需 windows git 到你 xgboost的全稱是eXtreme Gradient Boosting,現在已經風靡Kaggle、天池、DataCastle、Kesci等國內外數據競賽平臺,是比賽奪冠的必備大殺器!如果

利用MUI滑動進行利息計算移動端APP顯示

this 運行 row class mage -a 比較 top 2個 在開發移動端的應用時,會用到很多的手勢操作,比如滑動、長按等,為了方便開放者快速集成這些手勢,mui內置了常用的手勢事件,其中滑動應用是比較常見的應用操作,本篇文章將講述如何利用滑動改變對應值進行計算和

表的重新再同步無需時間窗口

gate 腳本 啟動 並且 文件 cti 初始 back 通過 表的重新再同步(無需時間窗口) 如果是某些表由於各種原因造成兩邊數據不一致,需要重新進行同步,但實際業務始終24小時可用,不能提供時間窗口, 則可以參照以下步驟。(因較為復雜,使用需謹慎!) 1)確認e

百度地圖多點定位+聚合

初始化 默認 each 直接 搜索 不能 行政 參數 全部 首先頁面引用必須的兩個JS <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的Key值">

如何利用kmeans將數據更加準確地聚類---利用隱含變量最佳類別EM算法思想實現

空間 算法 mage ref 變化 val and 情況 ble K-means也是聚類算法中最簡單的一種了,但是裏面包含的思想卻是不一般。最早我使用並實現這個算法是在學習韓爺爺那本數據挖掘的書中,那本書比較註重應用。看了Andrew Ng的這個講義後才有些明白K-mean

LaTex中文編譯無需特殊編輯器

LaTex中文編譯(無需特殊編輯器) 本文記錄了用Latex編寫中文文件的方法,非常簡單。更新於2018.10.18。 \documentclass[UTF8]{article} \usepackage{CTEX} \begin{document} ... \end{docume

C#實現.Net對郵件進行DKIM簽名和驗證,支援附件,傳送郵件簽名後直接投遞到對方伺服器無需己方郵件伺服器

專案地址 github.com/xiangyuecn/… 主要支援 對郵件進行DKIM簽名,支援帶附件 對整個郵件內容(.eml檔案)的DKIM簽名進行驗證 對MailMessage、SmtpClient進行了一次封裝,傳送郵件簡單易用,進行DKIM簽名後直接投遞到對方伺服器(無需己方郵件

Django通過Ajax利用FormData動態提交表單包括檔案,字串

0 需求背景 有的時候我們上傳表單,經過後臺處理之後再分發回原來頁面,這時必定會重新整理這個頁面。為了解決這個問題,我們採用JS動態提交表單元素,如:file、text等型別,可以很好的解決這一問題。 1 DOM結構 <form method="post" enctype=

繪製指定屬性圖形以圓為例2.0

package javaPractice; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; public class Point { public static void

利用遞歸實現深拷貝常見面試題之一

利用 實現思路 參數 面試題 由於 遞歸實現 但是 log 對象 淺拷貝和深拷貝的區別: 淺拷貝 : 只是將數據中所有的數據引用下來,依舊指向同一個存放地址,拷貝之後的數據修改之後,也會影響到原數據的中的對象數據 深拷貝: 將數據中所有的數據拷貝下來,對拷貝之後的數據進行修

利用Clonezilla備份還原Linux系統 轉載別人的知識

利用Clonezilla備份還原Linux系統     硬體平臺:研華COME模組,Intel (R) Atom (TM) CPU N2600 @1.60 G

使用R語言進行時間序列arima,指數平滑分析

讀時間序列資料 您要分析時間序列資料的第一件事就是將其讀入R,並繪製時間序列。您可以使用scan()函式將資料讀入R,該函式假定連續時間點的資料位於包含一列的簡單文字檔案中。   資料集如下所示: Age of Death of Successive Kings of England#sta

利用遞迴實現深拷貝常見面試題之一

淺拷貝和深拷貝的區別: 淺拷貝 : 只是將資料中所有的資料引用下來,依舊指向同一個存放地址,拷貝之後的資料修改之後,也會影響到原資料的中的物件資料 深拷貝: 將資料中所有的資料拷貝下來,對拷貝之後的資料進行修改不會影響到原資料 實現思路: 將要拷貝的資料

利用libjpeg-turbo庫壓縮影象RGB、YUV等為jpg

簡介 libjpeg-turbo是libjpeg的升級版,它 的價值是利用SIMD指令集,加速了編解碼過程。官網上的介紹中提到某個案例中從原來的0.3左右降低到0.1,時間只有原來的1/3,在我的工

利用tkinter實現簡單計算器功能不使用eval函式

利用tkinter實現簡單計算器功能(不使用eval函式) 一、思路 tkinter: 佈置主介面; 上部為數字顯示介面; 下部為數字鍵與功能鍵介面; 邏輯: 程式只考慮兩個運算元進行計算的情況,不考慮複雜情況 展示: