Python Folium - 合并美国等值区域地图中的州

问题描述 投票:0回答:1

我想为美国创建一个自定义的等值线地图,其中我不想单独显示各州,而是想将一些州组合在一起,例如路易斯安那州、密西西比州、阿拉巴马州和阿肯色州。

下面是一些示例代码,其中的数据来自 Folium github page。我尝试向

state_data
添加一个名为“region”的列,该列设置为除上面指出的之外的所有其他状态的唯一值,并将
columns
中的
folium.Choroplet
参数更改为
region
但这不起作用任何一个。可以使用除
folium
之外的其他软件包(
plotly
等)。

示例代码:

import folium
import pandas as pd

sample_map = folium.Map(location=[40, -95], zoom_start=4)

url = (
    "https://raw.githubusercontent.com/python-visualization/folium/main/examples/data"
)
state_geo = f"{url}/us-states.json"
state_unemployment = f"{url}/US_Unemployment_Oct2012.csv"
state_data = pd.read_csv(state_unemployment)

folium.Choropleth(
    geo_data=state_geo,
    name="choropleth",
    data=state_data,
    columns=["Region", "Unemployment"],
    key_on="feature.id",
    fill_color="YlGn",
    fill_opacity=0.7,
    line_opacity=.1,
    legend_name="Unemployment Rate (%)",
).add_to(sample_map)

folium.LayerControl().add_to(sample_map)
sample_map.save('test.html')
python-3.x folium choropleth
1个回答
0
投票

您正在使用通过 JSON 数据描述美国各州的 JSON。您可以修改此 JSON,将所有所需的州合并到“中南部”区域,同时保留您已编写的代码。通过将所有四个州表示为一个州,并结合它们的失业率,您可以使用 Folium 并获得所需的结果。

这很难手动完成,所以我建议使用像QGIS这样的复杂工具。您可以将 JSON 导入到 QGIS,选择所需的状态,然后单击“合并所选功能”,如下所示:

合并所有状态会产生以下结果:

太好了,这就是我们想要的——新的四态。之后,您可以将其导出为 geojson 文件并将其用于美国的地理数据。

您可以调整此代码以使用新的 geojson 数据。我已将此 JSON 连接到我的 Github,以便于下载和参考,因为我无法在此处发布大量 JSON,并且已在我的代码中引用了 Github 文件。除了合并 JSON 的地理数据之外,您还需要合并给定州的失业率。我在代码中使用了新的 geojson 和组合费率:

import folium
import pandas as pd

southcentral_geo = 'https://raw.githubusercontent.com/samwilliamsprojects/southCentralRegion/main/southcentraljson.geojson' #location of adjusted geojson data
url = "https://raw.githubusercontent.com/python-visualization/folium/main/examples/data"
state_unemployment = f"{url}/US_Unemployment_Oct2012.csv"
state_data = pd.read_csv(state_unemployment)
# set the cumulative 4 states to the same avg unemployment
states = ["AR", "AL", "LA", "MS"]
total = 0
for state in states:
    total += float(state_data.loc[state_data['State'] == state]['Unemployment'])
avg = total / float(len(states))
state_data.loc[state_data['State'] == "AL", 'Unemployment'] = avg

sample_map = folium.Map(location=[35, -85], zoom_start=5)

folium.Choropleth(
    geo_data=southcentral_geo,  # new geojson data
    name="choropleth",
    data=state_data,
    columns=["State", "Unemployment"],
    key_on="feature.properties.id",
    fill_color="YlGn",
    fill_opacity=0.7,
    line_opacity=0.1,
    legend_name="Unemployment Rate (%)",
).add_to(sample_map)

folium.LayerControl().add_to(sample_map)
sample_map.save('1states_combined_unemployment.html')

使用新的 GeoJSON 数据,您可以查看所有州的合并情况,以及合并的失业率:

请注意,放大仍会显示州名称,但不会有硬定义的边界,并且失业率代表所有指定州的平均值,因此它们都具有相同的值。另外,在我提供的 GeoJSON 中,我将所有州合并为一个名为“阿拉巴马州”的州 - 我意识到这可能会令人困惑,您可能希望将其修改为“中南部地区”之类的内容。

© www.soinside.com 2019 - 2024. All rights reserved.