N久不分享學(xué)習(xí)心得的小Q終于有時(shí)間冒個(gè)泡了嵌洼,這次分享一個(gè)小Q改良后的在地圖上任意畫餅圖,直方圖的R代碼(其實(shí)是摸清了數(shù)據(jù)結(jié)構(gòu)后自己多加了幾行代碼+)医咨,這里以餅圖為例倦零。
畫圖原理
1.利用R包rworldmap & rworldxtra來(lái)作圖测砂。
2.已有的map數(shù)據(jù)中一個(gè)國(guó)家對(duì)應(yīng)一個(gè)坐標(biāo)这刷,一個(gè)國(guó)家邊界,利用這些已有數(shù)據(jù)+用戶數(shù)據(jù)構(gòu)建新的畫圖數(shù)據(jù)(其他新添加的圖均是如此)鼻弧。
rworldmap包的介紹
1.如果想查看rworldmap包的情況
help(package="rworldmap")
2.了解high resolution map情況
a<-getMap(resolution = "high")
# Map是一個(gè)sp對(duì)象设江,SpatialLinesDataFrame類
# 結(jié)構(gòu)如下:
# a@data
# a@polygons
# a@plotOrder
# a@bbox
# a@proj4string
# 我們主要利用a@data和a@polygons
v<-a@data
colnames(v)
[1] "ne_10m_adm" "ScaleRank"
[3] "LabelRank" "FeatureCla"
[5] "OID_" "SOVEREIGNT"
[7] "SOV_A3" "ADM0_DIF"
[9] "LEVEL" "TYPE"
[11] "ADMIN" "ADM0_A3"
[13] "GEOU_DIF" "GEOUNIT"
[15] "GU_A3" "SU_DIF"
[17] "SUBUNIT" "SU_A3"
[19] "NAME" "ABBREV"
[21] "POSTAL" "NAME_FORMA"
[23] "TERR_" "NAME_SORT"
[25] "MAP_COLOR" "POP_EST"
[27] "GDP_MD_EST" "FIPS_10_"
[29] "ISO_A2" "ISO_A3"
[31] "ISO_N3" "ISO3"
[33] "LON" "LAT"
[35] "ISO3.1" "ADMIN.1"
[37] "REGION" "continent"
[39] "GEO3major" "GEO3"
[41] "IMAGE24" "GLOCAF"
[43] "Stern" "SRESmajor"
[45] "SRES" "GBD"
[47] "AVOIDnumeric" "AVOIDname"
[49] "LDC" "SID"
[51] "LLDC"
# ***這里主要使用***:
# 第11列:類對(duì)象屬性ID
# 第19列:后期繪圖匹配項(xiàng)
# 第33列:繪圖時(shí)的經(jīng)度
# 第34列:繪圖時(shí)的緯度
3.實(shí)例操作
1)輸入文件格式說(shuō)明
文件逗號(hào)分隔,每列的說(shuō)明:
1.ID
新的類對(duì)象屬性ID,自定義,等于原來(lái)map中的11列ADMIN
2.Name
后期繪圖匹配項(xiàng)攘轩,同ID即可,等于原來(lái)map中的19列NAME
3.LON
繪圖時(shí)的經(jīng)度33列LON
4.LAT
繪圖時(shí)的緯度34列LAT
注意:這里的經(jīng)緯度是你自己想要標(biāo)記餅圖的經(jīng)緯度(起到隨意標(biāo)記點(diǎn)的作用)
5.國(guó)家名
和原始map文件中的第11列ADMIN ID對(duì)應(yīng),每個(gè)國(guó)家都有一個(gè)坐標(biāo)多邊形區(qū)域叉存,必須把坐標(biāo)點(diǎn)畫在某個(gè)國(guó)家內(nèi)
6.餅圖分塊-1
7.餅圖分塊-2
8.legend名字
這里一個(gè)餅圖只分成2部分,用戶可自定義添加更多
2)畫圖的具體代碼如下:
rm(list=ls())
library(rworldmap)
library(rworldxtra)
#---------------------------------
# 讀入輸入文件
dat<-read.table("test.txt",header = T,sep=",",stringsAsFactors = F)
> dat
ADMIN NAME LON LAT rawName P1 P2 legendName
1 Philippines Philippines 121.41825 15.95318 Philippines 0.5 0.5 legendName
2 Bangladesh Bangladesh 90.22658 23.88242 Bangladesh 0.4 0.6 legendName
3 Myanmar Myanmar 96.48873 21.21545 Myanmar 0.2 0.8 legendName
#---------------------------------
# 提取原始high resolution map的數(shù)據(jù)度帮,作為map對(duì)應(yīng)的新數(shù)據(jù)
a<-getMap(resolution = "high")
rawData<-a@data[,c(11,19,33,34)]
#---------------------------------
# 注意下面的操作歼捏,因?yàn)槲业娘瀳D只區(qū)分2塊稿存,所以只需要多增加2列數(shù)據(jù)
rawData[,5]<-NaN # A1_freq 作圖時(shí)不出現(xiàn)
rawData[,6]<-NaN # A2_freq 作圖時(shí)不出現(xiàn)
colnames(rawData)<-colnames(dat)[c(1:4,6,7)]
IDname<-c()
for(i in 1:length(a@plotOrder)){IDname[i]<-a@polygons[[i]]@ID}
#---------------------------------
# 將新數(shù)據(jù)data覆蓋原始的數(shù)據(jù)data
rawData<-rbind(rawData,dat[,c(1:4,6,7)]) # 合并新舊數(shù)據(jù)
a@data<-rawData
#---------------------------------
# 添加新加入的城市對(duì)應(yīng)的對(duì)象屬性polygons,添加一個(gè)對(duì)象到list中
# polygons是一個(gè)list;每個(gè)成員是一個(gè)sp
# 每個(gè)sp的polygons又是一個(gè)list瞳秽,每個(gè)成員是一個(gè)sp
# 每個(gè)sp都有其自己的對(duì)象屬性瓣履,相同或不同
#
for(i in 1:dim(dat)[1])
{
index<-which(IDname==dat[i,5]) # 獲得新坐標(biāo)點(diǎn)所在國(guó)家[第五列]在原有map中的下標(biāo)
tmpPolygon<-a@polygons[[index]] # 提取國(guó)家的polygon信息{ID=國(guó)家名}
tmpPolygon@labpt<-as.numeric(dat[i,3:4]) # 坐標(biāo)更換為新坐標(biāo)點(diǎn)的經(jīng)緯度
tmpPolygon@ID<-dat[i,1] # 對(duì)象ID更換為新坐標(biāo)點(diǎn)的名字
a@polygons<-c(a@polygons,list(tmpPolygon)) # 將新生成的polygon添加到原有的polygon List中
# 相當(dāng)于把新坐標(biāo)點(diǎn)的polygon信息添加到map中
# 新坐標(biāo)點(diǎn)的polygon取所在國(guó)家的polygon
}
#---------------------------------
# plot map pie
par(oma=c(0,0,0,0),
mar=c(0,0,0,0),
fig=c(0,1,0,1),
mai=c(0,0,0,0)
)
# 因?yàn)槲业娘瀳D只區(qū)分2塊,所以只需要2個(gè)顏色
color_array<-c("black","red")
mapPies(a,
nameZs = c(colnames(a@data)[5],
colnames(a@data)[6]), # 用作畫圖的兩列
zColours=color_array, # 不同比例的顏色
symbolSize = 0.5, # pie的大小
addCatLegend=F, # 不添加默認(rèn)的legend
oceanCol = "lightblue",
landCol = "wheat")
legend(60,0, # legend所在的橫縱坐標(biāo)/經(jīng)緯度
legend = c(colnames(a@data)[5],
colnames(a@data)[6]), # legend中的指示文字
fill = color_array, # legend 指示box的顏色,要求順序同上zColours
title = dat[1,8], # legend title
bty="n", # 不做legen的背景框
title.adj = c(1)
)
成品如下
轉(zhuǎn)載請(qǐng)標(biāo)明出處和作者 ^+^
撰文&編輯:VickieQ
校對(duì):HCLO4 & 花毛