1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 4569字,需瀏覽 10分鐘

         ·

        2020-11-11 20:23

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

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

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

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

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

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

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

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

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

        在讀取完數(shù)據(jù)之后,我們可以直接使用geopandas的plot() 方法進行繪制,代碼如下(做了簡單的顏色設(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')?#?移除坐標軸
        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ī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é)果如下:

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

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

        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)

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

        氣泡圖例添加

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

        #這里進行單獨的圖例添加
        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='實用單價',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)

        #使用默認的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['實用單價']):
        ????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)
        #圖例定制化設(shè)置
        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,'數(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 包進行解決,這里給出文本添加的代碼,其他步驟一樣:

        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 進行空間繪圖,完整代碼不是很多,但涉及的知識點較多,希望大家可以掌握。另外,這個房價的數(shù)據(jù)是基于爬蟲獲取,大家對于如“數(shù)據(jù)獲取-數(shù)據(jù)處理分析-數(shù)據(jù)可視化” 等一個完整的項目流程感覺怎樣?如果受眾較大,我后面也會針對性的進行推文準備的,大家

        瀏覽 56
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            伦理《禁忌9 | 三上悠亚持续高潮40分钟 | 一级特黄特色的免费大片视频 | 自拍三级片 | 美女干逼视频网站 | 精品 二区三区 | 天天日天天操天天舔天天射天天插天天爽 | 乱伦91| 丁香婷婷五月天激情啪啪 | 女人高潮叫床声音频 |