Brad
Brad

Reputation: 13

Bokeh Map Not Showing in Jupyter Notebook

I'm struggling to get a Bokeh map. The cell runs but does not show anything. It takes about 50s. I can get a blank map to display, but nothing I have tried has worked.

Jupyter version 6.4.12 run through Anaconda 2.3.2

import pandas as pd
import numpy as np

from bokeh.plotting import figure, show, output_notebook
from bokeh.tile_providers import CARTODBPOSITRON, get_provider
from bokeh.models import ColumnDataSource, LinearColorMapper, ColorBar, NumeralTickFormatter
from bokeh.palettes import PRGn, RdYlGn
from bokeh.transform import linear_cmap, factor_cmap
from bokeh.layouts import row, column
from bokeh.resources import INLINE

pd.set_option('display.max_columns', None)

output_notebook(INLINE)

I have Lat & Lon coordinates in my dataset, which I discovered I need to convert to mercator coordinates.

# Define function to switch from lat/long to mercator coordinates
def x_coord(x, y):
    
    lat = x
    lon = y
    
    r_major = 6378137.000
    x = r_major * np.radians(lon)
    scale = x/lon
    y = 180.0/np.pi * np.log(np.tan(np.pi/4.0 + lat * (np.pi/180.0)/2.0)) * scale
    return (x, y)

# Define coord as tuple (lat,long)
df['coordinates'] = list(zip(df['LATITUDE'], df['LONGITUDE']))

# Obtain list of mercator coordinates
mercators = [x_coord(x, y) for x, y in df['coordinates'] ]

# Create mercator column in our df
df['mercator'] = mercators

# Split that column out into two separate columns - mercator_x and mercator_y
df[['mercator_x', 'mercator_y']] = df['mercator'].apply(pd.Series)

From there, this is my code cell for the plot:

tile = get_provider('CARTODBPOSITRON')
source = ColumnDataSource(data = df)

palette = PRGn[11]

color_mapper = linear_cmap(field_name = 'FIRE_SIZE', palette = palette,
                          low=df['FIRE_SIZE'].min(), high = df['FIRE_SIZE'].max())

tooltips = [('Fire Year', '@FIRE_YEAR'),('State','@STATE')]

p = figure(title = 'Fire Locations',
           x_axis_type = 'mercator',
           y_axis_type = 'mercator',
           x_axis_label = 'Longitude',
           y_axis_label = 'Latitude',
          tooltips = tooltips)

p.add_tile(tile)

p.circle(x = 'mercator_x',
         y = 'mercator_y',
         color = color_mapper,
         size = 10,
         fill_alpha = 0.7,
         source = source)

color_bar = ColorBar(color_mapper = color_mapper['transform'],
                    formatter = NumeralTickFormatter(format='0.0[0000]'),
           `your text`         label_standoff = 13, width = 8, location = (0,0))

p.add_layout(color_bar, 'right')

show(p)

The cell runs, but nothing shows. There are no errors. I confirmed that I can get a plot to display using this code:

#Test

tile = get_provider('CARTODBPOSITRON')
p = figure(x_range = (-2000000, 2000000),
          y_range = (1000000, 7000000),
          x_axis_type = 'mercator',
          y_axis_type = 'mercator')

p.add_tile(tile)

show(p)

This is the map that displays

This is a large dataset, with 2,303,566 entries. I have checked that I have no null values in any of the columns that I am using, as well as verifying the correct data types (lat/lon are float64).

Upvotes: 0

Views: 309

Answers (1)

Brad
Brad

Reputation: 13

Returning to answer my own question here. After doing some more testing based on helpful comments I received from @mosc9575 and @bigreddot, I determined that the size of my dataset is the reason for Bokeh failing to display the map. I used a single point first, and then a small slice of my dataframe - and the map displayed just fine.

I hope this is helpful to someone else at some point!

Thanks to everyone who assisted.

Upvotes: 1

Related Questions