在 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()
输出:
我正在使用 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()
输出: