'How to colour code points using Bokeh with gmap

I currently have a gmap displaying gps points, however, I was hoping there was a way to colour code my GPS points based on which month they were recorded ? I have looked around online but am struggling to implement it into my own code. My dataset consists of GPS points collected throughout 2017, with a localDate index (in datetime format), and a longitude and latitude:

2017-11-12 |5.043978|118.715237 

Bokeh and gmap code:

def plot(lat, lng, zoom=10, map_type='roadmap'):
    gmap_options = GMapOptions(lat=lat, lng=lng, 
                           map_type=map_type, zoom=zoom)
    # the tools are defined below: 
    hover = HoverTool(
        tooltips = [
            # @price refers to the price column
            # in the ColumnDataSource. 
            ('Date', '@{Local Date}{%c}'),
            ('Lat', '@Lat'),
            ('Lon', '@Lon'), 
         
        ],
        formatters={'@{Local Date}': 'datetime'}
    )
    # below we replaced 'hover' (the default hover tool), 
    # by our custom hover tool
    p = gmap(api_key, gmap_options, title='Malaysia', 
         width=bokeh_width, height=bokeh_height,
         tools=[hover, 'reset', 'wheel_zoom', 'pan'])
    source = ColumnDataSource(day2017Averageddf)
    center = p.circle('Lon', 'Lat', size=4, alpha=0.5, 
                      color='yellow', source=source)
    show(p)
    return p
p = plot(Lat, Lon, map_type='satellite')


Solution 1:[1]

The base idea is to pass the colors to the color keyword in p.circle(). You are using one color, but you could create also a list of colors with the correct length and implement your own logic or you could make use of a mapper.

The code below is a copy from the original documentation about mappers.

from bokeh.models import ColumnDataSource
from bokeh.palettes import Spectral6
from bokeh.plotting import figure, output_notebook, show
from bokeh.transform import linear_cmap
output_notebook()

x = [1,2,3,4,5,7,8,9,10]
y = [1,2,3,4,5,7,8,9,10]

#Use the field name of the column source
mapper = linear_cmap(field_name='y', palette=Spectral6 ,low=min(y) ,high=max(y))
source = ColumnDataSource(dict(x=x,y=y))

p = figure(width=300, height=300, title="Linear Color Map Based on Y")
p.circle(x='x', y='y', line_color=mapper,color=mapper, fill_alpha=1, size=12, source=source)
color_bar = ColorBar(color_mapper=mapper['transform'], width=8)
p.add_layout(color_bar, 'right')

show(p)

color mapper in use

To come back to you problem. If the items in your Local Date column are of type pd.Timestamp, you can create a column "month" by this line

day2017Averageddf["month"] = day2017Averageddf["Local Date"].month

and use it for the mapper.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1