Matplotlib繪圖基礎(chǔ)之地圖繪制詳解
如果分析的數(shù)據(jù)與地域相關(guān),那么,把分析結(jié)果結(jié)合地圖一起展示的話,會讓可視化的效果得到極大的提升。
比如,分析各省GDP數(shù)據(jù),人口數(shù)據(jù),用柱狀圖,餅圖之類的雖然都可以展示分析結(jié)果,
不過,如果能在全國的地圖上展示各省的分析結(jié)果的話,會讓人留下更加深刻的印象。
將數(shù)據(jù)的分析結(jié)果展示在地圖上,難點在于:
- 如何繪制地圖,地圖是展示數(shù)據(jù)的基礎(chǔ),如何繪制出需要的地圖區(qū)域是第一步
- 數(shù)據(jù)和地圖關(guān)聯(lián),數(shù)據(jù)最終要顯示在地圖上,數(shù)據(jù)如何與地理坐標關(guān)聯(lián)也是重要的一步
- 地圖上展示數(shù)據(jù),也就是要在地圖上繪制不同的顏色或者幾何形狀來表達不同的數(shù)據(jù)
解決了上面3個難題,就能夠結(jié)合地圖做一些基本的數(shù)據(jù)展示了。
本篇通過一個基于南京各個區(qū)地理信息的分析示例,來演示如何一步步通過地圖來展示分析結(jié)果。
1. 繪制地圖
第一步是繪制地圖,其實地圖就是一塊塊不規(guī)則的多邊形拼接起來的。
在本篇的示例中,各個多邊形就是南京的各個區(qū)。
繪制多邊形不難,難的是如何得到各個多邊形的頂點坐標。
好在現(xiàn)在有很多的開放地理信息平臺,可以讓我們獲取到想要的地理信息。
1.1. 獲取地理信息
比如,通過阿里的DataV數(shù)據(jù)可視化平臺,可以獲取南京各個區(qū)的地理范圍信息。
在這個平臺上,左邊選擇區(qū)域,右邊會生成對應范圍的地理信息的數(shù)據(jù)。
地理信息數(shù)據(jù)是json
格式。
1.2. 展示地理信息
為了讀取地理信息數(shù)據(jù)并展示,需要用到一個 GeoPandas
的庫。
用 pip
安裝很簡單:
$ pip install geopandas
geopandas
可以直接讀取DataV數(shù)據(jù)可視化平臺生成的JSON數(shù)據(jù)并展示。
import geopandas as gpd df_geo = gpd.read_file( "https://geo.datav.aliyun.com/areas_v3/bound/320100_full.json" ) df_geo
json
文件的HTTP
地址DataV數(shù)據(jù)可視化平臺就是在上生成的。
這個文件中的關(guān)鍵字段就是 geometry,其中的內(nèi)容就是各個區(qū)的多邊形形狀的各個頂點的經(jīng)緯度坐標。
展示數(shù)據(jù):
import matplotlib.pyplot as plt fig, ax = plt.subplots() fig.set_size_inches(8, 8) # df_geo就是上面通過geopandas讀取的數(shù)據(jù) df_geo.plot( ax=ax, column="name", cmap="plasma", edgecolor="k", legend=True, legend_kwds={"loc": "lower left"} ) plt.show()
其中主要參數(shù)的含義:
ax
:matplotlib
生成的子圖,這里就是數(shù)據(jù)要繪制的位置column
:作為不同區(qū)域的名稱,這里就是南京各個區(qū)的名稱cmap
:一組顏色,分別對應不同的區(qū)edgecolor
:每個多邊形邊緣的顏色,這里設(shè)置的是黑色legend
:是否顯示圖例legend_kwds
:設(shè)置圖例的配置信息,這里只設(shè)置了圖例的位置
2. 地圖和數(shù)據(jù)關(guān)聯(lián)
首先生成一些測試數(shù)據(jù):
# 刪除 df_geo 中一些不必要的列 df_geo = df_geo.drop(columns=["childrenNum", "level", "parent", "subFeatureIndex"]) # 南京各個區(qū)的名稱 area_names = df_geo.loc[:, "name"] # df_val為測試數(shù)據(jù),其中name列是各個區(qū)的名稱 # value 列是一些隨機數(shù),模擬各個區(qū)的人口,GDP等數(shù)據(jù) df_val = pd.DataFrame({ "name": area_names.tolist(), "value": np.random.randint(10, 10000, len(area_names)) })
測試數(shù)據(jù) df_val
模擬其他途徑得到的業(yè)務(wù)數(shù)據(jù),
下面要將 df_val
中的指展示到地圖上,就要先把 df_val
和 df_geo
結(jié)合起來。
# 以 name 列作為結(jié)合兩個數(shù)據(jù)集的依據(jù) df = pd.merge(df_geo, df_val, on="name", how="left") df
這樣,我們就得到了同時包含**地理信息(geometry)和業(yè)務(wù)數(shù)據(jù)(value)**的數(shù)據(jù)集了。
3. 地圖上展示數(shù)據(jù)
接下來就是展示數(shù)據(jù)了,下面演示兩種在地圖上展示數(shù)據(jù)的方式。
3.1. 熱力圖方式
根據(jù) value 值的不同,用漸變色來顯示不同區(qū)的顏色。
fig, ax = plt.subplots() fig.set_size_inches(8, 8) ax.axis("off") df.plot( ax=ax, column="value", cmap="plasma", edgecolor="k", legend=True, legend_kwds={'label': "value", 'shrink':0.5}, ) for index in df.index: x = df.iloc[index].geometry.centroid.x y = df.iloc[index].geometry.centroid.y name = df.iloc[index]["name"] if name in ["建鄴區(qū)", "鼓樓區(qū)", "玄武區(qū)", "秦淮區(qū)"]: ax.text(x, y, name, ha="center", va="center", fontsize=8) else: ax.text(x, y, name, ha="center", va="center") plt.show()
其中,"建鄴區(qū)", "鼓樓區(qū)", "玄武區(qū)", "秦淮區(qū)" 四個區(qū)的面積比較小,
所以字體稍微調(diào)小了一些。
3.2. 分類展示
把 value
值分為3類,每類用不同的形式來表示。
- value < 3000
- 3000 <= value < 5000
- value >= 5000
import matplotlib.patches as mpatches fig, ax = plt.subplots() fig.set_size_inches(5, 10) ax.axis("off") legend_list = [] df[df["value"] < 3000].plot( ax=ax, color="lightblue", edgecolor="k", hatch="\\\\", legend=False, ) legend_list.append( mpatches.Patch( facecolor="lightblue", edgecolor="black", hatch="\\\\", label="value<3000" ) ) df[(df["value"] >= 3000) & (df["value"] < 5000)].plot( ax=ax, color="lightgreen", edgecolor="k", hatch="o", legend=False, ) legend_list.append( mpatches.Patch( facecolor="lightgreen", edgecolor="black", hatch="o", label="3000<=value<5000") ) df[df["value"] >= 5000].plot( ax=ax, color="r", edgecolor="k", hatch="*", legend=False, ) legend_list.append(mpatches.Patch( facecolor="r", edgecolor="black", hatch="*", label="value>=5000")) ax.legend(handles = legend_list, loc=(1, 0.5), title="value 等級", fontsize=12) plt.show()
4. 總結(jié)
結(jié)合地理信息展示數(shù)據(jù),讓數(shù)據(jù)更加的生動,特別是很多數(shù)據(jù)分析場景本身就和地理信息密切相關(guān)。
除了基于地域的各種經(jīng)濟或者人口等等的相關(guān)數(shù)據(jù),
還有各類氣象數(shù)據(jù),如能和地理信息結(jié)合展示的話,會讓人對整體情況一目了然。
文中用到的主要資源:
- DataV數(shù)據(jù)可視化平臺:https://datav.aliyun.com/portal/school/atlas/area_selector
- GeoPandas:https://github.com/geopandas/geopandas
以上就是Matplotlib繪圖基礎(chǔ)之地圖繪制詳解的詳細內(nèi)容,更多關(guān)于Matplotlib地圖的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
教你怎么用python實現(xiàn)字符串轉(zhuǎn)日期
今天教各位小伙伴怎么用python實現(xiàn)字符串轉(zhuǎn)日期,文中有非常詳細的代碼示例,對正在學習python的小伙伴很有幫助,需要的朋友可以參考下2021-05-05解決jupyterLab打開后出現(xiàn)Config option `template_path`not&
在JupyterLab中使用OpenCV環(huán)境時遇到模板路徑問題,經(jīng)排查發(fā)現(xiàn)是nbconvert版本過高導致的,通過降級nbconvert到5.6.1版本成功解決2025-02-02利用Python判斷整數(shù)是否是回文數(shù)的3種方法總結(jié)
這篇文章主要給大家介紹了關(guān)于如何利用Python判斷整數(shù)是否是回文數(shù)的3種方總結(jié),回文數(shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù),需要的朋友可以參考下2021-07-07python使用time、datetime返回工作日列表實例代碼
這篇文章主要介紹了python使用time、datetime返回工作日列表,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-05-05linux上運行python腳本,SyntaxError:?invalid?syntax的解決
這篇文章主要介紹了linux上運行python腳本,SyntaxError:?invalid?syntax的解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12