Search code examples
pythonpython-3.xpandasfoliumchoropleth

How to get variation of the color in choropleth Folium?


I am surely missing something in choropleth configuration. Please find below code.

import pandas as pd
import folium
df = pd.read_csv("https://cocl.us/sanfran_crime_dataset",index_col=0)

# group by neighborhood
sf = df.groupby('PdDistrict').count()
sf = pd.DataFrame(sf,columns=['Category'])  # remove unneeded columns
sf.reset_index(inplace=True)   # default index, otherwise groupby column becomes index
sf.rename(columns={'PdDistrict':'Neighborhood','Category':'Count'}, inplace=True)
sf.sort_values(by='Count', inplace=True, ascending=False)
sf

# San Francisco latitude and longitude values
latitude = 37.77
longitude = -122.42
sf_neighborhood_geo = 'https://raw.githubusercontent.com/codeforamerica/click_that_hood/master/public/data/san-francisco.geojson'

# Create map
sf_map = folium.Map(location=[latitude,longitude], zoom_start=12)

# Use json file  TEST based on class
sf_map.choropleth(
       geo_data=sf_neighborhood_geo,
       data=sf,
       columns=['Neighborhood','Count'],
       key_on='name',
       fill_color='YlOrRd',
       fill_opacity='0.7',
       line_opacity='0.3',
       legend_name='Crime Rate in San Francisco, by Neighborhood')

folium.LayerControl().add_to(sf_map)

# display the map
sf_map

PLease let me know what part of the choropleth is not correct?


Solution

  • First of all, please use class folium.Choropleth() instead of method choropleth() which is deprecated.

    For example, for your problem:

    m = folium.Map(location=[latitude,longitude], zoom_start=12)
    
    folium.Choropleth(geo_data=sf_neighborhood_geo,
                      name='choropleth',
                      data=sf,
                      columns=['Neighborhood','Count'],
                      key_on='feature.properties.name',
                      fill_color='YlOrRd',
                      fill_opacity=0.7,
                      line_opacity=0.2,
                      legend_name='Crime Rate in San Francisco, by Neighborhood').add_to(m)
    
    folium.LayerControl().add_to(m)
    

    Having said that, there are two problems in your code:

    1. according to the geojson file, key_on='name' should be key_on='feature.properties.name'
    2. the column Neighborhood in you DataFrame does not have names contained in the geojson file, therefore you are going to likely obtain a map like this:

    enter image description here

    In order to obtain a meaningful choropleth map, names in sf_neighborhood_geo should correspond to values in sf['Neighborhood'].