Interactive maps are used to visualize the data based on the geo-location category. any large dataset which contains a lot of geo-location data like cities, states, countries, etc can be plotted easily. bokeh is an open-source package, which uses the Bokeh visualization tool. It gives a flexible declarative interface for dynamic web-based visualizations as well as an interactive dashboard.
Prerequisite: Data Visualization using Bokeh
Example 1: In this example, we will create an exemplary dataset and then plot a Map using that Coordinates.
| X-Coordinate | Y-Coordinate | Data |
| -100833 | 5211172 | GeeksForGeeks |
| -100833 | 3086289 | GeeksForGeeks |
| -9754910 | 5142738 | GeeksForGeeks |
| 1999900 | 12738 | GeeksForGeeks |
| -7100000 | -2425502 | GeeksForGeeks |
Approach:
- Import Library.
- Initialize the tile provider.
- Provide the data needed to be displayed to the tuple.
- Pass height, width, and ranged x,y coordinates to figure(width, height) function.
- Add title.
- Provide the required coordinates to the circle function.
- Mention circle size and color.
- After circling display using show() function.
# Python program to make an
# interactive map using bokeh library
from bokeh.tile_providers import get_provider, Vendors
# Including Positron Map
tile_provider = get_provider(Vendors.CARTODBPOSITRON)
# Provide the data tuple needed
# to be display while hovering.
tooltips = ("GeeksForGeeks")
# Creating Map object
m = figure(title='World Map', plot_width=650,
plot_height=400, x_range=(-12000000, 9000000),
y_range=(-1000000, 7000000), x_axis_type='mercator',
y_axis_type='mercator', tooltips=tooltips)
# Adding title
m.add_tile(tile_provider)
# Circling the coordinates.
m.circle(x=-100833, y=5211172, size=15, color='red')
m.circle(x=-100833, y=3086289, size=15, color='blue')
m.circle(x=-9754910, y=5142738, size=15, color='orange')
m.circle(x=1999900, y=12738, size=15, color='green')
m.circle(x=-7100000, y=-2425502, size=15, color='black')
# Displaying the Map using show function
show(m)
Output:

Example 2: Scatter Map for India Starbucks Stores Dataset.

Pyproj: Pyproj is used to Perform cartographic transformations. Converts from longitude, latitude to native map projection x,y coordinates.
Approach:
- Import Required Libraries and functions.
- Initialise the tile provider.
- Preprocess the data needed to be displayed.
- Initialize the outproj and inproj.
- Convert the Respective Longitudes and Latitudes to MercatorX and MercatorY using Pyproj i.e x, y axis.
- Pass height, width and ranged x,y coordinates to figure(width, height) function.
- Add the title needed to be Displayed.
- Provide required coordinates to the circle function.
- Mention circle size and color.
- After circling display using show() function.
# Python program to make an interactive map using bokeh library.
# Importing Dataset.
from bokeh.io import output_notebook, show
from bokeh.plotting import figure
from bokeh.tile_providers import get_provider, Vendors
from pyproj import Proj, transform
import pandas as pd
df = pd.read_csv("./starbucks.csv")
# Initializing pyproj for Converting from longitude,
# latitude to native map projection x, y coordinates.
inProj = Proj(init='epsg:3857')
outProj = Proj(init='epsg:4326')
# Subsetting for indian dataset.
df = df[df.Country == "IN"]
lons, lats = [], []
# Converting Longitude and Latitude to x,y coordinates.
for lon, lat in list(zip(df["Longitude"], df["Latitude"])):
x, y = transform(outProj, inProj, lon, lat)
lons.append(x)
lats.append(y)
# Storing the coordinates.
df["MercatorX"] = lons
df["MercatorY"] = lats
# Renaming Columns for Tooltips
df = df.rename(columns={"Store Name": "Name", "State/Province": "State"})
# Importing all important functions
# for map creation and interaction.
# Including Positron Map.
tile_provider = get_provider(Vendors.CARTODBPOSITRON)
# Provide the data tuple needed to be display while hovering.
tooltips = [("State", "@State"), ('Name', '@Name')]
# Creating Map object.
m = figure(title='Starbucks Stores in India', plot_width=650,
plot_height=400, x_range=(-12000000, 9000000),
y_range=(-1000000, 7000000),
x_axis_type='mercator', y_axis_type='mercator',
tooltips=tooltips)
# Adding title.
m.add_tile(tile_provider)
m.circle(x='MercatorX', y='MercatorY', size=5, source=df)
# Displaying the Map using show function.
show(m)
Output:

Example 3: Connection Map for America Airport Dataset.
# Importing Airports2 Dataset which
# represent american flight travel data.
from bokeh.io import show
from bokeh.tile_providers import STAMEN_TERRAIN, STAMEN_TONER
from bokeh.plotting import figure
from pyproj import Proj, transform
import pandas as pd
df = pd.read_csv("./Airports2.csv")
# Hence Dataset is huge so selecting fewer rows.
df = df[1:1000]
# Converting Longitude and Latitudes to x,y coordinates
inProj = Proj(init='epsg:3857')
outProj = Proj(init='epsg:4326')
cols = ['Dest_airport_long', 'Dest_airport_lat',
'Org_airport_long', 'Org_airport_lat']
lines_x, lines_y = [], []
lons, lats = [], []
for lon_dest, lat_dest, lon_orig, lat_orig in df[cols].values:
lon_orig, lat_orig = transform(outProj, inProj, lon_orig, lat_orig)
lon_dest, lat_dest = transform(outProj, inProj, lon_dest, lat_dest)
# Append converted Coordinates.
lons.append(lon_dest)
lats.append(lat_dest)
# Creating Source and Destination points for connections.
lines_x.append([lon_orig, lon_dest])
lines_y.append([lat_orig, lat_dest])
# Two way connection points
df["MercatorX"] = lons
df["MercatorY"] = lats
# Loading Important Functions and Libraries
# Hence Connections needed to be represented so,
# selecting STAMEN_TONER
stamen_toner = get_provider(STAMEN_TONER)
# Selecting world coordinates
lon1, lat1 = transform(outProj, inProj, -150, -75)
lon2, lat2 = transform(outProj, inProj, 140, 75)
# Pass source-destination connections,
# tooltips to be displayed and title
m = figure(plot_width=800, plot_height=700,
x_range=(lon1, lon2), y_range=(lat1, lat2),
x_axis_type="mercator", y_axis_type="mercator",
tooltips=[("Origin_city", "@Origin_city"),
("Destination_city", "@Destination_city")],
title="Flight Travels in America")
# Add tile for stamen_toner
m.add_tile(stamen_toner)
# Drawing Multiple Lines.
m.multi_line(lines_x, lines_y, color="red")
# Circling the points and lines
m.circle(x="MercatorX", y="MercatorY", size=2,
alpha=0.8, color="red", source=df)
# Displaying the map.
show(m)
Output:
