---
nbsphinx: hidden
---
import folium
Using colormaps
A few examples of how to use folium.colormap
in choropleths.
Let's load a GeoJSON file, and try to choropleth it.
import pandas
import requests
geo_json_data = requests.get(
"https://raw.githubusercontent.com/python-visualization/folium-example-data/main/us_states.json"
).json()
unemployment = pandas.read_csv(
"https://raw.githubusercontent.com/python-visualization/folium-example-data/main/us_unemployment_oct_2012.csv"
)
unemployment_dict = unemployment.set_index("State")["Unemployment"]
Self-defined
You can build a choropleth in using a self-defined function. It has to output an hexadecimal color string of the form #RRGGBB
or #RRGGBBAA
.
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"
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
StepColormap
But to help you define your colormap, we've embedded StepColormap
in folium.colormap
.
You can simply define the colors you want, and the index
(thresholds) that correspond.
import branca.colormap as cm
step = cm.StepColormap(
["green", "yellow", "red"], vmin=3, vmax=10, index=[3, 4, 8, 10], caption="step"
)
step
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
If you specify no index, colors will be set uniformly.
cm.StepColormap(["r", "y", "g", "c", "b", "m"])
LinearColormap
But sometimes, you would prefer to have a continuous set of colors. This can be done by LinearColormap
.
linear = cm.LinearColormap(["green", "yellow", "red"], vmin=3, vmax=10)
linear
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
Again, you can set the index
if you want something irregular.
cm.LinearColormap(["red", "orange", "yellow", "green"], index=[0, 0.1, 0.9, 1.0])
If you want to transform a linear map into a step one, you can use the method to_step
.
You can also use more sophisticated rules to create the thresholds.
linear.to_step(
n=6,
data=[30.6, 50, 51, 52, 53, 54, 55, 60, 70, 100],
method="quantiles",
round_method="int",
)
And the opposite is also possible with to_linear
.
Built-in
For convenience, we provide a (small) set of built-in linear colormaps, in folium.colormap.linear
.
You can also use them to generate regular StepColormap
.
cm.linear.PuBuGn_09.to_step(12)
Of course, you may need to scale the colormaps to your bounds. This is doable with .scale
.
cm.linear.YlGnBu_09.scale(3, 12)
cm.linear.RdGy_11.to_step(10).scale(5, 100)
At last, if you want to check them all, simply ask for linear
in the notebook.
Draw a ColorMap
on a map
By the way, a ColorMap is also a Folium Element
that you can draw on a map.
m = folium.Map(tiles="cartodbpositron")
colormap = cm.linear.Set1_09.scale(0, 35).to_step(10)
colormap.caption = "A colormap caption"
m.add_child(colormap)
m