今天的推文教程使用geopandas進行空間圖表的繪製(geopandas空間繪圖很方便,省去了很多的數據處理過程,而且也完美銜接matplotlib,學習python 空間繪圖的小夥伴可以看下啊),具體為空間氣泡圖的繪製,主要涉及的內容如下:
geopandas geojson數據格式讀取並可視化展示geopandas geojson數據操作這裡我們選擇的為香港地圖的geojson 文件數據,此類文件可在DAtAV 地圖選擇器進行下載。下載所得的文件名為香港特別行政區.json,可視化效果如下:
數據讀取使用geopandas 的read_file()方法就可很方便的進行數據讀取,代碼如下:
hk_file = r"F:\DataCharm\商業藝術圖表仿製\香港地圖可視化\香港特別行政區.json"
hk = geopandas.read_file(hk_file)更多geopandas 讀取數據方法,可以參看geopandas官網進行學習了解。
數據可視化展示在讀取完數據之後,我們可以直接使用geopandas的plot() 方法進行繪製,代碼如下(做了簡單的顏色設置):
fig, ax = plt.subplots(figsize=(10,8),dpi=200)
hk_map = hk.geometry.plot(ax=ax,fc="#CCEBEB",ec="#009999",lw=1)
ax.text(.91,0.05,'\nVisualization by DataCharm',transform = ax.transAxes,
ha='center', va='center',fontsize = 8)
ax.axis('off') # 移除坐標軸
plt.savefig('hk_charts_pir.png',width=8,height=8,
dpi=900,bbox_inches='tight',facecolor='white')結果如下:
區名文本添加:在讀取的數據結果中有name 列為對應的區名,使用hk.geometry.representative_point() 方法計算出其代表性 點的經緯度信息用於繪製文本位置,結果如下:再通過使用ax.text()方法添加文本即可,代碼如下:
for loc, label in zip(hk.geometry.representative_point(),hk.name):
ax.text(loc.x,loc.y,label,size=13,color="#0DCFE3")結果如下:
添加氣泡散點數據這裡的數據來源為我的朋友J哥的公號:菜J學Python,感謝提供數據支持。由於數據的經緯度是直接基於高德地圖進行解析的,導致存在部分數據經緯度信息出錯,我們使用pandas進行簡單的數據篩選,具體就不再展示,後面會推出系列教程推文,數據預覽如下:這裡主要使用紅色框中的數據進行繪製,即使用scatter()方法加合理設置散點大小即可,代碼如下:
for x,y,price in zip(scatter_se.lon,scatter_se.lat,scatter_se['實用單價']):
hk_map.scatter(x,y,s=price/500,color='#FFEB3B',alpha=.5,ec='k',lw=.1)經過一些定製化設置效果如下:
氣泡圖例添加這裡我們不是直接基於數據進行圖例的生成,而是單獨進行其他圖層的繪製進行圖例生成,這樣做的好處就是可以更加自由定製所需圖例的顏色和大小,涉及的代碼如下:
#這裡進行單獨的圖例添加
ax.scatter([], [], c='#FFEB3B', s=6000/500,
label='6000 - 10000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=10000/500,
label='10000 - 30000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=30000/500,
label='30000 - 50000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=50000/500,
label='50000 - 90000', edgecolor='black',lw=.5)
#圖例定製化設置
legend = ax.legend(frameon=False,ncol=4,loc='lower right',title='實用單價',bbox_to_anchor=(1, -.06),
fontsize=9)
legend.get_title().set_color('#ffffff')
for text in legend.get_texts():
text.set_color("#ffffff")注意下代碼的後半部分,這是對matplotlib 圖例設置的定製化設定,也適用於其他圖例。繪圖完整代碼如下:
fig, ax = plt.subplots(figsize=(10,8),dpi=200,facecolor='#323332',edgecolor='#323332')
ax.set_facecolor('#323332')
hk_map = hk.geometry.plot(ax=ax,fc="#292200",ec="gray",lw=1,alpha=.8)
#使用默認的text添加文本導致文本重疊
for loc, label in zip(hk.geometry.representative_point(),hk.name):
ax.text(loc.x,loc.y,label,size=11,color="#0DCFE3")
for x,y,price in zip(scatter_se.lon,scatter_se.lat,scatter_se['實用單價']):
hk_map.scatter(x,y,s=price/500,color='#FFEB3B',alpha=.5,ec='k',lw=.1)
ax.axis('off') # 移除坐標軸
#這裡進行單獨的圖例添加
ax.scatter([], [], c='#FFEB3B', s=6000/500,
label='6000 - 10000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=10000/500,
label='10000 - 30000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=30000/500,
label='30000 - 50000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=50000/500,
label='50000 - 90000', edgecolor='black',lw=.5)
#圖例定製化設置
legend = ax.legend(frameon=False,ncol=4,loc='lower right',title='實用單價',bbox_to_anchor=(1, -.06),
fontsize=9)
legend.get_title().set_color('#ffffff')
for text in legend.get_texts():
text.set_color("#ffffff")
#添加必要的文本:這裡title也是採用相同方法
ax.text(.5,1.05,"香港在售二手房分布圖",transform = ax.transAxes,color="white",weight='bold',size=20,
ha='center', va='center')
ax.text(.5,.985,'數據來源:菜J學Python',transform = ax.transAxes,
ha='center', va='center',fontsize = 10,color='white')
ax.text(.91,-.07,'\nVisualization by DataCharm',transform = ax.transAxes,
ha='center', va='center',fontsize = 8,color='white')
plt.savefig('hk_charts.png',width=8,height=8,
dpi=900,bbox_inches='tight',facecolor='#323332')
#ax.set_axisbelow(True)
plt.show()可視化效果:
adjustText 庫解決文本重疊問題大家可能發現:結果圖中文本較集中,可能對閱讀造成不便,我們這裡只用adjustText 包進行解決,這裡給出文本添加的代碼,其他步驟一樣:
from adjustText import adjust_text
# 使用adjustText修正文字重疊現象
new_texts = [ax.text(loc.x,loc.y,label,size=13,color="#0DCFE3") for loc, label in \
zip(hk.geometry.representative_point(),hk.name)]
adjust_text(new_texts,
only_move={'text': 'xy'},)可視化結果如下:
總結本期推文介紹了使用geopandas 進行空間繪圖,完整代碼不是很多,但涉及的知識點較多,希望大家可以掌握。另外,這個房價的數據是基於爬蟲獲取,大家對於如「數據獲取-數據處理分析-數據可視化」 等一個完整的項目流程感覺怎樣?如果受眾較大,我後面也會針對性的進行推文準備的,大家可以在 讀者討論 區討論留言。