1. 程式人生 > >用R軟體繪製中國分省市地圖

用R軟體繪製中國分省市地圖

【注】新版本的maptools包對很多函式進行了修改,對於修改的內容,文章中用紅色的文字進行了說明。

        鑑於最近有不少人在討論用R軟體繪製地圖的問題,我也就跟著湊了湊熱鬧,對相應的方法學習了一番。下面的這篇文章是一個初步的介紹,還有很多內容仍在學習和探索中,如果大家有什麼意見或建議,我將根據自己學習的情況對文章進行進一步的補充。

        在R中繪製地圖其實是十分方便的,最直接的辦法大概就是安裝maps和mapdata這兩個包,然後輸入下面的命令:

        library(maps)
        library(mapdata)
        map("china")

        其中map()函式還可以加上很多引數,在這裡就不一一詳述,具體的用法只需問號之。然而仔細看一看這張地圖你會發現重慶市和四川省仍然是渾然一體,可見該地圖的資料應該是有些年頭了。

        幸運的是,通過謝益輝的這篇博文我們已經可以大體知道該如何操作了,下面就為大家介紹一下具體的步驟。

        首先,從這裡下載中國地圖的GIS資料,這是一個壓縮包,完全解壓後包含三個檔案(bou2_4p.dbf、bou2_4p.shp和bou2_4p.shx),將這三個檔案解壓到同一個目錄下,並在R中設好相應的工作空間,然後安裝maptools包,執行如下程式:

        library(maptools);
        x=read.shape('bou2_4p.shp');#下文中會繼續用到x這個變數,
                                    #如果你用的是其它的名稱,
                                    #請在下文的程式中也進行相應的改動。
        plot(x);

        【修改】新版本的maptools包不再提供read.shape()函式,請用readShapePoly()代替。

        這時一張完整的中國地圖就已經畫好了。但是在實際使用的過程中,我們往往會根據自己的需要對地圖中的某些省份著以特定的顏色,這時就可以通過調節plot命令中的fg引數來予以實現。然而為了清楚地說明這部分的內容,我需要插播一段R繪製地圖的原理。

        在繪製地圖時,每一個省市自治區或者島嶼都是用一個多邊形來表示的。之前的GIS資料,其實就是提供了每一個行政區其多邊形逐點的座標,然後R軟體通過順次連線這些座標,就繪製出了一個多邊形區域。在上面的資料中,一共包含了925個多邊形的資訊,之所以有這麼多是因為一些省份有很多小的附屬島嶼。在這925個多邊形中,每一個都對應一個唯一的ID,編號分別從1到925。

        回到剛才的話題,plot命令中的fg引數在本例中應該是一個長度為925的向量,其第i個分量的取值就代表了地圖中第i個多邊形的顏色。一個簡單的嘗試是執行下面這個命令看看效果:

        plot(x,fg=gray(924:0/924));

        【修改】新版本的maptools包的繪圖引數也有所改變,請將fg換成col。

        於是自然就產生了一個問題:如何獲取某一個特定地區的ID,進而設定我們想要的顏色?事實上,在變數x中,就已經儲存了我們想要的資訊。在R中輸入“x[[2]]”或“x$att.data”,會得到一個925行7列的資料框,這其實是bou2_4p.dbf這個檔案中儲存的資訊,之前的read.shape()函式雖然讀取的是bou2_4p.shp檔案,但在預設情況下會把dbf檔案的資訊也放到變數之中。對於這個資料框,其行名就是每一個區域的ID編號,第一列和第二列分別是面積和周長,最後一列是該區域所屬的行政區名,其它的列應該也是一些編號性質的變數。於是,通過查詢相應的行政區對應的行名,就可以對fg引數進行賦值了。下面是我編的一個函式,用來生成所需的fg向量:

        getColor=function(mapdata,provname,provcol,othercol)
        {
        	f=function(x,y) ifelse(x %in% y,which(y==x),0);
        	colIndex=sapply(mapdata$att.data$NAME,f,provname);
        	fg=c(othercol,provcol)[colIndex+1];
        	return(fg);
        }

        【修改】地圖資料的組織形式有所變化,上面函式中的mapdata$att.data$NAME需要替換為[email protected]$NAME。

        其中mapdata是存放地圖資料的變數,在上面的例子中就是x,provname是需要改變顏色的地區的名稱,provcol是對應於provname的代表顏色的向量(名稱和數字均可),othercol是其它地區的顏色。舉例如下:

        provname=c("北京市","天津市","上海市","重慶市");
        provcol=c("red","green","yellow","purple");
        plot(x,fg=getColor(x,provname,provcol,"white"));

        注意provname一定要寫地區的全稱,寫法可以參照下面這條命令生成的向量:

        as.character(na.omit(unique(x$att.data$NAME)));

        由此生成的向量有33個元素,少了澳門特別行政區,這是這個資料中的一塊瑕疵。在x$att.data的第899行有一個NA,不知道它代表的是否就是澳門。

        利用類似的方法就可以根據自己的需要對不同的區域進行著色,下面再舉一例。從國家統計局獲取2007年我國各地區的人口資料,然後根據人口的多少對各省份進行著色。程式如下:

        provname=c("北京市","天津市","河北省","山西省","內蒙古自治區",
	        	"遼寧省","吉林省","黑龍江省","上海市","江蘇省",
	        	"浙江省","安徽省","福建省","江西省","山東省",
	        	"河南省","湖北省","湖南省","廣東省",
	        	"廣西壯族自治區","海南省","重慶市","四川省","貴州省",
	        	"雲南省","西藏自治區","陝西省","甘肅省","青海省",
	        	"寧夏回族自治區","新疆維吾爾自治區","臺灣省",
	        	"香港特別行政區");
        pop=c(1633,1115,6943,3393,2405,4298,2730,3824,1858,7625,
        		5060,6118,3581,4368,9367,9360,5699,6355,9449,
        		4768,845,2816,8127,3762,4514,284,3748,2617,
	        	552,610,2095,2296,693);
        provcol=rgb(red=1-pop/max(pop)/2,green=1-pop/max(pop)/2,blue=0);
        plot(x,fg=getColor(x,provname,provcol,"white"),xlab="",ylab="");

        其中顏色越深的地方代表人口數越多,反之為人口數越少。

        此外,在繪製地圖的過程中,還有一個比較有用的引數是recs,它是一個由多邊形ID組成的向量,表示在地圖中只畫出這些ID所代表的區域。利用這個引數,就可以畫出某一部分的地圖,例如下面的例子是我國中部六省的地圖:

        getID=function(mapdata,provname)
        {
                index=mapdata$att.data$NAME %in% provname;
        	ids=rownames(mapdata$att.data[index,]);
        	return(as.numeric(ids));
        }
        midchina=c("河南省","山西省","湖北省","安徽省","湖南省","江西省");
        plot(x,recs=getID(x,midchina),fg="green",ol="white",xlab="",ylab="");

        上面的getID()是我編寫的一個功能與getColor()類似的函式,用來返回指定省份的ID。

        【修改】新版本的maptools包的繪圖函式已經取消了recs這個引數,現在要實現這個功能,可以在顏色上把不需要的省份變成白色,其中填充色用col引數,邊界顏色用border引數。例如上面的例子可以用下面的函式來實現:

        plot(x, col = getColor(x, midchina, rep("green", 6),
            "white"), border = "white", xlab = "", ylab = "")

        最後要說的是,在畫出的圖上仍然可以用points()函式和text()函式加上點和文字,而maptools包中還提供了一個pointLabel()函式,用來解決文字標籤的重疊問題。這部分內容請參閱博文:用R畫中國地圖並標註城市位置,以及避免文字標籤重疊:maptools中的pointLabel()。

        從以上的內容來看,本文所述的都是一些最基本的繪圖方法,還沒有對地理資訊資料進行更進一步的分析。如果有機會的話,這一主題的下一篇文章將為大家介紹地圖資料的組成結構,並說明如何將不同格式的地理資料整合起來,例如如何在上面的地圖上繪製出我國的鐵路、水系分佈等內容。

相關推薦

R軟體繪製中國省市地圖

【注】新版本的maptools包對很多函式進行了修改,對於修改的內容,文章中用紅色的文字進行了說明。         鑑於最近有不少人在討論用R軟體繪製地圖的問題,我也就跟著湊了湊熱鬧,對相應的方法學習了一番。下面的這篇文章是一個初步的介紹,還有很多內容仍在學習和探索中

R軟體包ROCR畫ROC曲線

        ROC曲線可以簡單、直觀得觀察分析方法的臨床準確性,並可用肉眼作出判斷。ROC以真陽性率(靈敏度FPR)為縱座標,假陽性率(1-特異度TPR)為橫座標繪製的曲線,可準確反映某分析方法特異性和敏感性的關係,是試驗準確性的綜合代表。ROC曲線不固定分類界值,允許

matlab繪製中國地圖

   reference:https://jingyan.baidu.com/article/870c6fc36fdacfb03ee4be58.html        shp: http://muchong.com/html/201304/574

echarts.js製作中國地圖,點選對應的省市連結到指定頁面

這裡使用的是ECharts 2,因為用EChart 3製作的地圖上的省市文字標識會有重疊,推測是引入的地圖檔案china.js,繪製文字的座標方面的問題,所以,這裡還是使用老版本。 ECharts 2需要require載入模組。html中只需要用script引入echarts.js即可。 具體程式碼如下:

閒來無事,在微信推文中看到一個炫酷的具有動態特效的中國地圖,是R語言做的,於是嘗試了一下

[toc] # 最終的效果圖如下: ![](https://img2020.cnblogs.com/blog/1692343/202103/1692343-20210330160758328-1708125696.png) ![](https://img2020.cnblogs.com/blog/16923

vue + echart +map中國地圖省市地圖,區縣地圖

第一步:安裝依賴包 npm install echarts --save 在main.js 中全域性引入import echarts from 'echarts' Vue.prototype.$echarts = echarts 第二步:引入地圖檔案(此處路徑

C#和ArcGIS Engine實現在地圖繪製形狀

初始化時將地圖控制元件MapControl傳進來,繪製過程中監聽滑鼠操作事件,適情況隱藏父級窗體,繪製點、多段線、多邊形、圓形、矩形等。 public class DrawGeometryHelper { private IMapControl2 m_pMap

R語言進行位數迴歸

非線性分位數迴歸這裡的非線性函式為Frank copula函式。     (六)非線性分位數迴歸     這裡的非線性函式為Fran

R語言的quantreg包進行位數回歸

mit perl package html enter 思想 anti res comment 什麽是分位數回歸 分位數回歸(Quantile Regression)是計量經濟學的研究前沿方向之一,它利用解釋變量的多個分位數(例如四分位、十分位、百分位等)來得到被解釋變量

R語言進行位數迴歸:基礎篇

用R語言進行分位數迴歸:基礎篇                        

R語言進行位數回歸:基礎篇

ron 理學 style 位數 ext wan r語言 center 基礎篇 用R語言進行分位數回歸:基礎篇 詹鵬 (北京師範大學經濟管理學院 北京) http://www.xiaowanxue.com/up_files/20

【RPG Maker MV】使用技巧1:自己繪製的圖片當做地圖

因為RPG Maker MV本身提供的地圖素材可能無法滿足需求,比如我想繪製一個大型的建築物,圖形如下: 這是,我們要怎麼處理呢? 這時,我們可以用RPG Maker 提供的遠景圖來完成這一效果。具體操作如下: 首先把你的圖片處理成合適的大小,RPG Make

繪製流程圖什麼軟體好?你選對了嗎?

  流程圖可以讓複雜的資料流程圖可以讓複雜的資料清楚的條例出來,使用或者觀看的時候更加方便。流程圖中用圖表、圖形的方式表現事物的邏輯關係,相比文字來說更加形象、易懂一些。那麼做流程圖什麼軟體比較好呢?接下來小編就給大家推薦一款比較好用的流程圖,看看你選對軟體了沒。   流程圖的作用:   1

軟體思想-軟體與合

軟體複用的主要思想是,將軟體看成是由不同功能部分的“元件”所組成的有機體,每一個元件在設計編寫時可以被設計成完成同類工作的通用工具,這樣,如果完成各種工作的元件被建立起來以後,編寫一特定軟體的工作就變成了將各種不同元件組織連線起來的簡單問題,這對於軟體產品的最終質量和維護工作都有本質性的改變。  

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)

arcgis api for js入門開發系列二十一 HTML5 canvas繪製地圖 瓦片載入平移縮放

  終於開始可以寫程式碼了,手都開始癢了。這裡的程式碼僅僅是在chrome檢測過,我可以肯定的是IE10以下瀏覽器是行不通,我一直在考慮,是不是使用IE禁止看我的篇部落格,就是這群使用IE的人,給我加了很多工作量。     一個地圖的基本動作,無非就是載入資料,

在高德地圖svg.js繪製簡單圖形

> 這段時間做的一個專案,需要在地圖上繪製簡單的圖形。在學習高德地圖`JS API`的過程中,發現高德地圖提供的點、線等API並不能滿足我的需求,還好它開放了自定義圖層`CustomLayer`,官方說自定義圖層支援`canvas`、`svg`、甚至`dom`,這裡我用的是`svg`,多說無益,上程式碼

Python繪製全球疫情變化地圖

目前全球疫情仍然比較嚴重,為了能清晰地看到疫情爆發以來至現在全球疫情的變化趨勢,我繪製了一張疫情變化地圖,完整程式碼共 230 行,需要的朋友在公眾號回覆關鍵字 疫情地圖 即可。 廢話不多說,先上圖 下面就來重點介紹下上面這張圖的繪製過程,主要分為以下三個步驟: 資料收集 資料處

【程序5】 題目:利用條件運算符的嵌套來完成此題:學習成績>=90的同學A表示,60-89之間的B表示,60以下的C表示。 1.程序分析:(a>b)?a:b這是條件運算符的基本例子。

window code 例子 prompt 利用 學習 amp text span if…else語句相對比較多,但是容易理解 1 var scroe = window.prompt("請輸入1-100之間的數") 2 scroe = parseInt

springbootthymeleaf模板的paginate

display source for charset lan 引擎 封裝 protected hiberna 本文根據一個簡單的user表為例,展示 springboot集成mybatis,再到前端分頁完整代碼(新手自學,不足之處歡迎糾正); 先看java部分 pom.xm