In [1]:
import os
import folium
print(folium.__version__)
In [2]:
import json
import pandas as pd
import requests
url = 'https://raw.githubusercontent.com/python-visualization/folium/master/examples/data'
us_states = f'{url}/us-states.json'
US_Unemployment_Oct2012 = f'{url}/US_Unemployment_Oct2012.csv'
geo_json_data = json.loads(requests.get(us_states).text)
unemployment = pd.read_csv(US_Unemployment_Oct2012)
unemployment_dict = unemployment.set_index('State')['Unemployment']
In [3]:
def my_color_function(feature):
"""Maps low values to green and high values to red."""
if unemployment_dict[feature['id']] > 6.5:
return '#ff0000'
else:
return '#008000'
In [4]:
m = folium.Map([43, -100], tiles='cartodbpositron', zoom_start=4)
folium.GeoJson(
geo_json_data,
style_function=lambda feature: {
'fillColor': my_color_function(feature),
'color': 'black',
'weight': 2,
'dashArray': '5, 5'
}
).add_to(m)
m.save(os.path.join('results', 'Colormaps_0.html'))
m
Out[4]:
In [5]:
import branca.colormap as cm
step = cm.StepColormap(
['green', 'yellow', 'red'],
vmin=3, vmax=10,
index=[3, 4, 8, 10],
caption='step'
)
step
Out[5]:
In [6]:
m = folium.Map([43, -100], tiles='cartodbpositron', zoom_start=4)
folium.GeoJson(
geo_json_data,
style_function=lambda feature: {
'fillColor': step(unemployment_dict[feature['id']]),
'color': 'black',
'weight': 2,
'dashArray': '5, 5'
}
).add_to(m)
m.save(os.path.join('results', 'Colormaps_1.html'))
m
Out[6]:
If you specify no index, colors will be set uniformely.
In [7]:
cm.StepColormap(['r', 'y', 'g', 'c', 'b', 'm'])
Out[7]:
In [8]:
linear = cm.LinearColormap(
['green', 'yellow', 'red'],
vmin=3, vmax=10
)
linear
Out[8]:
In [9]:
m = folium.Map([43, -100], tiles='cartodbpositron', zoom_start=4)
folium.GeoJson(
geo_json_data,
style_function=lambda feature: {
'fillColor': linear(unemployment_dict[feature['id']]),
'color': 'black',
'weight': 2,
'dashArray': '5, 5'
}
).add_to(m)
m.save(os.path.join('results', 'Colormaps_2.html'))
m
Out[9]:
Again, you can set the index
if you want something irregular.
In [10]:
cm.LinearColormap(
['red', 'orange', 'yellow', 'green'],
index=[0, 0.1, 0.9, 1.0]
)
Out[10]:
If you want to transform a linear map into a step one, you can use the method to_step
.
In [11]:
linear.to_step(6)
Out[11]:
You can also use more sophisticated rules to create the thresholds.
In [12]:
linear.to_step(
n=6,
data=[30.6, 50, 51, 52, 53, 54, 55, 60, 70, 100],
method='quantiles',
round_method='int'
)
Out[12]:
And the opposite is also possible with to_linear
.
In [13]:
step.to_linear()
Out[13]:
In [14]:
cm.linear.OrRd_09
Out[14]:
You can also use them to generate regular StepColormap
.
In [15]:
cm.linear.PuBuGn_09.to_step(12)
Out[15]:
Of course, you may need to scale the colormaps to your bounds. This is doable with .scale
.
In [16]:
cm.linear.YlGnBu_09.scale(3, 12)
Out[16]:
In [17]:
cm.linear.RdGy_11.to_step(10).scale(5, 100)
Out[17]:
At last, if you want to check them all, simply ask for linear
in the notebook.
In [18]:
cm.linear
Out[18]: