簡體   English   中英

我正在制作帶有 plotly express 的等值線圖。 如何將 csv 數據框中的值與 geojson 文件中的國家/地區進行匹配?

[英]I'm making a choropleth map with plotly express. How do I match up the values in my csv dataframe with the countries in the geojson file?

TL;DR - 當我執行 px.choropleth() 函數時,它只是給了我一張亞洲的大地圖。 沒有一個國家被塗上顏色。出了什么問題?

更詳細地:

我從一個包含世界上所有國家 GDP 的 csv 文件和一個包含亞洲所有國家的 geojson 文件開始。 我使用 Pandas 從 csv 文件中對東盟國家的數據進行子集化沒有問題。

我的首要挑戰之一是弄清楚如何從 geojson 文件中刪除所有非東盟國家。 我了解了一個名為 geopandas 的包,並用它來對東盟國家進行子集化,然后將 geopandas 數據幀轉換回 geojson 文件,以便在 plotly express choropleth 函數中使用。 我懷疑我使用 geopandas 進行子集化的方式可能是問題的根源,但我不確定。

這是我的子集數據框(GDP 值)的一瞥:

        Country     Year    Value          code
11390   Brunei      2018    1.356691e+10    BRN
13585   Cambodia    2018    2.457175e+10    KHM
37026   Indonesia   2018    1.042173e+12    IDN

我的理解是,geojson 文件需要具有與數據框中國家/地區對應的每個國家/地區的 ID。 因此,當我使用 geopandas 對 geojson 文件進行子集化時,我直接從我的 csv 數據框中附加了一個新的“代碼”列。 我檢查過,它似乎確實有效。 我將 geopandas 數據框制作成一個 geojson 文件,唯一剩下的國家是東盟國家,每個國家的屬性中都有正確的代碼('BRN'、'KHM' 等)。 我將這個子集化的 geojson 文件命名為“asean.json”。

我嘗試使用此代碼填充 plotly choropleth 函數中的位置參數。 它沒有用。

這是我的情節功能:

path_to_file = 'asean.json'
with open(path_to_file) as f:
    aseangeo = geojson.load(f)

fig = px.choropleth(data_frame=asean10, 
                    geojson=aseangeo, 
                    locations='code', 
                    color='Value',
              #     color_continuous_scale="Viridis",
                    range_color=(0, 12))
fig.show()

結果令人失望,我得到的只是一張整個亞洲大陸的大地圖,沒有填寫任何國家。

一張空白的亞洲地圖

就像我之前說的,我懷疑這可能是我使用 geopandas 對 geojson 文件進行子集化的方式,但我不確定。 什么地方出了錯?

因此,對於任何以相同問題查看這篇文章的人來說,答案就在 r-beginners 提供的這個鏈接中。

https://plotly.com/python/choropleth-maps/

在“按 Geojson 屬性索引”部分下,它清楚地說明

如果您使用的 GeoJSON 沒有 id 字段,或者您希望使用屬性字段中的鍵之一,則可以使用 featureidkey 參數指定匹配位置值的位置。

考慮到這一點,以下是我修復代碼的方法:

fig = px.choropleth(data_frame=asean10, 
                    geojson=aseangeo, 
                    locations='code', 
                    featureidkey="properties.code",
                    color='Value',
              #     color_continuous_scale="Viridis",
                    range_color=(0, 12))

這是我得到的結果:

更好的結果

現在我需要修復顏色和定位,但這是另一天的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM