如何繪製分省地圖:ECharts與Basemap的應用

在統計分析全國綜合指標的時候,需要將不同省份的數據用顏色表示出來,如何繪製一個完整的、準確的統計地圖是個值得深入研究的問題。

目前有現成的Excel版分省地圖生成模板,如圖一所示。但是存在兩個問題:生成地圖清晰度太低、台灣省無法被色彩渲染。

圖一 Excel數據地圖生成模板

因此考慮其他途徑生成完整而準確的分省地圖。

準備工作

確定不同顏色所代表的不同數值範圍。地圖主題色調自定義為藍色,打開Sketch,快捷鍵R拖出一個矩形,選擇填充色為"#1D4898",透明度100%。複製粘貼九次,得到十個大小顏色完全一致的矩形。將矩形的透明度依次改為:4%、10%、20%、30%、40%、50%、60%、70%、80%、100%。如圖二所示。

圖二 削減透明度得到矩形

使用Sketch的取色工具對十個矩形進行取色,得出十種顏色的值為:#1D4898,#4A6DAD,#607EB6,#7791C1,#8EA3CB,#A5B6D6,#BBC8E0,#D2DAEA,#E8ECF4,#F6F8FB (顏色由深入淺)。

接下來開始使用繪製工具繪製。

方法一:使用ECharts工具繪製

ECharts是百度出品的作圖工具,打開網站ECharts · Example :實例-地圖-標準地圖,如圖3,這是一個iPhone全國銷量分布的demo。在此基礎上我們進行修改,以達到所需要的效果。

圖三 iPhone全國銷量分布

在左側的代碼編譯區進行編輯。不清楚是什麼語言,但是讀起來基本上沒難度。

配置信息:

title : { //標題設置, text: , //標題文本,清空 subtext: , //子標題 x:center //標題位置-居中 }, tooltip : { trigger: item }, legend: { orient: vertical, //豎直布局 x:left, //位置-居左 data:[] },

設置比色卡

dataRange: { min: 0.57, //數據最小值 max: 0.88, //數據最大值 x: right, //比色卡X軸位置-居左 y: center, //比色卡Y軸位置-居中 text:[高,低], // 文本,默認為數值文本 color: [#1D4898,#4A6DAD,#607EB6,#7791C1,#8EA3CB,#A5B6D6,#BBC8E0,#D2DAEA,#E8ECF4,#F6F8FB], //顏色由深入淺,在比色卡上呈現順序為由上到下。 calculable : true //是否可計算:是 },

工具條配置:

toolbox: { //工具箱 show: true, //是否顯示:true orient : vertical, //布局:豎直方向 x: left, //X軸位置-居左 y: bottom, //Y軸位置-底部 feature : { mark : {show: true}, dataView : {show: true, readOnly: false}, restore : {show: true}, saveAsImage : {show: true} } }, roamController: { //漫遊控制器? 作用未知,不顯示 show: false, x: right, mapTypeControl: { china: true } },

各省數據配置:

series : [ { name: , type: map, mapType: china, roam: false, itemStyle:{ normal:{label:{show:false}}, emphasis:{label:{show:true}} }, data:[ {name: 北京,value: 0.8293}, {name: 天津,value: 0.8423}, {name: 上海,value: 0.8221}, {name: 重慶,value: 0.8554}, {name: 河北,value: 0.8560}, {name: 河南,value: 0.8660}, {name: 雲南,value: 0.84}, {name: 遼寧,value: 0.8480}, {name: 黑龍江,value: 0.8511}, {name: 湖南,value: 0.8616}, {name: 安徽,value: 0.8698}, {name: 山東,value: 0.8610}, {name: 新疆,value: 0.5944}, {name: 江蘇,value: 0.8557}, {name: 浙江,value: 0.86}, {name: 江西,value: 0.8704}, {name: 湖北,value: 0.8618}, {name: 廣西,value: 0.8333}, {name: 甘肅,value: 0.8425}, {name: 山西,value: 0.8584}, {name: 內蒙古,value: 0.8451}, {name: 陝西,value: 0.8539}, {name: 吉林,value: 0.8492}, {name: 福建,value: 0.8450}, {name: 貴州,value: 0.8472}, {name: 廣東,value: 0.8297}, {name: 青海,value: 0.8131}, {name: 西藏,value: 0.7402}, {name: 四川,value: 0.8523}, {name: 寧夏,value: 0.8450}, {name: 海南,value: 0.8386}, {name: 台灣,value: 0.72}, {name: 香港,value: 0.75}, {name: 澳門,value: 0.72} ] }, ]

全部代碼:

option = { title : { text: , subtext: , x:center }, tooltip : { trigger: item }, legend: { orient: vertical, x:left, data:[] }, dataRange: { min: 0.57, max: 0.88, x: right, y: center, text:[高,低], // 文本,默認為數值文本 color: [#1D4898,#4A6DAD,#607EB6,#7791C1,#8EA3CB,#A5B6D6,#BBC8E0,#D2DAEA,#E8ECF4,#F6F8FB], calculable : true }, toolbox: { show: true, orient : vertical, x: left, y: bottom, feature : { mark : {show: true}, dataView : {show: true, readOnly: false}, restore : {show: true}, saveAsImage : {show: true} } }, roamController: { show: false, x: right, mapTypeControl: { china: true } }, series : [ { name: , type: map, mapType: china, roam: false, itemStyle:{ normal:{label:{show:false}}, emphasis:{label:{show:true}} }, data:[ {name: 北京,value: 0.8293}, {name: 天津,value: 0.8423}, {name: 上海,value: 0.8221}, {name: 重慶,value: 0.8554}, {name: 河北,value: 0.8560}, {name: 河南,value: 0.8660}, {name: 雲南,value: 0.84}, {name: 遼寧,value: 0.8480}, {name: 黑龍江,value: 0.8511}, {name: 湖南,value: 0.8616}, {name: 安徽,value: 0.8698}, {name: 山東,value: 0.8610}, {name: 新疆,value: 0.5944}, {name: 江蘇,value: 0.8557}, {name: 浙江,value: 0.86}, {name: 江西,value: 0.8704}, {name: 湖北,value: 0.8618}, {name: 廣西,value: 0.8333}, {name: 甘肅,value: 0.8425}, {name: 山西,value: 0.8584}, {name: 內蒙古,value: 0.8451}, {name: 陝西,value: 0.8539}, {name: 吉林,value: 0.8492}, {name: 福建,value: 0.8450}, {name: 貴州,value: 0.8472}, {name: 廣東,value: 0.8297}, {name: 青海,value: 0.8131}, {name: 西藏,value: 0.7402}, {name: 四川,value: 0.8523}, {name: 寧夏,value: 0.8450}, {name: 海南,value: 0.8386}, {name: 台灣,value: 0.72}, {name: 香港,value: 0.75}, {name: 澳門,value: 0.72} ] }, ]};

刷新,得到圖四的效果圖。

圖四 ECharts效果地圖

最後用Sketch處理,遮蓋住比色卡、工具條,畫上我們自己的比色卡,導出3x倍圖,得到最終效果:

圖五 最終效果


方法二 Basemap繪製

語言:Python3

Basemap屬於Python的地圖繪製包,具體請參照這兩個帖子進行基本配置:

SegmentFault 01

SegmentFault 02

地圖存在三個問題:

1、遍歷省名的時候,黑龍江是繁體:"黑龍江"

2、台灣需另導入台灣省shapefile文件,大陸並沒有包含進台灣省

3、藏南地區沒有顯示完整。

上代碼:

#!/usr/bin/python# -*- coding: utf-8 -*-import matplotlib.pyplot as pltfrom mpl_toolkits.basemap import Basemapfrom matplotlib.patches import Polygonimport matplotlib.colors #省份以及對應的數值 provinceDic = {"安徽":9, "北京":5, "重慶":8, "福建":7, "甘肅":7, "廣東":5, "廣西":6, "貴州":7,"海南":6, "河北":8, "黑龍江":8, "河南":9, "湖北":9, "湖南":9, "江蘇":8, "江西":10, "吉林":7, "遼寧":7, "內蒙古":7, "寧夏":7, "青海":4, "山東":9, "上海":5, "陝西":8, "山西":8, "四川":8, "天津":7, "新疆":1, "西藏":3, "雲南":7, "浙江":9, "香港":3, "澳門":2, "台灣":2}#顏色colorDict = {"1":"F6F8FB", "2":"E8ECF4", "3":"D2DAEA", "4":"BBC8E0", "5":"A5B6D6", "6":"8EA3CB", "7":"7791C1", "8":"607EB6", "9":"4A6DAD", "10":"1D4898"}#地圖顯示配置plt.figure(figsize=(16,8))m = Basemap()m.drawcountries(linewidth_=1.5)m.drawcoastlines()m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection=lcc, lat_1=33, lat_2=45, lon_0=100)#讀取中國大陸shapefilem.readshapefile(/Users//Desktop/CHN_adm_shp/CHN_adm1, states, drawbounds=True)#讀取台灣shapefilem.readshapefile(/Users//Desktop/TWN_adm_shp/TWN_adm0, taiwan, drawbounds=True)#讀取印度shapefile(將藏南地區劃為國有)m.readshapefile(/Users//Desktop/IND_adm_shp/IND_adm1, india, drawbounds=True)ax = plt.gca()#大陸地區進行上色for i, shapedict in enumerate(m.states_info): p = shapedict[NL_NAME_1].split(|) s = p[1] if len(p) > 1 else p[0] for key in provinceDic.keys(): if key in s: color = # + colorDict[str(provinceDic[key])] ax.add_patch(Polygon(m.states[i], facecolor = color))#台灣上色for nshape, seg in enumerate(m.taiwan): color = # + colorDict[5] poly = Polygon(seg, facecolor=color) ax.add_patch(poly)#經過查找,藏南地區主要是偽「阿魯納恰爾邦」(印度方面稱, Arunachal Pradesh)的主體部分for j, shapedict in enumerate(m.india_info): s = shapedict[NAME_1] if Arunachal in s: print(s) poly = Polygon(m.india[j], facecolor=r) ax.add_patch(poly)plt.show()

效果如圖:

圖六 紅色藏南地區

紅色塊為藏南地區,但是和實際的中國版圖是有出入的。所以python實現的效果是有很大缺陷的。

解決途徑:

1、找到準確的大陸shapefile文件

2、按照藏南地區的經緯度進行色彩渲染,但是時間較短,對basemap的研究淺嘗輒止,需要高手進行進一步的完善。


推薦閱讀:

如何實現多點路線規劃
《西雙版納手繪旅遊攻略》(新春版)發布
不可不知的織夢網站地圖Sitemap製作方法
MapSCII:在終端顯示世界地圖
越南分省政區、分省人口密度以及地理分區

TAG:ECharts | Python3x | 地圖 |