在 plotly/how 中绘制单州等值线图以索引 geojson

Plot single state choropleth map in plotly/how to index geojson

我正在使用 geojson 数据并想绘制单个州的等值线图。为此,我需要从我的 geojson 数据中提取各个州。这是我正在使用的 plotly Github 的 geojson 数据(县级):

import plotly.express as px
import requests
import json

r = requests.get(
    'https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json'
    )
counties = json.loads(r.text)

我编写了以下代码来提取阿拉巴马州的所有县:

target_states = ["01"]
al = [i for i in counties["features"] if i["properties"]["STATE"] in target_states]

然而,这破坏了 json(我认为)的结构,因为它现在只是县词典的列表。当我尝试使用 al 绘制等值线图时,它不起作用(它编译但显示完全空白的图)。但是,当我尝试使用 al[0] 索引此列表时,我索引的单个县被正确绘制。我想我可以将列表中的所有词典与以下内容一起添加:

new = {}
for i in al:
  new.update(i)

但它并没有像我预期的那样起作用,new中只有一个县。但是,如果我运行以下,所有县字典都打印出来

for i in al:
  print(i)

所以,我想做的只是通过地理 json 数据对它们进行索引来绘制一个单独的状态。我可以为一个州的所有县编制索引,并可以正确绘制各个县,但我停留在最后一步,将一个州的所有县绘制在一起以构成一个州图。

您想要做的是根据特定 属性 过滤 您的数据而不改变结构。如果你看一下你的 counties 对象,它是一个具有这种结构的字典:

{
  'features': [
    {'geometry': .. , 'id': .. , 'properties': .. , 'type': ..},
    {'geometry': .. , 'id': .. , 'properties': .. , 'type': ..},
    ..
  ]
  'type': 'FeatureCollection'
}

为此,丢弃 'features' 列表中的任何内部字典,其 ['properties']['STATE'] 不在您的目标状态中。过滤列表的最简单方法是使用 列表理解。要维护结构,只需过滤 counties['features'] 并将结果重新分配给它:

target_states = ['01']
counties['features'] = [f for f in counties['features'] if f['properties']['STATE'] in target_states]

这是完整的代码和一个工作示例,与您可能使用的 plotly 中的相同示例:

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

r = requests.get('https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json')
counties = json.loads(r.text)
target_states = ['01']
counties['features'] = [f for f in counties['features'] if f['properties']['STATE'] in target_states]

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/fips-unemp-16.csv', dtype={'fips': str})

fig = px.choropleth(df, geojson=counties, locations='fips', color='unemp',
                    color_continuous_scale='Viridis',
                    range_color=(0, 12),
                    scope='usa',
                    labels={'unemp': 'unemployment rate'}
                    )
fig.update_layout(margin={'r': 0, 't': 0, 'l': 0, 'b': 0})
fig.show()

输出: