Plotly px.choropleth 不从 json 文件中绘制数据

Plotly px.choropleth not drawing data from json file

我有一个具有以下结构的 CSV 文件

cardodb_id,CONCELHO,LAT,LONG,DATA,INC 225,Abrantes,39.466667,-8.2,2020-03-25,1000

以及具有以下结构的 Json 文件:

{"type":"FeatureCollection", "features": [ {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-8.163874,39.626553],[-8.164286,39.626686],[-8.165384,39.626633],*(more coordinates' pairs)*,[-8.163874,39.626553]]]},"properties":{"cartodb_id":225,"id_2":225,"id_1":16,"id_0":182,"varname_2":null,"nl_name_2":null,"engtype_2":"Municipality","type_2":"Concelho","name_2":"Abrantes","name_1":"Santarém","name_0":"Portugal","iso":"PRT","split_id":"1"}} ]}

这里的 CSV 文件和 json 文件都是一个更大的集合的一部分,但这只是一个例子

我的代码如下

import json
with open('abrantes.json') as json_file:
    abr = json.load(json_file)

import pandas as pd

df = pd.read_csv("abrantes.csv")

import plotly.express as px

fig = px.choropleth(df, geojson=abr, locations='cardodb_id', color='INC',
                           color_continuous_scale="Viridis",
                           range_color=(0, 5000),
                           labels={'INC':'Incidência'}
                          )

fig.show()

最终结果是一个空白地图,右侧的比例从 0 到 5000,而我期望多边形填充对应于“INC”的颜色,即“1000”。

我做错了什么?预先感谢您提供的所有帮助。

要绘制地图,px.choropleth() 必须将数据框的 ID 与 GeoJSON 的 ID 相匹配。 使用参数 locations,您可以在数据框中指定具有 ID 的列。 您缺少的是用于在 GeoJSON 中指定相同 ID 的参数 featureidkey。或者,您可以省略 featureidkey 但 GeoJSON 中的功能需要参数 id.

那你得注意拼写了。你的 csv 文件有一列 cardodb_id,你的 GeoJSON 有一个参数 cartodb_id.

并且由于您提供的多边形非常小,因此在世界地图上是看不到的。因此,我建议添加 fig.update_geos(fitbounds="locations") 以将地图缩放到感兴趣的区域。

import json
import pandas as pd
import plotly.express as px

with open('abrantes.json') as json_file:
    abr = json.load(json_file)

df = pd.read_csv("abrantes.csv")

fig = px.choropleth(df, geojson=abr, locations='cardodb_id', color='INC',
                           color_continuous_scale="Viridis",
                           featureidkey="properties.cartodb_id",
                           range_color=(0, 5000),
                           labels={'INC':'Incidência'}
                          )
fig.update_geos(fitbounds="locations")                        
fig.show()