Adding Bokeh Slider to visualise GIS data by year

Viewed 50

i'm trying to visualise data imported from GIS. There are around 70 points, each of which has Place name and a year data and value for every given year.

     name       year    mean    geometry
0    Place 1    2008    105816    POINT (253662.995 663270.013)
1    Place 1    2009    94381    POINT (253662.995 663270.013)
2    Place 1    2010    101280    POINT (253662.995 663270.013)
3    Place 1    2011    86664    POINT (253662.995 663270.013)
4    Place 1    2012    83828    POINT (253662.995 663270.013)
5    Place 1    2013    91433    POINT (253662.995 663270.013)
6    Place 1    2014    90971    POINT (253662.995 663270.013)
7    Place 1    2015    140151    POINT (253662.995 663270.013)
8    Place 1    2016    104499    POINT (253662.995 663270.013)
9    Place 1    2017    110172    POINT (253662.995 663270.013)
10    Place 1    2018    111700    POINT (253662.995 663270.013)
11    Place 2    2008    99176    POINT (262062.995 669070.013)
12    Place 2    2009    101865    POINT (262062.995 669070.013)
13    Place 2    2010    80560    POINT (262062.995 669070.013)
14    Place 2    2011    61915    POINT (262062.995 669070.013)
15    Place 2    2012    74723    POINT (262062.995 669070.013)
16    Place 2    2013    71550    POINT (262062.995 669070.013)
17    Place 2    2014    239955    POINT (262062.995 669070.013)
18    Place 2    2015    93824    POINT (262062.995 669070.013)
19    Place 2    2016    71751    POINT (262062.995 669070.013)
20    Place 2    2017    86586    POINT (262062.995 669070.013)
21    Place 2    2018    74684    POINT (262062.995 669070.013)
22    Place 3    2008    180296    POINT (251662.995 663270.013)
23    Place 3    2009    165689    POINT (251662.995 663270.013)
24    Place 3    2010    175376    POINT (251662.995 663270.013)

I would like to visualise the data with a slider to only display points with values for the selected year.

This is what i'm doing

def getPointCoords(row, geom, coord_type):
    """Calculates coordinates ('x' or 'y') of a Point geometry"""
    if coord_type == 'x':
        return row[geom].x
    elif coord_type == 'y':
        return row[geom].y

# Calculate x and y coordinates of the points

stations['x'] = stations.apply(getPointCoords, geom='geometry', coord_type='x', axis=1)
stations['y'] = stations.apply(getPointCoords, geom='geometry', coord_type='y', axis=1)

# Make a copy, drop the geometry column and create ColumnDataSource
st_df = stations.drop('geometry', axis=1).copy()
stsource = ColumnDataSource(st_df)

#colour based on mean value
colormap = LinearColorMapper(palette='Magma256', low=min(stsource.data['mean']),high=max(stsource.data['mean']))

p= figure(plot_height=400, plot_width=400)
p.circle(x="x", y="y", source=stsource,color = {'field': 'mean', 'transform': colormap})

# Define the callback function: update_plot
def update_plot(attr, old, new):
    # Set the year name to slider.value and new_data to source.data
    year = slider.value
    new_data = {
        'x'       : stsource.data['year'].x,
        'y'       :stsource.data['year'].y,
        'mean' : stsource.data['year'].mean,

    }
    stsource.data = new_data


# Make a slider object: slider
slider = Slider(title = 'slider', start = 2008, end = 2020, step = 1, value = 2012)

# Attach the callback to the 'value' property of slider
slider.on_change('value', update_plot)

# Make a row layout of widgetbox(slider) and plot and add it to the current document
layout = row(widgetbox(slider), p)
curdoc().add_root(layout)

This is what I get as a result

enter image description here

I see all the points (good!) but I also see all the values when i hoover over.
it seems this section is not working, but I can't figure out why.

# Define the callback function: update_plot
def update_plot(attr, old, new):
    # Set the year name to slider.value and new_data to source.data
    year = slider.value
    new_data = {
        'x'       : stsource.data['year'].x,
        'y'       :stsource.data['year'].y,
        'mean' : stsource.data['year'].mean,

    }
    stsource.data = new_data

Please help! Thanks.

1 Answers

This eventually worked for me

# Define the callback function: update_plot
def update_plot(attr, old, new):
    # Set the year name to slider.value and new_data to source.data
    year = slider.value
    stsource.data  = st_df[st_df.year == year]

I realised that due to the nature of my data i don't need update separately x, y as those are always the same, but only a 'mean' value. So the easiest for me appeared to be to update source data based on a year value.

enter image description here

Related