1 簡介
基于Python
中諸如matplotlib
等功能豐富、自由度極高的繪圖庫,我們可以完成各種極富藝術感的可視化作品,關于這一點我在系列文章在模仿中精進數據可視化中已經帶大家學習過很多案例了。
而今天我要給大家介紹的這個Python
庫prettymaps
非常的有趣,基于它,我們只需要簡單的代碼就可以對地球上給定坐標和范圍的任意地區進行地圖可視化。
2 利用prettymaps快速制作海報級地圖
遺憾的是,prettymaps
暫時還不能通過pip
或conda
直接進行安裝,但可以利用pip
配合git
從源碼倉庫進行安裝,對于國內的用戶來說,可以使用下面的語句從github
的鏡像地址快速安裝:
pipinstallgit+https://hub.fastgit.org/marceloprates/prettymaps.git
安裝完成后,如果下面的語句執行無誤,那么恭喜你已經安裝完成:
fromprettymapsimport*
2.1 prettymaps的幾種使用方式
prettymaps
無需用戶自行準備數據,會根據用戶設定的坐標和范圍大小來自動從OpenStreetMap
上獲取相應范圍內的矢量數據作為繪圖素材,主要有以下幾種使用方式:
2.1.1 圓形模式
prettymaps
中最簡單的繪圖模式為「圓形模式」,我們只需要傳入中心點經緯度坐標,以及半徑范圍(單位:米)即可,下面的例子來自官方示例程序,我將其地點換成以上海外灘為中心向外2500米范圍:
fromprettymapsimport*
frommatplotlibimportpyplotasplt
#創建圖床
fig,ax=plt.subplots(figsize=(12,12),constrained_layout=True)
layers=plot(
(31.23346,121.492154),#圓心坐標,格式:(緯度, 經度)
radius=2500,#半徑
ax=ax,#綁定圖床
layers={
'perimeter':{},#控制繪圖模式,{}即相當于圓形繪圖模式
#下面的參數用于定義從OsmStreetMap選擇獲取的矢量圖層要素,不了解的無需改動照搬即可
'streets':{
'custom_filter':'["highway"~"motorway|trunk|primary|secondary|tertiary|residential|service|unclassified|pedestrian|footway"]',
'width':{
'motorway':5,
'trunk':5,
'primary':4.5,
'secondary':4,
'tertiary':3.5,
'residential':3,
'service':2,
'unclassified':2,
'pedestrian':2,
'footway':1,
}
},
'building':{'tags':{'building':True,'landuse':'construction'},'union':False},
'water':{'tags':{'natural':['water','bay']}},
'green':{'tags':{'landuse':'grass','natural':['island','wood'],'leisure':'park'}},
'forest':{'tags':{'landuse':'forest'}},
'parking':{'tags':{'amenity':'parking','highway':'pedestrian','man_made':'pier'}}
},
#下面的參數用于定義OpenStreetMap中不同矢量圖層的樣式,嫌麻煩的直接照抄下面的官方示例即可
drawing_kwargs={
'background':{'fc':'#F2F4CB','ec':'#dadbc1','hatch':'ooo...','zorder':-1},
'perimeter':{'fc':'#F2F4CB','ec':'#dadbc1','lw':0,'hatch':'ooo...','zorder':0},
'green':{'fc':'#D0F1BF','ec':'#2F3737','lw':1,'zorder':1},
'forest':{'fc':'#64B96A','ec':'#2F3737','lw':1,'zorder':1},
'water':{'fc':'#a1e3ff','ec':'#2F3737','hatch':'ooo...','hatch_c':'#85c9e6','lw':1,'zorder':2},
'parking':{'fc':'#F2F4CB','ec':'#2F3737','lw':1,'zorder':3},
'streets':{'fc':'#2F3737','ec':'#475657','alpha':1,'lw':0,'zorder':3},
'building':{'palette':['#FFC857','#E9724C','#C5283D'],'ec':'#2F3737','lw':.5,'zorder':4},
},
osm_credit={'color':'#2F3737'}
)
#導出圖片文件
plt.savefig('上海外灘-圓形模式.png',dpi=500)
2.1.2 圓角矩形模式
除了上述的「圓形模式」之外,prettymaps
中還可以使用「圓角矩形模式」,同樣需要定義中心點坐標和半徑,接著為參數layers
下的每個鍵值對添加鍵值對{'circle': False, 'dilate': 圓角半徑}
即可,其中圓角半徑為數值型,這次我們換一個地方,以故宮為例,半徑選擇600米:
#創建圖床
fig,ax=plt.subplots(figsize=(12,12),constrained_layout=True)
dilate=100
layers=plot(
(39.91645697864148,116.39077532493388),#圓心坐標,格式:(緯度, 經度)
radius=600,#半徑
ax=ax,#綁定圖床
layers={
'perimeter':{'circle':False,'dilate':dilate},#控制繪圖模式,{}即相當于圓形繪圖模式
#下面的參數用于定義從OsmStreetMap選擇獲取的矢量圖層要素,不了解的無需改動照搬即可
'streets':{
'custom_filter':'["highway"~"motorway|trunk|primary|secondary|tertiary|residential|service|unclassified|pedestrian|footway"]',
'width':{
'motorway':5,
'trunk':5,
'primary':4.5,
'secondary':4,
'tertiary':3.5,
'residential':3,
'service':2,
'unclassified':2,
'pedestrian':2,
'footway':1,
},
'circle':False,'dilate':dilate
},
'building':{'tags':{'building':True,'landuse':'construction'},'union':False,'circle':False,'dilate':dilate},
'water':{'tags':{'natural':['water','bay']},'circle':False,'dilate':dilate},
'green':{'tags':{'landuse':'grass','natural':['island','wood'],'leisure':'park'},'circle':False,'dilate':dilate},
'forest':{'tags':{'landuse':'forest'},'circle':False,'dilate':dilate},
'parking':{'tags':{'amenity':'parking','highway':'pedestrian','man_made':'pier'},'circle':False,'dilate':dilate}
},
#下面的參數用于定義OpenStreetMap中不同矢量圖層的樣式,嫌麻煩的直接照抄下面的官方示例即可
drawing_kwargs={
'background':{'fc':'#F2F4CB','ec':'#dadbc1','hatch':'ooo...','zorder':-1},
'perimeter':{'fc':'#F2F4CB','ec':'#dadbc1','lw':0,'hatch':'ooo...','zorder':0},
'green':{'fc':'#D0F1BF','ec':'#2F3737','lw':1,'zorder':1},
'forest':{'fc':'#64B96A','ec':'#2F3737','lw':1,'zorder':1},
'water':{'fc':'#a1e3ff','ec':'#2F3737','hatch':'ooo...','hatch_c':'#85c9e6','lw':1,'zorder':2},
'parking':{'fc':'#F2F4CB','ec':'#2F3737','lw':1,'zorder':3},
'streets':{'fc':'#2F3737','ec':'#475657','alpha':1,'lw':0,'zorder':3},
'building':{'palette':['#FFC857','#E9724C','#C5283D'],'ec':'#2F3737','lw':.5,'zorder':4},
},
osm_credit={'color':'#2F3737'}
)
#導出圖片文件
plt.savefig('北京故宮-圓角矩形模式.png',dpi=500)
2.1.3 添加文字內容
有了這樣美觀大方的藝術地圖,我們還可以基于matplotlib
中自定義字體的方法,在地圖上添加標注信息,仍然以上海外灘為例,我們利用外部的書法字體,在正中心繪制文字標注信息:
importmatplotlib.font_managerasfm
#創建圖床
fig,ax=plt.subplots(figsize=(12,12),constrained_layout=True)
layers=plot(
(31.23346,121.492154),#圓心坐標,格式:(緯度, 經度)
radius=2500,#半徑
ax=ax,#綁定圖床
layers={
'perimeter':{},#控制繪圖模式,{}即相當于圓形繪圖模式
#下面的參數用于定義從OsmStreetMap選擇獲取的矢量圖層要素,不了解的無需改動照搬即可
'streets':{
'custom_filter':'["highway"~"motorway|trunk|primary|secondary|tertiary|residential|service|unclassified|pedestrian|footway"]',
'width':{
'motorway':5,
'trunk':5,
'primary':4.5,
'secondary':4,
'tertiary':3.5,
'residential':3,
'service':2,
'unclassified':2,
'pedestrian':2,
'footway':1,
}
},
'building':{'tags':{'building':True,'landuse':'construction'},'union':False},
'water':{'tags':{'natural':['water','bay']}},
'green':{'tags':{'landuse':'grass','natural':['island','wood'],'leisure':'park'}},
'forest':{'tags':{'landuse':'forest'}},
'parking':{'tags':{'amenity':'parking','highway':'pedestrian','man_made':'pier'}}
},
#下面的參數用于定義OpenStreetMap中不同矢量圖層的樣式,嫌麻煩的直接照抄下面的官方示例即可
drawing_kwargs={
'background':{'fc':'#F2F4CB','ec':'#dadbc1','hatch':'ooo...','zorder':-1},
'perimeter':{'fc':'#F2F4CB','ec':'#dadbc1','lw':0,'hatch':'ooo...','zorder':0},
'green':{'fc':'#D0F1BF','ec':'#2F3737','lw':1,'zorder':1},
'forest':{'fc':'#64B96A','ec':'#2F3737','lw':1,'zorder':1},
'water':{'fc':'#a1e3ff','ec':'#2F3737','hatch':'ooo...','hatch_c':'#85c9e6','lw':1,'zorder':2},
'parking':{'fc':'#F2F4CB','ec':'#2F3737','lw':1,'zorder':3},
'streets':{'fc':'#2F3737','ec':'#475657','alpha':1,'lw':0,'zorder':3},
'building':{'palette':['#FFC857','#E9724C','#C5283D'],'ec':'#2F3737','lw':.5,'zorder':4},
},
osm_credit={'color':'#2F373700'}
)
#添加文字標注
ax.text(
0.5,0.5,
'外灘,上海',
zorder=6,
ha='center',
va='center',
fontsize=120,
fontproperties=fm.FontProperties(fname='FZZJ-HLYHXSJW.TTF'),
transform=ax.transAxes
)
#導出圖片文件
plt.savefig('上海外灘-添加文字標注.png',dpi=500)
你可以找到你關注地點的經緯度坐標,盡情地繪制出各種藝術地圖作品,譬如下面這些地標:
-
代碼
+關注
關注
30文章
4809瀏覽量
68826 -
python
+關注
關注
56文章
4801瀏覽量
84883
原文標題:用 Python 快速制作海報級地圖
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論