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>

        在模仿中精進數(shù)據(jù)可視化06:常見抽象地圖的制作

        共 3690字,需瀏覽 8分鐘

         ·

        2021-01-06 16:54


        添加微信號"CNFeffery"加入技術交流群
        ?

        本文完整代碼及數(shù)據(jù)已上傳至我的Github倉庫https://github.com/CNFeffery/FefferyViz

        ?

        1 簡介

        我們經(jīng)常會在一些「PPT報告」或者「宣傳廣告」中看到一些比較抽象的地圖,它們都是在正常地圖的基礎上,通過置換幾何元素,來實現(xiàn)出較為抽象的效果,這類的作品非常之多,因此本文不模仿實際的某幅作品,而是制作出下面三類抽象地圖:

        圖1

        2 基于Python模仿常見抽象地圖

        對應圖1,我們下面來分別模仿3類抽象地圖,首先準備一下要用到的中國地圖數(shù)據(jù),我們偷個懶直接使用高德開源的地圖數(shù)據(jù)接口:

        圖2

        為了方便和簡化之后的運算,我們利用unary_union來將融合所有要素為一個:

        圖3

        這樣我們的基礎數(shù)據(jù)就準備好了~

        2.1 向外環(huán)形擴散的地圖

        首先我們來制作圖1左圖所示,從以某個點為圓心,向外環(huán)形擴散的地圖,原理其實很簡單,只需要定義圓心坐標,接著向外按照等差數(shù)列,依次擴大半徑距離計算緩沖區(qū)的輪廓線:

        from?shapely.geometry?import?Point
        import?matplotlib.pyplot?as?plt

        fig,?ax?=?plt.subplots(figsize=(8,?8))

        #?以重慶為圓心,生成向外的環(huán)形線,間隔為80公里
        center?=?gpd.GeoSeries([Point((106.546737,?29.566598))],?crs='EPSG:4326').to_crs(albers_proj)
        circles?=?gpd.GeoSeries([center[0].buffer(i*1000*80).boundary?for?i?in?range(1,?45)],?crs=albers_proj)

        ax?=?china_total.plot(ax=ax,?facecolor='none',?edgecolor='black')
        ax?=?circles.plot(ax=ax)

        圖4

        可以看到目前生成的環(huán)形線已經(jīng)可以覆蓋中國全境,最后用china_total來裁剪即可:

        fig,?ax?=?plt.subplots(figsize=(8,?8))

        #?用china_total作為蒙版從circles中裁切出繪圖所需部分
        ax?=?gpd.clip(circles,?mask=china_total).plot(ax=ax,?color='white')

        ax.set_facecolor('#4a4db7')

        fig.set_facecolor('#4a4db7')

        ax.set_xticks([])
        ax.set_yticks([])

        ax.spines['left'].set_color('none')
        ax.spines['top'].set_color('none')
        ax.spines['right'].set_color('none')
        ax.spines['bottom'].set_color('none')

        fig.savefig('圖5.png',?dpi=500,?bbox_inches='tight',?pad_inches=0)
        圖5

        在這幅圖的基礎上,你就可以添加其他的文字標注等元素,形成配圖,使得你的報告更加高級。

        2.2 像素風格地圖

        接著我們來制作圖1中圖所示的由方塊組成的像素風格地圖,原理也很簡單,生成覆蓋china_total范圍的網(wǎng)格:

        from?shapely.geometry?import?MultiLineString
        from?shapely.ops?import?polygonize?#?用于將交叉線轉換為網(wǎng)格面
        import?numpy?as?np

        #?提取china_total左下角與右上角坐標
        xmin,?ymin,?xmax,?ymax?=?china_total.total_bounds
        xmin,?ymin,?xmax,?ymax?=?int(xmin),?int(ymin),?int(xmax),?int(ymax)

        #?創(chuàng)建x方向上的所有坐標位置,間距50公里
        x?=?np.arange(xmin,?xmax,?50*1000)

        #?創(chuàng)建y方向上的所有坐標位置,間距50公里
        y?=?np.arange(ymin,?ymax,?50*1000)

        #?生成全部交叉線坐標信息
        hlines?=?[((x1,?yi),?(x2,?yi))?for?x1,?x2?in?zip(x[:-1],?x[1:])?for?yi?in?y]
        vlines?=?[((xi,?y1),?(xi,?y2))?for?y1,?y2?in?zip(y[:-1],?y[1:])?for?xi?in?x]

        grids?=?gpd.GeoSeries(list(polygonize(MultiLineString(hlines?+?vlines))),?crs=albers_proj)
        grids.plot(facecolor='none',?edgecolor='black')
        圖6

        再向內緩沖一定的距離,即可得到結果:

        圖7

        2.3 由不規(guī)則多邊形拼湊的地圖

        最后我們來制作圖1右圖所示的由不規(guī)則多邊形拼湊的地圖,需要用到「泰森多邊形」,我們可以通過pip install geovoronoi來安裝輔助庫。

        因為泰森多邊形需要從點出發(fā)創(chuàng)建多邊形,因此我們可以生成目標面內部的隨機散點,再作為輸入來生成所需的多邊形:

        from?geovoronoi?import?voronoi_regions_from_coords


        np.random.seed(42)
        coords?=?gpd.GeoSeries([Point(x,?y)?for?x,?y?in?zip(np.random.uniform(xmin,?xmax,?1000),?
        ????????????????????????????????????????????????????np.random.uniform(ymin,?ymax,?1000))],
        ???????????????????????crs=albers_proj)

        #?得到china_total內部的散點坐標數(shù)組
        coords?=?coords[coords.within(china_total[0])]

        #?利用geovoronoi得到所需的泰森多邊形,其中poly_shapes即為我們需要的多邊形
        poly_shapes,?pts,?poly_to_pt_assignments?=?voronoi_regions_from_coords(np.array(coords.apply(lambda?g:?(g.x,?g.y)).tolist()),?
        ???????????????????????????????????????????????????????????????????????china_total[0])

        fig,?ax?=?plt.subplots(figsize=(8,?8))

        ax?=?china_total.plot(ax=ax,?facecolor='none',?
        ??????????????????????edgecolor='white',?linewidth=0.5)

        (
        ????gpd
        ????.GeoSeries(poly_shapes)
        ????.buffer(-10*1000)
        ????.plot(ax=ax,?
        ??????????facecolor='white',
        ??????????linewidth=0.2)
        )

        ax.set_xticks([])
        ax.set_yticks([])

        ax.set_facecolor('#4a4db7')
        fig.set_facecolor('#4a4db7')

        ax.spines['left'].set_color('none')
        ax.spines['top'].set_color('none')
        ax.spines['right'].set_color('none')
        ax.spines['bottom'].set_color('none')

        fig.savefig('圖8.png',?dpi=500,?bbox_inches='tight',?pad_inches=0)
        圖8

        以上就是本文的全部內容,歡迎在評論區(qū)與我進行討論~

        加入我們的知識星球【我們談論數(shù)據(jù)科學】

        愛上數(shù)據(jù)分析!





        · 推薦閱讀?·

        這個庫堪稱Python編程的瑞士軍刀!

        使用Python驗證常見的50個正則表達式

        地圖可視化神器kepler.gl近期重要更新


        瀏覽 41
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        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>
            亚洲老妇交性506070 | 新婚娇妻和别人做爰h | 可以免费看黄色视频的网站 | 三上悠亚被男上司在线播放 | 国产一区二区三区操逼视频 | 日韩免费专区 | 高清无吗一区二区三区 | 天天做天天爱天天做 | 日日干日日草 | 99久久精品国产99久久久久久红桃 |