InĀ [1]:
import pydeck as pdk
import pandas as pd

Plotting lights at night¶

NASA has collected global light emission data for over 30 years. The data set is a deeply fascinating one and has been used for news stories on the Syrian Civil War [1], North Korea [2], and economic growth [3].

In this notebook, we'll use a deck.gl HeatmapLayer to visualize some of the changes at different points in time.

Getting the data¶

The data for Chengdu, China, is cleaned and available below. Please note this data is meant for demonstration only.

InĀ [2]:
LIGHTS_URL = 'https://raw.githubusercontent.com/ajduberstein/lights_at_night/master/chengdu_lights_at_night.csv'
df = pd.read_csv(LIGHTS_URL)
df.head()
Out[2]:
year lng lat brightness
0 1993 104.575 31.808 4
1 1993 104.583 31.808 4
2 1993 104.592 31.808 4
3 1993 104.600 31.808 4
4 1993 104.675 31.808 4

Setting the colors¶

pydeck does need to know the color for this data in advance of plotting it

InĀ [3]:
df['color'] = df['brightness'].apply(lambda val: [255, val * 4,  255, 255])
df.sample(10)
Out[3]:
year lng lat brightness color
55762 2009 104.633 31.708 7 [255, 28, 255, 255]
62445 2009 104.208 31.100 12 [255, 48, 255, 255]
300624 1999 104.858 31.483 7 [255, 28, 255, 255]
183451 2007 104.508 31.533 4 [255, 16, 255, 255]
298274 2005 105.375 29.500 4 [255, 16, 255, 255]
104833 2001 104.600 30.450 4 [255, 16, 255, 255]
235625 2011 104.150 30.692 58 [255, 232, 255, 255]
59458 2009 104.458 31.342 7 [255, 28, 255, 255]
35995 1997 103.608 29.483 4 [255, 16, 255, 255]
297737 2005 103.542 29.517 5 [255, 20, 255, 255]

Plotting and interacting¶

We can plot this data set of light brightness by year, configuring a slider to filter the data as below:

InĀ [4]:
plottable = df[df['year'] == 1993].to_dict(orient='records')

view_state = pdk.ViewState(
    latitude=31.0,
    longitude=104.5,
    zoom=8)
scatterplot = pdk.Layer(
    'HeatmapLayer',
    data=plottable,
    get_position=['lng', 'lat'],
    get_weight='brightness',
    opacity=0.5,
    pickable=False,
    get_radius=800)
r = pdk.Deck(
    layers=[scatterplot],
    initial_view_state=view_state,
    views=[pdk.View(type='MapView', controller=None)])
r.show()
Out[4]:
InĀ [5]:
import ipywidgets as widgets
from IPython.display import display
slider = widgets.IntSlider(1992, min=1993, max=2013, step=2)
def on_change(v):
    results = df[df['year'] == slider.value].to_dict(orient='records')
    scatterplot.data = results
    r.update()
    
slider.observe(on_change, names='value')
display(slider)