<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 空間繪圖 - 房價氣泡圖繪制

          共 4569字,需瀏覽 10分鐘

           ·

          2020-11-11 20:23

          今天的推文教程使用geopandas進(jìn)行空間圖表的繪制(geopandas空間繪圖很方便,省去了很多的數(shù)據(jù)處理過程,而且也完美銜接matplotlib,學(xué)習(xí)python 空間繪圖的小伙伴可以看下啊),具體為空間氣泡圖的繪制,主要涉及的內(nèi)容如下:

          • geopandas geojson數(shù)據(jù)格式讀取并可視化展示
          • 單獨(dú)添加散點(diǎn)大小圖例圖層
          • adjustText 庫解決文本重疊問題

          geopandas geojson數(shù)據(jù)操作

          這里我們選擇的為香港地圖的geojson 文件數(shù)據(jù),此類文件可在DAtAV 地圖選擇器進(jìn)行下載。下載所得的文件名為香港特別行政區(qū).json,可視化效果如下:

          數(shù)據(jù)讀取

          使用geopandas 的read_file()方法就可很方便的進(jìn)行數(shù)據(jù)讀取,代碼如下:

          hk_file?=?r"F:\DataCharm\商業(yè)藝術(shù)圖表仿制\香港地圖可視化\香港特別行政區(qū).json"
          hk?=?geopandas.read_file(hk_file)

          更多geopandas 讀取數(shù)據(jù)方法,可以參看geopandas官網(wǎng)進(jìn)行學(xué)習(xí)了解。

          數(shù)據(jù)可視化展示

          在讀取完數(shù)據(jù)之后,我們可以直接使用geopandas的plot() 方法進(jìn)行繪制,代碼如下(做了簡單的顏色設(shè)置):

          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')?#?移除坐標(biāo)軸
          plt.savefig('hk_charts_pir.png',width=8,height=8,
          ????????????dpi=900,bbox_inches='tight',facecolor='white')

          結(jié)果如下:

          • 區(qū)名文本添加:在讀取的數(shù)據(jù)結(jié)果中有name 列為對應(yīng)的區(qū)名,使用hk.geometry.representative_point() 方法計(jì)算出其代表性 點(diǎn)的經(jīng)緯度信息用于繪制文本位置,結(jié)果如下:

          再通過使用ax.text()方法添加文本即可,代碼如下:

          for?loc,?label?in?zip(hk.geometry.representative_point(),hk.name):
          ????ax.text(loc.x,loc.y,label,size=13,color="#0DCFE3")

          結(jié)果如下:

          添加氣泡散點(diǎn)數(shù)據(jù)

          這里的數(shù)據(jù)來源為我的朋友J哥的公號:菜J學(xué)Python,感謝提供數(shù)據(jù)支持。由于數(shù)據(jù)的經(jīng)緯度是直接基于高德地圖進(jìn)行解析的,導(dǎo)致存在部分?jǐn)?shù)據(jù)經(jīng)緯度信息出錯,我們使用pandas進(jìn)行簡單的數(shù)據(jù)篩選,具體就不再展示,后面會推出系列教程推文,數(shù)據(jù)預(yù)覽如下:這里主要使用紅色框中的數(shù)據(jù)進(jìn)行繪制,即使用scatter()方法加合理設(shè)置散點(diǎn)大小即可,代碼如下:

          for?x,y,price?in?zip(scatter_se.lon,scatter_se.lat,scatter_se['實(shí)用單價']):
          ????hk_map.scatter(x,y,s=price/500,color='#FFEB3B',alpha=.5,ec='k',lw=.1)

          經(jīng)過一些定制化設(shè)置效果如下:

          氣泡圖例添加

          這里我們不是直接基于數(shù)據(jù)進(jìn)行圖例的生成,而是單獨(dú)進(jìn)行其他圖層的繪制進(jìn)行圖例生成,這樣做的好處就是可以更加自由定制所需圖例的顏色和大小,涉及的代碼如下:

          #這里進(jìn)行單獨(dú)的圖例添加
          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)
          #圖例定制化設(shè)置
          legend?=?ax.legend(frameon=False,ncol=4,loc='lower?right',title='實(shí)用單價',bbox_to_anchor=(1,?-.06),
          ??????????????????fontsize=9)
          legend.get_title().set_color('#ffffff')
          for?text?in?legend.get_texts():
          ????text.set_color("#ffffff")

          注意下代碼的后半部分,這是對matplotlib 圖例設(shè)置的定制化設(shè)定,也適用于其他圖例。繪圖完整代碼如下:

          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)

          #使用默認(rèn)的text添加文本導(dǎo)致文本重疊
          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['實(shí)用單價']):
          ????hk_map.scatter(x,y,s=price/500,color='#FFEB3B',alpha=.5,ec='k',lw=.1)

          ax.axis('off')?#?移除坐標(biāo)軸

          #這里進(jìn)行單獨(dú)的圖例添加
          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)
          #圖例定制化設(shè)置
          legend?=?ax.legend(frameon=False,ncol=4,loc='lower?right',title='實(shí)用單價',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,'數(shù)據(jù)來源:菜J學(xué)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 庫解決文本重疊問題

          大家可能發(fā)現(xiàn):結(jié)果圖中文本較集中,可能對閱讀造成不便,我們這里只用adjustText 包進(jìn)行解決,這里給出文本添加的代碼,其他步驟一樣:

          from?adjustText?import?adjust_text
          #?使用adjustText修正文字重疊現(xiàn)象
          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'},)

          可視化結(jié)果如下

          總結(jié)

          本期推文介紹了使用geopandas 進(jìn)行空間繪圖,完整代碼不是很多,但涉及的知識點(diǎn)較多,希望大家可以掌握。另外,這個房價的數(shù)據(jù)是基于爬蟲獲取,大家對于如“數(shù)據(jù)獲取-數(shù)據(jù)處理分析-數(shù)據(jù)可視化” 等一個完整的項(xiàng)目流程感覺怎樣?如果受眾較大,我后面也會針對性的進(jìn)行推文準(zhǔn)備的,大家

          瀏覽 56
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩中文字幕在线视频 | 亚洲黄色在线播放 | 曰韩黄色毛片免费在线观看 | 精品久久一区二区三区四区五区 | 成人激情性爱视频 |