本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理,
以下文章來源于DataCharm ,作者寧海濤
前言
今天的推文教程使用geopandas進行空間圖表的繪制(geopandas空間繪圖很方便,省去了很多的資料處理程序,而且也完美銜接matplotlib,學習python 空間繪圖的小伙伴可以看下啊),具體為空間氣泡圖的繪制,主要涉及的內容如下:
- geopandas geojson資料格式讀取并可視化展示
- 單獨添加散點大小圖例圖層
- adjustText 庫解決文本重疊問題
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")
結果如下:
添加氣泡散點資料
由于資料的經緯度是直接基于高德地圖進行決議的,導致存在部分資料經緯度資訊出錯,我們使用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'},)
可視化結果如下:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/209846.html
標籤:Python
下一篇:RE 匹配pdf URL地址
