標籤:

怎麼用R語言繪製英文中國地圖,標註英文省名,以及在不同的省份填充指定的顏色?

R繪製英文中國地圖,並對某些省份填充指定的顏色。


如果你需要繪製靜態的地圖可以使用

library(maps)
library(mapdata)

這兩個R Package,具體操作步驟可以參考yixuan的這篇文章:QiuYixuan: 用R軟體繪製中國分省市地圖

我在這裡就不再重複說明了。R這麼強大的統計分析工具當然不滿足一個弱爆了的靜態地圖,所以R同樣可以繪製出更強大的互動式地圖(interractive map)。

接下來我就告訴大家怎麼利用R來繪製互動式地圖。哦,對了,首先回答你的問題,如果我沒有理解錯的話,你是想根據數據來為不同的省份標記不同的顏色對吧?

就如上圖一樣?比如說根據不同省份的人口標記不同的顏色?顏色越深代表該省份人口越多?如果這是你想要的效果的話,下面我就來解釋一下怎麼可以繪製出這樣的互動式地圖。所謂互動式地圖,就是當你對地圖進行操作的時候,地圖會做出相應的回應,就比如說上面的這幅地圖,當你點擊某個省份的時候,地圖就會自動彈出一個窗口顯示出該省的省份名稱和該省的人口數量。
無論你需要繪製哪個國家的地圖,首先第一步是找到該國家的shape文件,所謂shape文件就別人製作好的一種空間開放文件,具體到底是什麼可以參考維基百科(https://zh.wikipedia.org/wiki/Shapefile)。
去哪裡找shape文件:Download | Global Administrative Areas 這個也是我當時做公司Project的時候找到的一個網站。上面基本可以下載各個國家的shapefile,不客氣。
然後找到中國的shapefile之後下載下來,就可以去R裡面繪製地圖了。這裡需要2個R Packages。分別是:

library(leaflet)
library(rgdal)

其中leaflet就是繪製互動式地圖的核心包了,詳情請見:Leaflet for R

直接上代碼了:

#導入leaflet 和rgdal包
library(leaflet)
library(rgdal)
#設置你下載的shapefile的路徑
dns &<- "C:/R/Chinashape" #獲取shape文件 fn &<- list.files(dns, pattern=".shp", full.names=FALSE) fn&<-gsub(".shp", "", fn) #讀取shape文件 shape &<- readOGR(dns, fn) #獲取人口數據 population &<- read.csv("C:/Chinashape/CHN_adm1.csv", header = TRUE) #把人口數據合併到shape@data下 shape &<- merge(shape, population, by = "NAME_1") #設置彈出窗口 i_popup &<- paste0("&Province: &", shape$NAME_1, "&", "&Population: &", shape$Population)
#設置顏色範圍
pal &<- colorQuantile("YlOrRd", NULL, n = 5) #繪製地圖 leaflet(shape) %&>% addTiles() %&>% setView(103.842773, 34.597042, zoom = 4) %&>%
addPolygons(fillColor = ~pal(shape$Population), fillOpacity = 0.8, color = "#000000", weight = 1, popup = i_popup)

當然leaflet還可以繪製很多其他有趣的地圖,比如當時我一個朋友說美國有什麼好的,整天不是被恐怖襲擊就是發生大規模槍殺案,動不動就死那麼多人,還是中國安全。我想說其實我是愛美國佬的銀子啊啊啊。不過美國確實沒什麼好的。

我當時無聊為了反駁他們,然後我就用leaflet搞出來幾個地圖,然後他們再也沒有跟我討論過這個問題了。

這幅地圖顯示了從1970年到現在恐怖事件發生的次數。

動態地圖鏈接:http://mingju.net/uploads/World_Terrorism_Overview.html

恐怖事件在美國造成的死亡人數,圈圈越大死的越多。

動態地圖鏈接:http://mingju.net/uploads/Death_from_Terrorism_US.html

恐怖事件在中國造成的死亡人數,圈圈越大死的越多。
動態地圖鏈接:http://mingju.net/uploads/Death_from_Terrorism_China.html

話說我這麼玩不會被請去喝咖啡吧?不要舉報我。

另外你還可以在地圖上定位坐標點,比如說我喜歡喝咖啡,所以我想知道世界上的星巴克咖啡店都在哪裡(但是其實我並不喜歡星巴克的咖啡,甜的要死有什麼好喝的?搞不懂)。我就可以畫出一張這樣的地圖來定位星巴克咖啡店的位置。

動態地圖鏈接:http://mingju.net/uploads/Worldwide_Starbucks_Stores.htmlhttp://mingju.net/uploads/Worldwide_Starbucks_Stores.html

#以下為更新來回答提問者的問題:
目前根據QiuYixuan: 用R軟體繪製中國分省市地圖的方法,暫時不能滿足你標註英文名稱在地圖上的需求,但是可以根據省份標記不同的顏色。以下為代碼:

library(maptools) x &<- readShapePoly("CHN_adm1.shp") getColor=function(mapdata,provname,provcol,othercol) { f=function(x,y) ifelse(x %in% y,which(y==x),0); colIndex=sapply(x@data$NAME_1,f,provname); col=c(othercol,provcol)[colIndex+1]; return(col); } provname=c("Anhui","Beijing","Chongqing","Fujian") provcol=c("red","red","yellow","purple") plot(x,col=getColor(x,provname,provcol,"white"))

@兩宋風雲

library(maptools) x &<- readShapePoly("bou2_4p.shp") getColor=function(mapdata,provname,provcol,othercol) { f=function(x,y) ifelse(x %in% y,which(y==x),0); colIndex=sapply(iconv(x@data$NAME,from="CP936", to="UTF-8"),f,provname); col=c(othercol,provcol)[colIndex+1]; return(col); } provname=c("黑龍江省", "江蘇省", "浙江省", "江西省", "山東省", "湖北省", "四川省", "甘肅省") provcol=c("grey","grey","grey","grey","grey","grey","grey","grey") plot(x, col = getColor(x,provname,provcol,"white"), xlab = "", ylab = "") title("Map of China")


R語言地圖數據繪製

本次地圖繪製採用R語言中ggplot包實現,ggplot包是R語言包中的「太極圖」(太極生兩儀,兩儀生四象),用ggplot包作者的話就是ggplot可以畫出任何圖形(有點絕對了)。

中國地圖(熱力圖)

1、maps包

R語言中有繪製地圖的包,載入後可繪製地圖

library(maps)

map()

maps包繪製世界地圖和美國地圖毫無壓力

map("state")

map("county")

map("italy")

maps包中只有詳細的美國地圖和少量國家的地圖,所以繪製中國地圖信息無法通過maps包。

2、mapdata包

library(mapdata)

library(plyr)

map("china")

但是本地圖由於包中GIS信息老化,沒有重慶數據,所以無法採用。

3、ggplot2繪製中國地圖

從國家基礎地理信息中心下載中國地圖的GIS數據。

載入maptools包,讀取空間文件

library("maptools")

china_map
= readShapePoly("bou2_4p.shp")

plot(china_map)

但是,本次繪製的地圖形狀有些扁平。這是因為在圖形繪製過程中,默認把經度和緯度作為普通數據,均勻平等對待,繪製在笛卡爾坐標繫上。其實球面圖形如何映射到平面圖上,在地理學上有一系列不同的專業演算法。所以基於經緯度數據的地圖信息不能華仔笛卡爾坐標系中而應當繪製在地理學專業坐標系中。對於這個問題,R語言中ggplot2包提供了coord_map()函數。

library(ggplot2)

ggplot(china_map,aes(x=long,y=lat,group=group))
+


geom_polygon(fill="white",colour="grey") +

coord_map("polyconic")

mydata&<-read.csv("F:/111.csv")

china_data
&<- join(china_map_data, mydata, type="full")

ggplot(china_data,
aes(x = long, y = lat, group = group, fill = 信息社會指數)) +

geom_polygon(colour="grey40") +


scale_fill_gradient(low="white",high="red") +

coord_map("polyconic")

刪除坐標軸、經緯度線、背景色

ggplot(china_data,
aes(x = long, y = lat, group = group,fill = 信息社會指數)) +

geom_polygon(colour="grey40") +


scale_fill_gradient(low="white",high="red") +

coord_map("polyconic") +

theme(

panel.grid = element_blank(),

panel.background = element_blank(),

axis.text = element_blank(),

axis.ticks = element_blank(),

axis.title = element_blank(),

legend.position = c(0.2,0.3)

)

添加省名標籤

midpos
&<- function(x) mean(range(x,na.rm=TRUE))

centres
&<- ddply(china_data,.(province),colwise(midpos,.(long,lat)))

ggplot(china_data,aes(long,lat))+

geom_polygon(aes(group=group,fill=信息社會指數),colour="black")+


scale_fill_gradient(low="white",high="red") +

coord_map("polyconic") +

geom_text(aes(label=省份),data=centres)
+

theme(

panel.grid = element_blank(),

panel.background = element_blank(),

axis.text = element_blank(),

axis.ticks = element_blank(),

axis.title = element_blank()

)

ggplot(china_data,aes(long,lat))+

geom_polygon(aes(group=group,fill=信息社會指數),colour="grey60")+


scale_fill_gradient(low="white",high="red") +

coord_map("polyconic") +

geom_text(aes(x = jd,y = wd,label = province),
data =province_city)+

theme(

panel.grid = element_blank(),

panel.background = element_blank(),

axis.text = element_blank(),

axis.ticks = element_blank(),

axis.title = element_blank()

)

省份地圖

關於為什麼不用北京市的,因為shapefile文件中北京市的區縣沒有。

library(maptools)

CHN_adm2&<-readShapePoly("CHN_adm/CHN_adm2.shp")

plot(CHN_adm2)

library(ggplot2)

CHN_adm2_1
&<- fortify(CHN_adm2)

x
&<- CHN_adm2@data

xs
&<- data.frame(x,id=seq(0:344)-1)

library(plyr)

china_map_data
&<- join(CHN_adm2_1, xs, type = "full")

取出安徽省子集

Anhui&<-subset(china_map_data,NAME_1=="Anhui")

unique(Anhui$NAME_2)

讀取安徽各市2013年GDP數據

mydata=read.csv("F:/222.csv")

Anhuidata&<-join(Anhui,mydata,type="full")

midpos
&<- function(x) mean(range(x,na.rm=TRUE))

centres
&<- ddply(Anhuidata,.(city),colwise(midpos,.(long,lat)))

ggplot(Anhuidata,aes(long,lat))
+


geom_polygon(aes(group=group,fill=GDP),colour="white") +


scale_fill_gradient(low="white",high="red") +

geom_text(aes(label=city),data=centres) +

theme(

panel.grid = element_blank(),

panel.background = element_blank(),

axis.text = element_blank(),

axis.ticks = element_blank(),

axis.title = element_blank()

)

中國地圖(柱狀圖)

library(maptools)

library(ggplot2)

library(plyr)

#讀取地圖空間數據

china_shp
= readShapePoly("bou2_4p.shp")

#將讀取的數據轉化為dataframe(數據框)

china_map&<-fortify(china_shp)

#讀取業務數據

mydata&<-read.csv("F:/333.csv")

#讀取省會城市坐標數據

province_city&<-read.csv("F:/chinaprovincecity1.csv")

#業務數據和省會城市坐標信息合併

province_data&<-join(province_city,mydata,type="full")

#繪製圖表

ggplot()+

geom_polygon(aes(x=long,
y=lat, group=group), data=china_map, fill="beige",
colour="grey60") + #畫地圖底圖

geom_errorbar(aes(x=jd-0.5,
ymin=wd, ymax=wd+X2015ISI), data=province_data, size=5,
color="steelblue", w=0, alpha=0.8)+ #誤差線畫柱形圖,x左偏0.5

geom_errorbar(aes(x=jd+0.5,
ymin=wd, ymax=wd+X2014ISI), data=province_data,
size=5,color="orange", w=0, alpha=0.8)+ #誤差線畫柱形圖,x右偏0.5

geom_text(aes(x=jd,
y=wd-0.5, label=paste(province, ifelse(changepct &>0
,"▲","▼"), round(changepct,3)*100, "%", sep="")),
data=province_data)+ #標註省名

theme( #清除不需要的元素

panel.grid
= element_blank(),

panel.background
= element_blank(),

axis.text
= element_blank(),

axis.ticks
= element_blank(),

axis.title
= element_blank()

)
+

annotate("text",
x=80, y=25, label="●2014信息經濟指數", color=
"steelblue", size=4) + #畫圖例

annotate("text",
x=80, y=23, label="●2015信息經濟指數", color=
"red", size=4)

中國地圖(氣泡圖)

普通氣泡圖

library(maptools)

library(ggplot2)

china_map=readShapePoly("bou2_4p.shp")

china_map1&<-fortify(china_map)

mydata&<-read.csv("F:/111.csv")

province_city&<-read.csv("F:/chinaprovincecity1.csv")

china_data&<-join(province_city,mydata,type="full")

ggplot()+

geom_polygon(data=china_map1, aes(x=long,
y=lat, group=group), fill="grey95", colour="grey60")+ #畫底圖

geom_point(data=china_data, aes(x = jd,y =
wd,size=信息社會指數),
fill="red", alpha=0.6,shape=21, colour="black")+ #畫氣泡,大小映射gdp

scale_size_area(max_size=2)+ #按面積計算

coord_map("polyconic") +

theme(

panel.grid = element_blank(),

panel.background = element_blank(),

axis.text = element_blank(),

axis.ticks = element_blank(),

axis.title = element_blank()

)

熱力氣泡圖

mydata&<-read.csv("F:/333.csv")

china_data
&<- join(province_city, mydata, type="full")

ggplot()+

geom_polygon(data=china_map1, aes(x=long,
y=lat, group=group), fill="grey95", colour="grey60")+ #畫底圖

geom_point(data=china_data, aes(x = jd,y =
wd, size=X2015ISI, fill=changepct, alpha=0.3), shape=21,
colour="black")+ #畫氣泡,大小映射gdp,顏色映射增幅

scale_size_area(max_size=8)+ #按面積計算

scale_fill_gradient2(low="#8E0F2E",
mid="#BFBEBE", high="#0E4E75", midpoint=median(na.omit

(china_data$changepct)))+ #3色漸變,忽略NA值再統計平均

coord_map("polyconic") +

theme(

panel.grid = element_blank(),

panel.background = element_blank(),

axis.text = element_blank(),

axis.ticks = element_blank(),

axis.title = element_blank()

)


正好這兩天遇到了類似的問題。

中國地圖可以從網上找shp文件用maptools包里的readShapePoly()讀取。

給指定省份填充顏色的方法可以見這篇文章:QiuYixuan: 用R軟體繪製中國分省市地圖 。親測可用。

順便膜樓上大神們1s。


請教一下

shape &<- readOGR(dns, fn)這個時候,運行告訴我當layer大於1時候,就只能讀第一個?也是就是說,fn里本質上存了4個.shp的文件,所以readogr不讓我讀


為什麼我運行出來的圖是黑色的,沒有漸變色

求指導


為什麼我讀取shape那個代碼不行


大神好,拜讀了您的代碼心情澎拜,希望自己以後也能做出這麼nb的展現,於是先從run您的代碼做起,run的過程中,到leaflet(shape) 開始報錯,還請大神給予指點,萬份感謝。

報錯如下:

leaflet(shape) %&>% addTiles() %&>%

+ setView(103.842773, 34.597042, zoom = 4) %&>%

+ addPolygons(fillColor = ~pal(shape$Population),

+ fillOpacity = 0.8,

+ color = "#000000",

+ weight = 1, popup = i_popup)

Error in cut.default(x, binsToUse, labels = FALSE, include.lowest = TRUE, :

"x" must be numeric

此外: Warning message:

In is.na(x) : is.na()不適用於類別為"NULL"的非串列或非矢量

目前還不清楚怎麼修改,是不是我的population下載的不對?因為merge之後,shape$ 裡面沒有population。還請大神指點。。。。


太厲害了,學


推薦閱讀:

如何高效的在R里寫出一個循環?
如何用R語言匹配兩個表的數據?
r 如何更新,不需要重裝的手段進行更新?
R語言 安裝完軟體後如何進行界面語言的設置?

TAG:R編程語言 |