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
--- | --- | --- | --- | --- | ---
106941 | 2001 | 103.933 | 30.292 | 5 | [255, 20, 255, 255]
165346 | 2013 | 104.192 | 30.592 | 58 | [255, 232, 255, 255]
118864 | 2003 | 104.267 | 31.433 | 3 | [255, 12, 255, 255]
53787 | 1995 | 104.308 | 29.600 | 5 | [255, 20, 255, 255]
316599 | 1999 | 103.833 | 29.567 | 6 | [255, 24, 255, 255]
136067 | 2003 | 103.792 | 30.392 | 7 | [255, 28, 255, 255]
87640 | 2001 | 104.975 | 31.592 | 4 | [255, 16, 255, 255]
216237 | 2007 | 105.708 | 29.567 | 3 | [255, 12, 255, 255]
67615 | 2009 | 103.592 | 30.775 | 8 | [255, 32, 255, 255]
22356 | 1997 | 103.808 | 30.908 | 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)