python繪圖 | 空間地圖上散點氣泡繪製

2021-03-02 好奇心Log

今天的推文教程使用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 進行空間繪圖,完整代碼不是很多,但涉及的知識點較多,希望大家可以掌握。另外,這個房價的數據是基於爬蟲獲取,大家對於如「數據獲取-數據處理分析-數據可視化」 等一個完整的項目流程感覺怎樣?如果受眾較大,我後面也會針對性的進行推文準備的,大家可以在 讀者討論 區討論留言。

相關焦點

  • Python-matplotlib: 散點圖的繪製
    本文涉及的數據主要包括兩種,一種為全球各大洲的網格數據,用於繪製另類散點圖例,一種為全球各州的教育水平的師生比例,用於散點圖的繪圖。各大洲的網格數據如下(部分):如紅框所示,為所需要的數據,用於繪圖。本文的可視化繪製過程涉及seaborn的stripplot()方法,所需的庫、總體設置及用於繪製「抖動」的散點圖(類似ggplot2的position_jitter()),其目的就是為了防止散點重疊。
  • 基於Python圖表繪圖系統:matplotlib散點圖和氣泡圖,你了解嗎?
    繪製簡單散點圖既然已經知道了散點圖的主要作用,那麼下邊讓我們來繪製一個散點圖吧,一步一步,從簡單到進階!先來看一下我們的數據源,依然是一組小學的語數外考試成績:基於上述數據源,繪製語文成績與總成績的散點圖:繪製幾個圖之後,大家就會發現,常規的畫布啊標題啊標籤之類的設置都是通用的,只有畫圖函數是不一樣的,而大多數時候圖想畫出花樣來著,也是在各個參數上做文章,先來看下這個簡單的散點圖畫出來是什麼樣子的吧:通過這個圖能夠看出,語文成績和總成績之間存在一定的線性關係
  • Python-matplotlib 學術型散點圖繪製
    本期推文只要介紹學術散點圖的繪製教程,涉及的內容主要還是matplotlib散點圖的繪製,只不過添加了相關性分析,擬合關係式和顏色映射散點密度(大多數的英文文章中多出現此類圖表
  • 使用Python和R繪製數據地圖的十七個經典案例
    在這篇博客中,我將一些優秀的用戶內核變成迷你教程,作為在Kaggle上發布的數據集進行繪製地圖的開始。這篇文章中,你將學習如何用Python和R,使用包括實際代碼示例的幾種方法來布局和可視化地理空間數據。
  • Python-plotnine 核密度空間插值可視化繪製
    從本期開始,我會陸續推出系列空間插值的推文教程,包括常見的「Kriging(克裡金插值法)、Nearest Neighbor(最近鄰點插值法)、Polynomial Regression(多元回歸法)、Radial Basis Function(徑向基函數法)」 等多種空間插值方法,探索空間可視化帶給我們的視覺魅力
  • Python繪圖筆記:繪製四色散點圖和誤差條形圖
    1.散點圖一figure1#導入繪製散點圖所需要的包import matplotlib.pyplot as pltfrom numpy.random,這裡進行了隨機生成 scale = 200.0 * rand(n) #繪製散點圖,x,y坐標,顏色按照for循環中的四色進行變換 #設置透明度和點的邊緣色為無 ax.scatter(x, y, c=color, s=scale, label=color,
  • 推薦: 一本「高顏值」的Python語言數據可視化圖書
    所以很有必要系統性地介紹python的繪圖語法系統,包括最基礎也最常用的matplotlib包、常用於統計分析的seaborn、最新出現類似R ggplot2語法的plotnine以及用於地理空間數據可視化的basemap包。在先介紹數據可視化基礎理論後,本書系統性地介紹了幾乎所有常見的二維和三維圖表的繪製方法,包括簡單的柱形圖系列、條形圖系列、折線圖系列,地圖系列等。
  • Python-seaborn 基礎圖表繪製-散點圖
    上期推文推出第一篇基礎圖表繪製-R-ggplot2 基礎圖表繪製-散點圖 的繪製推文,得到了很多小夥伴的喜歡,也是我更加想使這個系列做的更加完善和系統,我之前也有說過,會推出Python和R的兩個版本繪製教程,接下來我們就推出基礎散點圖的Python繪製版本。
  • Python繪製三維圖
    平常我們看到的物體一般是三維空間中的立體圖形,今天跟大家一起來學習用Python繪製立體圖形。
  • 從數據到圖形|Origin軟體繪製散點圖的種類及方法
    Origin軟體作為最強大的科技繪圖軟體之一,除了基本的線條圖外,其散點圖、點線圖、條形圖以及相關的線性擬合、指數擬合等都是Excel無法與其相比的
  • 【科研貓·繪圖】世界地圖繪製
    這些圖頻繁出現在Lancet或者NEJM、CNS等頂級雜誌中,不過對於很多科研人員來說,地圖的繪製由於沒有現成軟體可以直接操作,一直以來都是一大難題。前面一期的教程中,我們給大家講解了中國地圖的繪製方法【科研貓·繪圖】中國地圖繪製:R語言版,在我們發布這篇教程後,馬上有同學反映想要學習世界地圖的繪製,作為實力寵粉的科研貓團隊,粉絲的要求豈能不去滿足。
  • Python-Matplotlib 動態曲線圖繪製
    引言動態曲線圖不同於動態氣泡圖,它可以查看部分指標在一段時間內的變化趨勢,本期推文將推出動態曲線圖的 Matplotlib 繪製過程,核心過程為 折線圖 和 散點圖 的繪製,詳細過程如下:02.數據可視化動態圖表的繪製主要在於折線圖和散點圖的繪製,我們採用的依舊還是面向對象式繪圖方式,這裡建議繪製較為複雜的圖表時多採用此方法進行繪製。
  • Python-Cartopy包(1):世界地圖的繪製
    千讀不如一練,Python氣象繪圖顯然也是如此,下面通過簡要的一幅小圖,我們來直觀感受cartopy的運作。通過魔改matpltlib出來的地圖比氣象學家上推送文章更加精美,將南北90度也同時標記出來了。
  • 手把手教你使用ggplot2繪製中國地圖
    自從用了ggplot2包,越來越覺得其博大精深,通過圖層的概念可以繪製豐富的可視化圖形,如常見的散點圖、直方圖、條形圖、折線圖等。今天就教大家如何使用ggplot2實現地圖的繪製,以及如何在地圖中加入氣泡圖和條形圖。本文所使用的數據來自於經管之家moonstone作者提供的流行病學樣本數據。有關地理信息數據可至文後的下載連結。
  • Python-Plotnine包: 類別插值地圖
    今天這篇推文,我們繼續空間數據可視化的最後一個系列-類別插值(categorical-spatial-interpolation) 可視化繪製的推文教程,這期我們使用Python進行繪製,涉及的知識點如下:sklearn.KNeighborsClassifier()機器學習應用
  • Python內置庫並非一無是處,用tkinter也可繪製簡單漂亮的散點圖
    今天,帶大家使用tkinter製作一個散點圖和折線圖。tkinter也可以是很好的繪圖工具01調用方法繪圖canvas提供的方法有很多,常用的繪製基本圖形的方法有:兩步搞定,這樣就可以繪製簡單的圖形了。
  • 繪圖技巧 | 「變形」地圖可視化繪製方法
    今天的推文給大家介紹一個可以繪製」變形「地圖的可視化包-R-cartogram包,改包可以使繪製地圖時某些區域的幾何形狀進行扭曲變化,可以更好的傳遞地圖表達的信息。其主要繪圖函數有cartogram_cont()、cartogram_ncont()和cartogram_dorling()函數,我們依次列出其對應的繪圖結果(以下直接給出繪製結果,註:地圖基於tmap包繪製),如下:「cartogram_cont()」
  • 如何用R繪製精美的散點圖
    R可以繪製出很棒的統計圖形,之前我們介紹了用R繪製柱狀圖。今天,小編帶著小夥伴們一起來了解下散點圖的繪製。小編自己看代碼的時候也覺得枯燥乏味,看圖片比看代碼輕鬆多了。所以我們先上圖。上圖就是通過R繪製出的散點圖,看起來也很漂亮。那麼,這種散點圖是如何繪製的呢?感興趣的小夥伴就請繼續看下面的代碼。
  • Python可視化庫解析
    1.matplotlibMatplotlib是一個Python 2維繪圖庫,已經成為python中公認的數據可視化工具,通過Matplotlib你可以很輕鬆地畫一些或簡單或複雜地圖形,幾行代碼即可生成線圖、直方圖、功率譜、條形圖、錯誤圖、散點圖等等。
  • Matplotlib-動態散點圖繪製
    統計學家Hans Rosling在TED上關於《亞洲何時崛起》的演講,其所採用的數據可視化展示方法可謂是近年來經典的可視化案例之一,動態的氣泡圖生動地展示了中國和印度是如何在過去幾十年拼命追趕歐美經濟的整個過程。可以說,Hans Rosling 讓數據變得不再枯燥無味,使其生動的展示在大眾面前,為了對這位偉大的統計學家的懷念(Hans Rosling 於2017年2月7日離開了這個世界。