{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# UFO dataset -> making a dashboard" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# usual things\n", "import pandas as pd\n", "import bqplot\n", "import numpy as np\n", "import ipywidgets\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "ufos = pd.read_csv(\"/Users/jillnaiman/Downloads/ufo-scrubbed-geocoded-time-standardized-00.csv\",\n", " names = [\"date\", \"city\", \"state\", \"country\",\n", " \"shape\", \"duration_seconds\", \"duration\",\n", " \"comment\", \"report_date\", \n", " \"latitude\", \"longitude\"],\n", " parse_dates = [\"date\", \"report_date\"])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "80332" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(ufos)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# downsampling if you want to:\n", "nsamples = 1000 # 100, 5000\n", "downSampleMask = np.random.choice(range(len(ufos)-1), nsamples, replace=False)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "#downSampleMask\n", "ufosDS = ufos.loc[downSampleMask]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datecitystatecountryshapeduration_secondsdurationcommentreport_datelatitudelongitude
112132011-01-01 00:00:00farmington hillsmiuscircle900.0appx. 15 minsSeries of red lights moving in a wave-like line.2011-01-0542.485278-83.377222
282942013-02-23 18:57:00whittiercauscircle300.03-5 minutes13 to 15 bright reddish/orange orb shaped obje...2013-02-2833.979167-118.031944
254092006-01-09 18:53:00el segundocausfireball10.010 secRotating fire ball moving very fast&#44 few hu...2006-02-1433.919167-118.415556
202762010-12-24 20:00:00cherry forkohuslight300.05 minThree red lights in triangle formation no soun...2011-04-0338.887500-83.614444
77832010-11-10 21:00:00spruce pinencustriangle3600.01 hourRed and Yellow Prisms in the Sky over Appalachia2012-05-1335.915278-82.064722
....................................
114002014-01-01 00:00:00ketteringohuscircle45.045 secondsStrange orange ball.2014-01-1039.689444-84.168889
168891998-12-10 01:15:00camp pendeltoncaNaNsphere109800.03 1/2 hrsBlue Sphere2005-05-2433.317842-117.320512
685572002-08-02 22:30:00camarillocausother15.015 secondsUnbelievable craft observed at low altitude ov...2013-04-1234.216389-119.036667
522322000-06-28 01:00:00newmarketnhusoval300.0aprox.5min.Black oval w/ multi-colored lights a frighteni...2000-08-2543.082778-70.935556
634021998-07-07 22:00:00hullgausoval300.0five minutessmall&#44 luminous&#44 silent&#44 gliding craft2007-06-1234.014722-83.293889
\n", "

1000 rows × 11 columns

\n", "
" ], "text/plain": [ " date city state country shape \\\n", "11213 2011-01-01 00:00:00 farmington hills mi us circle \n", "28294 2013-02-23 18:57:00 whittier ca us circle \n", "25409 2006-01-09 18:53:00 el segundo ca us fireball \n", "20276 2010-12-24 20:00:00 cherry fork oh us light \n", "7783 2010-11-10 21:00:00 spruce pine nc us triangle \n", "... ... ... ... ... ... \n", "11400 2014-01-01 00:00:00 kettering oh us circle \n", "16889 1998-12-10 01:15:00 camp pendelton ca NaN sphere \n", "68557 2002-08-02 22:30:00 camarillo ca us other \n", "52232 2000-06-28 01:00:00 newmarket nh us oval \n", "63402 1998-07-07 22:00:00 hull ga us oval \n", "\n", " duration_seconds duration \\\n", "11213 900.0 appx. 15 mins \n", "28294 300.0 3-5 minutes \n", "25409 10.0 10 sec \n", "20276 300.0 5 min \n", "7783 3600.0 1 hour \n", "... ... ... \n", "11400 45.0 45 seconds \n", "16889 109800.0 3 1/2 hrs \n", "68557 15.0 15 seconds \n", "52232 300.0 aprox.5min. \n", "63402 300.0 five minutes \n", "\n", " comment report_date \\\n", "11213 Series of red lights moving in a wave-like line. 2011-01-05 \n", "28294 13 to 15 bright reddish/orange orb shaped obje... 2013-02-28 \n", "25409 Rotating fire ball moving very fast, few hu... 2006-02-14 \n", "20276 Three red lights in triangle formation no soun... 2011-04-03 \n", "7783 Red and Yellow Prisms in the Sky over Appalachia 2012-05-13 \n", "... ... ... \n", "11400 Strange orange ball. 2014-01-10 \n", "16889 Blue Sphere 2005-05-24 \n", "68557 Unbelievable craft observed at low altitude ov... 2013-04-12 \n", "52232 Black oval w/ multi-colored lights a frighteni... 2000-08-25 \n", "63402 small, luminous, silent, gliding craft 2007-06-12 \n", "\n", " latitude longitude \n", "11213 42.485278 -83.377222 \n", "28294 33.979167 -118.031944 \n", "25409 33.919167 -118.415556 \n", "20276 38.887500 -83.614444 \n", "7783 35.915278 -82.064722 \n", "... ... ... \n", "11400 39.689444 -84.168889 \n", "16889 33.317842 -117.320512 \n", "68557 34.216389 -119.036667 \n", "52232 43.082778 -70.935556 \n", "63402 34.014722 -83.293889 \n", "\n", "[1000 rows x 11 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ufosDS" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7ce3732c32a542d0ac57079a5ce8106e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Figure(axes=[Axis(label='Longitude', scale=LinearScale()), Axis(label='Latitude', orientation='vertical', scal…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# quick scatter plot:\n", "\n", "# scales\n", "x_sc = bqplot.LinearScale()\n", "y_sc = bqplot.LinearScale()\n", "\n", "# set up axis\n", "x_ax = bqplot.Axis(scale=x_sc, label='Longitude')\n", "y_ax = bqplot.Axis(scale=y_sc, label='Latitude', \n", " orientation='vertical')\n", "\n", "# marks\n", "scatters = bqplot.Scatter(x = ufosDS['longitude'], y=ufosDS['latitude'],\n", " scales={'x':x_sc, 'y':y_sc})\n", "\n", "# interaction\n", "# none for this one\n", "\n", "# put all together in a figure\n", "fig = bqplot.Figure(marks=[scatters], axes=[x_ax, y_ax])\n", "fig" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# use ~~numpy~~ matplotlib to make some 2d histograms\n", "import matplotlib.colors as mpl_colors\n", "plt.hist2d(ufos['longitude'], ufos['latitude'], weights=ufos['duration_seconds'], \n", " bins=20, cmap='RdPu', norm=mpl_colors.SymLogNorm(10))\n", "cb = plt.colorbar()\n", "cb.set_label('weighted counts in bin')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, using matplotlib to make a quick plot, we have an idea of how our final heatmap should look." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# for bqplot heatmap, make the histograms ourselves\n", "nlong = 20\n", "nlat = 20\n", "\n", "hist2d, long_edges, lat_edges = np.histogram2d(ufos['longitude'], \n", " ufos['latitude'], \n", " weights = ufos['duration_seconds'], \n", " bins=[nlong, nlat])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(153348519.88, 0.0)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hist2d.max(), hist2d.min()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# taking a look at our map really quick\n", "plt.imshow(hist2d.T, cmap='RdPu', norm=mpl_colors.SymLogNorm(10))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((20, 20), (21,), (21,))" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hist2d.shape, long_edges.shape, lat_edges.shape" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-150., -135., -120., -105., -90., -75., -60., -45., -30.,\n", " -15., 0., 15., 30., 45., 60., 75., 90., 105.,\n", " 120., 135., 150.])" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "long_edges" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-150., -135., -120., -105., -90., -75., -60., -45., -30.,\n", " -15., 0., 15., 30., 45., 60., 75., 90., 105.,\n", " 120., 135.])" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "long_edges[:-1]" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-135., -120., -105., -90., -75., -60., -45., -30., -15.,\n", " 0., 15., 30., 45., 60., 75., 90., 105., 120.,\n", " 135., 150.])" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "long_edges[1:]" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-142.5, -127.5, -112.5, -97.5, -82.5, -67.5, -52.5, -37.5,\n", " -22.5, -7.5, 7.5, 22.5, 37.5, 52.5, 67.5, 82.5,\n", " 97.5, 112.5, 127.5, 142.5])" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(long_edges[:-1] + long_edges[1:])/2" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-167.78055671, -150.02555893, -132.27056115, -114.51556337,\n", " -96.76056559, -79.00556781, -61.25057003, -43.49557225,\n", " -25.74057447, -7.98557669, 9.76942109, 27.52441887,\n", " 45.27941665, 63.03441443, 80.78941221, 98.54440999,\n", " 116.29940777, 134.05440555, 151.80940333, 169.56440111])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# let's make bin centers from our edges\n", "long_centers = (long_edges[:-1] + long_edges[1:])/2\n", "long_centers" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-78.9736832, -71.1955456, -63.417408 , -55.6392704, -47.8611328,\n", " -40.0829952, -32.3048576, -24.52672 , -16.7485824, -8.9704448,\n", " -1.1923072, 6.5858304, 14.363968 , 22.1421056, 29.9202432,\n", " 37.6983808, 45.4765184, 53.254656 , 61.0327936, 68.8109312])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lat_centers = (lat_edges[:-1] + lat_edges[1:])/2\n", "lat_centers" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# specifing our own bins\n", "long_bins = np.linspace(-150, 150, nlong+1)\n", "lat_bins = np.linspace(-40, 70, nlat+1)\n", "\n", "hist2d, long_edges, lat_edges = np.histogram2d(ufos['longitude'], \n", " ufos['latitude'], \n", " weights = ufos['duration_seconds'], \n", " bins=[long_bins, lat_bins])" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "long_centers = (long_edges[:-1] + long_edges[1:])/2\n", "lat_centers = (lat_edges[:-1] + lat_edges[1:])/2" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# for bqplot we could figure this out ourselves, but let's save us some time right now:\n", "hist2d = hist2d.T" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/jillnaiman/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: RuntimeWarning: divide by zero encountered in log10\n", " \n" ] }, { "data": { "text/plain": [ "-inf" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# we'll also do some tricks for the colormap\n", "np.log10(hist2d).min()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# so here we will set the \"bad\" values -> those with no sitings\n", "hist2d[hist2d<= 0] = np.nan\n", "\n", "hist2d = np.log10(hist2d)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "#hist2d" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally: let's make our heatmap:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "fe09c00015324a1fb37cd94c352a010b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Figure(axes=[ColorAxis(orientation='vertical', scale=ColorScale(max=8.09710747658943, min=0.0, scheme='RdPu'),…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# scales\n", "x_sc = bqplot.LinearScale()\n", "y_sc = bqplot.LinearScale() \n", "col_sc = bqplot.ColorScale(scheme='RdPu', min=np.nanmin(hist2d), max=np.nanmax(hist2d))\n", "\n", "# axis\n", "x_ax = bqplot.Axis(scale=x_sc, label='Longitude')\n", "y_ax = bqplot.Axis(scale=y_sc, label='Latitude', orientation='vertical')\n", "c_ax = bqplot.ColorAxis(scale=col_sc, orientation='vertical', side='right')\n", "\n", "# marks\n", "heat_map = bqplot.GridHeatMap(color=hist2d, \n", " row=lat_centers, \n", " column=long_centers, \n", " scales={'color':col_sc, 'row':y_sc, 'column':x_sc},\n", " interactions={'click':'select'}, \n", " anchor_style={'fill':'blue'})\n", "\n", "# interactivty\n", "# not do for now\n", "\n", "# put all together\n", "fig = bqplot.Figure(marks=[heat_map], axes=[c_ax, y_ax, x_ax])\n", "fig" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "scrolled": false }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ff522955d7204d7d98262eb10f5b87e8", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(Label(value=''), Figure(axes=[ColorAxis(orientation='vertical', scale=ColorScale(max=8.09710747…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# scales\n", "x_sc = bqplot.LinearScale()\n", "y_sc = bqplot.LinearScale() \n", "col_sc = bqplot.ColorScale(scheme='RdPu', min=np.nanmin(hist2d), max=np.nanmax(hist2d))\n", "\n", "# axis\n", "x_ax = bqplot.Axis(scale=x_sc, label='Longitude')\n", "y_ax = bqplot.Axis(scale=y_sc, label='Latitude', orientation='vertical')\n", "c_ax = bqplot.ColorAxis(scale=col_sc, orientation='vertical', side='right')\n", "\n", "# marks\n", "heat_map = bqplot.GridHeatMap(color=hist2d, \n", " row=lat_centers, \n", " column=long_centers, \n", " scales={'color':col_sc, 'row':y_sc, 'column':x_sc},\n", " interactions={'click':'select'}, \n", " anchor_style={'fill':'blue'})\n", "\n", "# interactivity - do this!\n", "mySelectedLabel = ipywidgets.Label() # print out info about our selection\n", "def get_data_value(change):\n", " # to make sure we only support single selections\n", " if len(change['owner'].selected) == 1: # *only* 1 selection\n", " #print(change['owner'].selected)\n", " i,j = change['owner'].selected[0]\n", " v = hist2d[i,j]\n", " mySelectedLabel.value = 'Total Duration in log(sec) = ' + str(v)\n", " \n", "# make sure we \"observe\" for a change in our heatmap (traitlets)\n", "heat_map.observe(get_data_value, 'selected')\n", "\n", "# put all together\n", "fig = bqplot.Figure(marks=[heat_map], axes=[c_ax, y_ax, x_ax])\n", "#fig\n", "# layout our dashboard\n", "myDashboard = ipywidgets.VBox([mySelectedLabel, fig])\n", "myDashboard" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['_dom_classes',\n", " '_model_module',\n", " '_model_module_version',\n", " '_model_name',\n", " '_view_count',\n", " '_view_module',\n", " '_view_module_version',\n", " '_view_name',\n", " 'animation_duration',\n", " 'axes',\n", " 'background_style',\n", " 'fig_margin',\n", " 'interaction',\n", " 'layout',\n", " 'legend_location',\n", " 'legend_style',\n", " 'legend_text',\n", " 'marks',\n", " 'max_aspect_ratio',\n", " 'min_aspect_ratio',\n", " 'padding_x',\n", " 'padding_y',\n", " 'pixel_ratio',\n", " 'scale_x',\n", " 'scale_y',\n", " 'theme',\n", " 'title',\n", " 'title_style']" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig.keys" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "# for a random bin, let's plot what this distribution of siting duration as a function of \n", "#. would look like" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1949-10-10 20:30:00\n", "1 1949-10-10 21:00:00\n", "2 1955-10-10 17:00:00\n", "3 1956-10-10 21:00:00\n", "4 1960-10-10 20:00:00\n", " ... \n", "80327 2013-09-09 21:15:00\n", "80328 2013-09-09 22:00:00\n", "80329 2013-09-09 22:00:00\n", "80330 2013-09-09 22:20:00\n", "80331 2013-09-09 23:00:00\n", "Name: date, Length: 80332, dtype: datetime64[ns]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ufos['date'] # need to use a date scale" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "# first scales\n", "import datetime as dt # for formatting min/max in our bqplot.DateScale\n", "x_scl = bqplot.DateScale(min=dt.datetime(1950, 1, 1), max=dt.datetime(2020, 1,1))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "y_scl = bqplot.LogScale() # since we know duration is best shown in log" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "# axis\n", "ax_xcl = bqplot.Axis(label='Date', scale=x_scl) # dates\n", "ax_ycl = bqplot.Axis(label='Duration in log(sec)', scale=y_scl, \n", " orientation='vertical', side='left')" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "i, j = 19, 0 # x/y bin index (Jill is cheating by knowing there is data there)\n", "# is specify that we have only data in this lat/long bin\n", "#. => will mask out only these lats/longs corresponding to this i/j bin\n", "# (1) let's grab these sets of lats/longs based on our histogram edges\n", "longs = [long_edges[j], long_edges[j+1]]\n", "lats = [lat_edges[i], lat_edges[i+1]]\n", "#longs, lats\n", "# I only want data in this particular longtitude & latitude bin\n", "region_mask = ( (ufos['latitude'] >= lats[0]) & (ufos['latitude'] <= lats[1]) &\\\n", " (ufos['longitude'] >= longs[0]) & (ufos['longitude']<= longs[1]) )" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "327 -147.716389\n", "2845 -147.716389\n", "3620 -147.716389\n", "4602 -147.349444\n", "6011 -147.716389\n", " ... \n", "77347 -147.349444\n", "77497 -147.716389\n", "78571 -147.716389\n", "79029 -147.716389\n", "79470 -147.716389\n", "Name: longitude, Length: 74, dtype: float64" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ufos['longitude'][region_mask]" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "# let's make our marks -> scatter plot\n", "duration_scatt = bqplot.Scatter(x=ufos['date'][region_mask], \n", " y=ufos['duration_seconds'][region_mask],\n", " scales={'x':x_scl, 'y':y_scl})" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "5efa8db3c62e4d25a4fc507dbc013031", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Figure(axes=[Axis(label='Date', scale=DateScale(max=datetime.datetime(2020, 1, 1, 0, 0), min=datetime.datetime…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# put it all together as a figure\n", "fig_dur = bqplot.Figure(marks=[duration_scatt], axes=[ax_xcl, ax_ycl])\n", "fig_dur" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "# CREATE LABEL - #1\n", "mySelectedLabel = ipywidgets.Label() # print out info about our selection" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "# CREATE HEATMAP ELEMENTS - #2\n", "# scales\n", "x_sc = bqplot.LinearScale()\n", "y_sc = bqplot.LinearScale() \n", "col_sc = bqplot.ColorScale(scheme='RdPu', min=np.nanmin(hist2d), max=np.nanmax(hist2d))\n", "\n", "# axis\n", "x_ax = bqplot.Axis(scale=x_sc, label='Longitude')\n", "y_ax = bqplot.Axis(scale=y_sc, label='Latitude', orientation='vertical')\n", "c_ax = bqplot.ColorAxis(scale=col_sc, orientation='vertical', side='right')\n", "\n", "# marks\n", "heat_map = bqplot.GridHeatMap(color=hist2d, \n", " row=lat_centers, \n", " column=long_centers, \n", " scales={'color':col_sc, 'row':y_sc, 'column':x_sc},\n", " interactions={'click':'select'}, \n", " anchor_style={'fill':'blue'})" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "# CREATE SCATTER PLOT ELEMENTS - #3\n", "\n", "# scales\n", "x_scl = bqplot.DateScale(min=dt.datetime(1950, 1, 1), max=dt.datetime(2020, 1,1))\n", "y_scl = bqplot.LogScale() # since we know duration is best shown in log\n", "\n", "# axis\n", "ax_xcl = bqplot.Axis(label='Date', scale=x_scl) # dates\n", "ax_ycl = bqplot.Axis(label='Duration in log(sec)', scale=y_scl, \n", " orientation='vertical', side='left')\n", "\n", "# marks\n", "i, j = 19, 0 \n", "longs = [long_edges[j], long_edges[j+1]]\n", "lats = [lat_edges[i], lat_edges[i+1]]\n", "# I only want data in this particular longtitude & latitude bin\n", "region_mask = ( (ufos['latitude'] >= lats[0]) & (ufos['latitude'] <= lats[1]) &\\\n", " (ufos['longitude'] >= longs[0]) & (ufos['longitude']<= longs[1]) )\n", "\n", "duration_scatt = bqplot.Scatter(x=ufos['date'][region_mask], \n", " y=ufos['duration_seconds'][region_mask],\n", " scales={'x':x_scl, 'y':y_scl})" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['_model_module',\n", " '_model_module_version',\n", " '_model_name',\n", " '_view_count',\n", " '_view_module',\n", " '_view_module_version',\n", " '_view_name',\n", " 'apply_clip',\n", " 'color',\n", " 'colors',\n", " 'default_opacities',\n", " 'default_size',\n", " 'default_skew',\n", " 'display_legend',\n", " 'display_names',\n", " 'drag_color',\n", " 'drag_size',\n", " 'enable_delete',\n", " 'enable_hover',\n", " 'enable_move',\n", " 'fill',\n", " 'hovered_point',\n", " 'hovered_style',\n", " 'interactions',\n", " 'labels',\n", " 'marker',\n", " 'names',\n", " 'names_unique',\n", " 'opacity',\n", " 'preserve_domain',\n", " 'restrict_x',\n", " 'restrict_y',\n", " 'rotation',\n", " 'scales',\n", " 'scales_metadata',\n", " 'selected',\n", " 'selected_style',\n", " 'size',\n", " 'skew',\n", " 'stroke',\n", " 'stroke_width',\n", " 'tooltip',\n", " 'tooltip_location',\n", " 'tooltip_style',\n", " 'unhovered_style',\n", " 'unselected_style',\n", " 'update_on_move',\n", " 'visible',\n", " 'x',\n", " 'y']" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "duration_scatt.keys" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['_model_module',\n", " '_model_module_version',\n", " '_model_name',\n", " '_view_count',\n", " '_view_module',\n", " '_view_module_version',\n", " '_view_name',\n", " 'anchor_style',\n", " 'apply_clip',\n", " 'color',\n", " 'column',\n", " 'column_align',\n", " 'display_format',\n", " 'display_legend',\n", " 'enable_hover',\n", " 'font_style',\n", " 'interactions',\n", " 'labels',\n", " 'null_color',\n", " 'opacity',\n", " 'preserve_domain',\n", " 'row',\n", " 'row_align',\n", " 'scales',\n", " 'scales_metadata',\n", " 'selected',\n", " 'selected_style',\n", " 'stroke',\n", " 'tooltip',\n", " 'tooltip_location',\n", " 'tooltip_style',\n", " 'unselected_style',\n", " 'visible']" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "heat_map.keys" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "# LINKING SCATTER PLOT WITH HEATMAP\n", "def get_data_value(change):\n", " # to make sure we only support single selections\n", " if len(change['owner'].selected) == 1: # *only* 1 selection\n", " i,j = change['owner'].selected[0]\n", " v = hist2d[i,j]\n", " mySelectedLabel.value = 'Total Duration in log(sec) = ' + str(v)\n", " # UPDATE SCATTER PLOT TOO\n", " longs = [long_edges[j], long_edges[j+1]]\n", " lats = [lat_edges[i], lat_edges[i+1]]\n", " # I only want data in this particular longtitude & latitude bin\n", " region_mask = ( (ufos['latitude'] >= lats[0]) & (ufos['latitude'] <= lats[1]) &\\\n", " (ufos['longitude'] >= longs[0]) & (ufos['longitude']<= longs[1]) )\n", " # we already developed our scatter plot with binning in mind\n", " duration_scatt.x = ufos['date'][region_mask]\n", " duration_scatt.y = ufos['duration_seconds'][region_mask]\n", " \n", "# make sure we \"observe\" for a change in our heatmap (traitlets)\n", "heat_map.observe(get_data_value, 'selected')" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [], "source": [ "# CREATE FIGURE OBJECTS - #5\n", "fig_heatmap = bqplot.Figure(marks=[heat_map], axes=[c_ax, y_ax, x_ax])\n", "fig_dur = bqplot.Figure(marks=[duration_scatt], axes=[ax_xcl, ax_ycl])" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "068557388c014a5b92c2569704cc217d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(Label(value='Total Duration in log(sec) = 7.956605641674489'), HBox(children=(Figure(axes=[Colo…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Put it all together finally! As a dashboard\n", "fig_heatmap.layout.min_width='400px'\n", "fig_dur.layout.min_width = '400px'\n", "\n", "plots = ipywidgets.HBox([fig_heatmap, fig_dur])\n", "myDashboard = ipywidgets.VBox([mySelectedLabel, plots])\n", "myDashboard" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Beginning Chloropeth Maps (more next week)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f98e85f73b3b4f61aed0233b847cd1bc", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Figure(fig_margin={'top': 0, 'bottom': 0, 'left': 0, 'right': 0}, marks=[Map(hovered_styles={'hovered_fill': '…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# a quick map of the US\n", "\n", "# scales\n", "sc_geo = bqplot.AlbersUSA() # a projection from the globe (sphere) onto a plane (US centric)\n", "# \"axis\"\n", "state_data = bqplot.topo_load('map_data/USStatesMap.json')\n", "\n", "# marks\n", "states_map = bqplot.Map(map_data=state_data, scales={'projection':sc_geo})\n", "\n", "# put it all together in afigure\n", "fig = bqplot.Figure(marks=[states_map], \n", " fig_margin={'top':0, 'bottom':0, 'left':0, 'right':0})\n", "fig" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e0d2fd8c92164ee596e0efaadc166c3e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Figure(fig_margin={'top': 0, 'bottom': 0, 'left': 0, 'right': 0}, marks=[Map(hovered_styles={'hovered_fill': '…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# scales\n", "sc_geo = bqplot.Gnomonic() # a projection from the globe (sphere) onto a plane \n", "# \"axis\"\n", "shape_data = bqplot.topo_load('map_data/WorldMap.json')\n", "\n", "# marks\n", "shape_map = bqplot.Map(map_data=shape_data, scales={'projection':sc_geo})\n", "\n", "# put it all together in afigure\n", "fig = bqplot.Figure(marks=[shape_map], \n", " fig_margin={'top':0, 'bottom':0, 'left':0, 'right':0})\n", "fig" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Choose your own adventure\n", "1. Work on the dashboard for the HW <- totally fine place to be\n", "1. Check out the prep notebook for part 2 -> building a dashboard with an interactive map\n", " * tooltip (how to build one & limitation there of)\n", " * use this as a base to do multiple line plots to compare exports from states" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x_ax = bqplot.Axis(scale = x_sc, label='Agency Name', label_offset='100px',\n", " tick_rotate=45, # rotated\n", " tick_style={'font-size':'3px', 'tick_offset':'100px','text-anchor': 'top'})\n", "y_ax = bqplot.Axis(scale = y_sc, \n", " orientation = 'vertical', \n", " label = 'Congressional District')\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }