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 | |
---|---|---|---|---|---|
253616 | 2011 | 103.475 | 29.792 | 5 | [255, 20, 255, 255] |
198401 | 2007 | 103.508 | 30.650 | 4 | [255, 16, 255, 255] |
178981 | 2013 | 105.058 | 29.608 | 59 | [255, 236, 255, 255] |
226082 | 2011 | 105.058 | 31.167 | 5 | [255, 20, 255, 255] |
230962 | 2011 | 103.833 | 30.925 | 12 | [255, 48, 255, 255] |
202332 | 2007 | 105.700 | 30.492 | 3 | [255, 12, 255, 255] |
269887 | 2005 | 103.583 | 31.000 | 13 | [255, 52, 255, 255] |
20071 | 1997 | 103.692 | 31.058 | 5 | [255, 20, 255, 255] |
125365 | 2003 | 104.167 | 30.967 | 5 | [255, 20, 255, 255] |
308091 | 1999 | 103.875 | 30.775 | 11 | [255, 44, 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)