【问题标题】:Folium chloropleth map only showing grey - help to troubleshootFolium choropleth map 仅显示灰色 - 帮助排除故障
【发布时间】:2022-01-22 11:20:26
【问题描述】:

我无法获取一些空气污染数据以在使用叶绿素的叶绿素地图中显示不同的颜色。请让我知道我的代码可能在哪里引发错误。我认为这是 key_on 参数,但需要帮助。

这就是我的地图的结果。 enter image description here

我希望空气污染数据的平均浓度显示在地图上,但地图仍然是灰色的。

这是我使用的文件:

  1. Geojson 文件 - 使用本网站右上角的“下载 zip”https://gist.github.com/miguelpaz/edbc79fc55447ae736704654b3b2ef90#file-uhf42-geojson

  2. 数据文件 - 从这里导出的数据https://a816-dohbesp.nyc.gov/IndicatorPublic/VisualizationData.aspx?id=2023,719b87,122,Summarize

    这是我的代码:

将 geopandas 导入为 gpd 进口叶

#clean pollution data
pm_df1 = pd.read_csv('/work/Fine Particulate Matter (PM2.5).csv',header = 5, usecols = ['GeoTypeName', 'Borough','Geography', 'Geography ID','Mean (mcg per cubic meter)'], nrows = 140)

#limit dataframe to rows with neighborhood (UHF 42) that matches geojson file
pm_df2 = pm_df1[(pm_df1['GeoTypeName'] == 'Neighborhood (UHF 42)')]
pm_df2

#clean geojson file
uhf_df2 = gpd.read_file('/work/uhf42.geojson', driver='GeoJSON')
uhf_df2.head()

#drop row 1 that has no geography
uhf_df3 = uhf_df2.iloc[1:]
uhf_df3.head()

## create a map
pm_testmap = folium.Map(location=[40.65639,-73.97379], tiles = "cartodbpositron", zoom_start=10)

# generate choropleth map 
pm_testmap.choropleth(
    geo_data=uhf_df3,
    data=pm_df2,
    columns=['Geography', 'Mean (mcg per cubic meter)'],
    key_on='feature.properties.uhf_neigh',  #think this is where I mess up.
    fill_color='BuPu', 
    fill_opacity=0.2, 
    line_opacity=0.7,
    legend_name='Average dust concentration',
    smooth_factor=0)

# display map
pm_testmap

【问题讨论】:

    标签: python folium


    【解决方案1】:

    key_on 的问题和你想的一样。
    两个数据上都写有 UHF 的名称,但格式完全不同。
    为了将这两者联系起来,必须首先对数据进行预处理。 我不知道你的数据。 如果您可以df.head() 显示这两个数据会很好,但我会根据我通过您提供的链接检查的数据进行解释。

    在您的 geojson 文件中,uhf_neigh 只是说Northeast Bronx。但是,您的 PM 数据似乎将区域列为 Bronx: Northeast Bronx。在绘制地图之前,似乎需要以下过程来统一您的本地名称。

    uhf_df2['UHF_NEIGH'] = uhf_df2['BOROUGH']+ ': ' + uhf_df2['UHF_NEIGH']
    

    【讨论】:

    • 谢谢 Urban87 和 r-beginners
    【解决方案2】:

    我尝试使用您的数据和代码运行它,但它甚至没有显示地图。您的代码应该没有问题,因为您已将数据框中的地名与 geojson 中的地名相关联。我放弃了字符串关联,将关联改为地名代码关联,地图就显示出来了。提供的 csv 文件加载失败,所以我删除了不必要的行并加载了它。另外,我将文件读取为 json 文件而不是 geopandas。

    import pandas as pd
    import geopandas as gpd
    import json
    import folium
    
    pm_df1 = pd.read_csv('./data/test_20211221.csv')
    pm_df1 = pm_df1[['GeoTypeName', 'Borough', 'Geography', 'Geography ID', 'Mean (mcg per cubic meter)']]
    pm_df2 = pm_df1[(pm_df1['GeoTypeName'] == 'Neighborhood (UHF 42)')]
    
    with open('./data/uhf42.geojson') as f:
        uhf_df3 = json.load(f)
        
    pm_testmap = folium.Map(location=[40.65639,-73.97379], tiles = "cartodbpositron", zoom_start=10)
    
    # generate choropleth map 
    pm_testmap.choropleth(
        geo_data=uhf_df3,
        data=pm_df2,
        columns=['Geography ID', 'Mean (mcg per cubic meter)'],
        key_on='feature.properties.uhfcode',  #think this is where I mess up.
        fill_color='BuPu', 
        fill_opacity=0.2, 
        line_opacity=0.7,
        legend_name='Average dust concentration',
        smooth_factor=0)
    
    # display map
    pm_testmap
    

    【讨论】:

    • 可以使用 geopandas 来做到这一点,但由于 geojson 是默认设置,我已经更改了地理数据加载。如果我的回答对你有帮助,请点击勾选接受我的回答。