You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1313 lines
101 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data exploration\n",
"This notebook provides an example how the data has been loaded and accessed for further analysis."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-11T22:32:56.827980Z",
"start_time": "2018-11-11T22:32:56.532764Z"
}
},
"outputs": [],
"source": [
"# Enable autoreloading of our modules. \n",
"# Most of the code will be located in the /src/ folder, \n",
"# and then called from the notebook.\n",
"\n",
"%reload_ext autoreload\n",
"%autoreload"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-11T22:33:22.254342Z",
"start_time": "2018-11-11T22:32:56.828981Z"
},
"scrolled": true
},
"outputs": [],
"source": [
"from IPython.core.debugger import set_trace\n",
"\n",
"import pandas as pd\n",
"import numpy as np\n",
"import os\n",
"\n",
"import plotly\n",
"import plotly.graph_objs as go\n",
"import plotly.plotly as py\n",
"\n",
"from ipywidgets import widgets\n",
"from IPython.display import display, clear_output, Image"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-12T06:21:34.344883Z",
"start_time": "2018-11-12T06:21:23.543798Z"
},
"pixiedust": {
"displayParams": {}
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\numpy\\lib\\arraysetops.py:472: FutureWarning:\n",
"\n",
"elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n",
"\n"
]
}
],
"source": [
"data_folder = '../data/interim'\n",
"df_waves = pd.read_csv(os.path.join(data_folder, 'waves.csv'), index_col=[0,1])\n",
"df_tides = pd.read_csv(os.path.join(data_folder, 'tides.csv'), index_col=[0,1])\n",
"df_profiles = pd.read_csv(os.path.join(data_folder, 'profiles.csv'), index_col=[0,1,2])\n",
"df_sites = pd.read_csv(os.path.join(data_folder, 'sites.csv'),index_col=[0])\n",
"df_profile_features = pd.read_csv(os.path.join(data_folder, 'profile_features.csv'),index_col=[0])"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-12T06:29:07.451994Z",
"start_time": "2018-11-12T06:29:06.845896Z"
},
"scrolled": false
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d5226c9774bd4353aac2cc8f5732b182",
"version_major": 2,
"version_minor": 0
},
"text/html": [
"<p>Failed to display Jupyter Widget of type <code>VBox</code>.</p>\n",
"<p>\n",
" If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n",
" that the widgets JavaScript is still loading. If this message persists, it\n",
" likely means that the widgets JavaScript library is either not installed or\n",
" not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n",
" Widgets Documentation</a> for setup instructions.\n",
"</p>\n",
"<p>\n",
" If you're reading this message in another frontend (for example, a static\n",
" rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n",
" it may mean that your frontend doesn't currently support widgets.\n",
"</p>\n"
],
"text/plain": [
"VBox(children=(HBox(children=(Dropdown(description='site_id: ', index=943, options=('AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', 'AVOCAn0004', 'AVOCAn0005', 'AVOCAn0006', 'AVOCAn0007', 'AVOCAn0008', 'AVOCAn0009', 'AVOCAs0001', 'AVOCAs0002', 'AVOCAs0003', 'AVOCAs0004', 'AVOCAs0005', 'AVOCAs0006', 'AVOCAs0007', 'AVOCAs0008', 'BILG0001', 'BILG0002', 'BILG0003', 'BILG0004', 'BILG0005', 'BLUEYS0001', 'BLUEYS0002', 'BLUEYS0003', 'BLUEYS0004', 'BLUEYS0005', 'BLUEYS0006', 'BOAT0001', 'BOAT0002', 'BOAT0003', 'BOAT0004', 'BOAT0005', 'BOOM0001', 'BOOM0002', 'BOOM0003', 'BOOM0004', 'BOOM0005', 'BOOM0006', 'BOOM0007', 'BOOM0008', 'BOOM0009', 'BOOM0010', 'BOOM0011', 'BOOM0012', 'BOOM0013', 'BOOM0014', 'CATHIE0001', 'CATHIE0002', 'CATHIE0003', 'CATHIE0004', 'CATHIE0005', 'CATHIE0006', 'CATHIE0007', 'CATHIE0008', 'CATHIE0009', 'CATHIE0010', 'CATHIE0011', 'CATHIE0012', 'CATHIE0013', 'CATHIE0014', 'CATHIE0015', 'CATHIE0016', 'CATHIE0017', 'CATHIE0018', 'CATHIE0019', 'CATHIE0020', 'CATHIE0021', 'CATHIE0022', 'CATHIE0023', 'CATHIE0024', 'CATHIE0025', 'CATHIE0026', 'CATHIE0027', 'CATHIE0028', 'CATHIE0029', 'CRESn0001', 'CRESn0002', 'CRESn0003', 'CRESn0004', 'CRESn0005', 'CRESn0006', 'CRESn0007', 'CRESn0008', 'CRESn0009', 'CRESn0010', 'CRESn0011', 'CRESn0012', 'CRESn0013', 'CRESn0014', 'CRESn0015', 'CRESn0016', 'CRESn0017', 'CRESn0018', 'CRESn0019', 'CRESn0020', 'CRESn0021', 'CRESn0022', 'CRESn0023', 'CRESn0024', 'CRESn0025', 'CRESn0026', 'CRESn0027', 'CRESn0028', 'CRESn0029', 'CRESn0030', 'CRESn0031', 'CRESn0032', 'CRESn0033', 'CRESn0034', 'CRESn0035', 'CRESn0036', 'CRESn0037', 'CRESn0038', 'CRESn0039', 'CRESn0040', 'CRESn0041', 'CRESn0042', 'CRESn0043', 'CRESn0044', 'CRESn0045', 'CRESn0046', 'CRESn0047', 'CRESn0048', 'CRESn0049', 'CRESn0050', 'CRESn0051', 'CRESn0052', 'CRESn0053', 'CRESn0054', 'CRESn0055', 'CRESn0056', 'CRESn0057', 'CRESn0058', 'CRESn0059', 'CRESn0060', 'CRESn0061', 'CRESn0062', 'CRESn0063', 'CRESn0064', 'CRESn0065', 'CRESn0066', 'CRESn0067', 'CRESn0068', 'CRESn0069', 'CRESn0070', 'CRESn0071', 'CRESn0072', 'CRESn0073', 'CRESn0074', 'CRESn0075', 'CRESn0076', 'CRESn0077', 'CRESn0078', 'CRESn0079', 'CRESn0080', 'CRESn0081', 'CRESn0082', 'CRESn0083', 'CRESn0084', 'CRESn0085', 'CRESn0086', 'CRESn0087', 'CRESn0088', 'CRESn0089', 'CRESn0090', 'CRESn0091', 'CRESn0092', 'CRESn0093', 'CRESn0094', 'CRESn0095', 'CRESn0096', 'CRESn0097', 'CRESn0098', 'CRESn0099', 'CRESn0100', 'CRESn0101', 'CRESn0102', 'CRESn0103', 'CRESn0104', 'CRESn0105', 'CRESn0106', 'CRESn0107', 'CRESn0108', 'CRESn0109', 'CRESn0110', 'CRESn0111', 'CRESn0112', 'CRESn0113', 'CRESn0114', 'CRESn0115', 'CRESn0116', 'CRESn0117', 'CRESn0118', 'CRESn0119', 'CRESn0120', 'CRESn0121', 'CRESn0122', 'CRESn0123', 'CRESn0124', 'CRESn0125', 'CRESs0001', 'CRESs0002', 'CRESs0003', 'CRESs0004', 'CRESs0005', 'CRESs0006', 'CRESs0007', 'CRESs0008', 'CRESs0009', 'CRESs0010', 'CRESs0011', 'CRESs0012', 'CRESs0013', 'CRESs0014', 'DEEWHYn0001', 'DEEWHYn0002', 'DEEWHYn0003', 'DEEWHYn0004', 'DEEWHYn0005', 'DEEWHYn0006', 'DEEWHYn0007', 'DEEWHYn0008', 'DEEWHYn0009', 'DEEWHYn0010', 'DEEWHYn0011', 'DEEWHYn0012', 'DEEWHYs0001', 'DEEWHYs0002', 'DEEWHYs0003', 'DEEWHYs0004', 'DEEWHYs0005', 'DEEWHYs0006', 'DEEWHYs0007', 'DEEWHYs0008', 'DIAMONDn0001', 'DIAMONDn0002', 'DIAMONDn0003', 'DIAMONDn0004', 'DIAMONDn0005', 'DIAMONDn0006', 'DIAMONDn0007', 'DIAMONDn0008', 'DIAMONDn0009', 'DIAMONDn0010', 'DIAMONDn0011', 'DIAMONDn0012', 'DIAMONDn0013', 'DIAMONDn0014', 'DIAMONDn0015', 'DIAMONDn0016', 'DIAMONDn0017', 'DIAMONDn0018', 'DIAMONDn0019', 'DIAMONDn0020', 'DIAMONDn0021', 'DIAMONDn0022', 'DIAMONDn0023', 'DIAMONDn0024', 'DIAMONDn0025', 'DIAMONDn0026', 'DIAMONDn0027', 'DIAMONDn0028', 'DIAMONDn0029', 'DIAMONDn0030', 'DIAMONDn0031', 'DIAMONDn0032', 'DIAMONDn0033', 'DIAMONDn0034', 'DIAMONDn0035', 'DIAMONDn0036', 'DIAMONDn0037', 'DIAMONDn0038', 'DIAMONDn0039', 'DIAMONDn0040', 'DIAMONDn0041', 'DIAMONDs0001', 'DIAMONDs0002', 'DIAMONDs0003', 'DIAMONDs0004', 'DIAMONDs0005', 'DIAMONDs0006', 'DIAMONDs0007', 'DUNBn0001', 'DUNBn0002', 'DUNBn0003', 'DUNBn0004', 'DUNBn0005', 'DUNBn0006', 'DUNBn0007', 'DUNBn0008', 'DUNBn0009', 'DUNBn0010', 'DUNBn0011', 'DUNBn0012', 'DUNBn0013', 'DUNBn0014', 'DUNBn0015', 'DUNBn0016', 'DUNBn0017', 'DUNBn0018', 'DUNBn0019', 'DUNBn0020', 'DUNBn0021', 'DUNBn0022', 'DUNBn0023', 'DUNBn0024', 'DUNBn0025', 'DUNBn0026', 'DUNBn0027', 'DUNBn0028', 'DUNBn0029', 'DUNBn0030', 'DUNBn0031', 'DUNBn0032', 'DUNBn0033', 'DUNBn0034', 'DUNBn0035', 'DUNBn0036', 'DUNBn0037', 'DUNBn0038', 'DUNBn0039', 'DUNBn0040', 'DUNBn0041', 'DUNBn0042', 'DUNBn0043', 'DUNBn0044', 'DUNBn0045', 'DUNBn0046', 'DUNBn0047', 'DUNBn0048', 'DUNBn0049', 'DUNBn0050', 'DUNBn0051', 'DUNBn0052', 'DUNBn0053', 'DUNBn0054', 'DUNBn0055', 'DUNBn0056', 'DUNBn0057', 'DUNBn0058', 'DUNBn0059', 'DUNBn0060', 'DUNBn0061', 'DUNBn0062', 'DUNBn0063', 'DUNBn0064', 'DUNBn0065', 'DUNBn0066', 'DUNBn0067', 'DUNBn0068', 'DUNBn0069', 'DUNBn0070', 'DUNBn0071', 'DUNBn0072', 'DUNBn0073', 'DUNBn0074', 'DUNBs0001', 'DUNBs0002', 'DUNBs0003', 'DUNBs0004', 'DUNBs0005', 'DUNBs0006', 'DUNBs0007', 'DUNBs0008', 'DUNBs0009', 'DUNBs0010', 'DUNBs0011', 'ELIZA0001', 'ELIZA0002', 'ELIZA0003', 'ELIZA0004', 'ELIZA0005', 'ELIZA0006', 'ELIZA0007', 'ENTRA0001', 'ENTRA0002', 'ENTRA0003', 'ENTRA0004', 'ENTRA0005', 'ENTRA0006', 'ENTRA0007', 'ENTRA0008', 'ENTRA0009', 'ENTRA0010', 'ENTRA0011', 'ENTRA0012', 'ENTRA0013', 'ENTRA0014', 'ENTRA0015', 'ENTRA0016', 'ENTRA0017', 'ENTRA0018', 'ENTRA0019', 'ENTRA0020', 'ENTRA0021', 'ENTRA0022', 'ENTRA0023', 'ENTRA0024', 'ENTRA0025', 'ENTRA0026', 'ENTRA0027', 'ENTRA0028', 'ENTRA0029', 'ENTRA0030', 'ENTRA0031', 'ENTRA0032', 'ENTRA0033', 'ENTRA0034', 'ENTRA0035', 'ENTRA0036', 'ENTRA0037', 'ENTRA0038', 'ENTRA0039', 'ENTRA0040', 'ENTRA0041', 'ENTRA0042', 'ENTRA0043', 'ENTRA0044', 'ENTRA0045', 'ENTRA0046', 'ENTRA0047', 'ENTRA0048', 'ENTRA0049', 'ENTRA0050', 'ENTRA0051', 'ENTRA0052', 'ENTRA0053', 'ENTRA0054', 'ENTRA0055', 'ENTRA0056', 'ENTRA0057', 'ENTRA0058', 'ENTRA0059', 'ENTRA0060', 'ENTRA0061', 'ENTRA0062', 'ENTRA0063', 'ENTRA0064', 'ENTRA0065', 'ENTRA0066', 'ENTRA0067', 'ENTRA0068', 'ENTRA0069', 'ENTRA0070', 'ENTRA0071', 'ENTRA0072', 'ENTRA0073', 'ENTRA0074', 'ENTRA0075', 'ENTRA0076', 'ENTRA0077', 'ENTRA0078', 'ENTRA0079', 'FOST0001', 'FOST0002', 'FOST0003', 'FOST0004', 'FOST0005', 'FOST0006', 'GRANTSn0001', 'GRANTSn0002', 'GRANTSn0003', 'GRANTSn0004', 'GRANTSn0005', 'GRANTSn0006', 'GRANTSn0007', 'GRANTSn0008', 'GRANTSn0009', 'GRANTSn0010', 'GRANTSn0011', 'GRANTSn0012', 'GRANTSn0013', 'GRANTSn0014', 'GRANTSn0015', 'GRANTSn0016', 'GRANTSn0017', 'GRANTSn0018', 'GRANTSn0019', 'GRANTSn0020', 'GRANTSn0021', 'GRANTSn0022', 'GRANTSn0023', 'GRANTSn0024', 'GRANTSs0001', 'GRANTSs0002', 'GRANTSs0003', 'GRANTSs0004', 'GRANTSs0005', 'GRANTSs0006', 'GRANTSs0007', 'GRANTSs0008', 'GRANTSs0009', 'GRANTSs0010', 'GRANTSs0011', 'GRANTSs0012', 'GRANTSs0013', 'GRANTSs0014', 'HARGn0001', 'HARGn0002', 'HARGn0003', 'HARGn0004', 'HARGn0005', 'HARGn0006', 'HARGn0007', 'HARGs0001', 'HARGs0002', 'HARGs0003', 'HARGs0004', 'HARGs0005', 'HARGs0006', 'HARGs0007', 'HARR0001', 'HARR0002', 'HARR0003', 'HARR0004', 'HARR0005', 'HARR0006', 'HARR0007', 'HARR0008', 'HARR0009', 'HARR0010', 'HARR0011', 'HARR0012', 'HARR0013', 'HARR0014', 'HARR0015', 'HARR0016', 'HARR0017', 'HARR0018', 'HARR0019', 'HARR0020', 'HARR0021', 'HARR0022', 'HARR0023', 'HARR0024', 'HARR0025', 'HARR0026', 'HARR0027', 'HARR0028', 'HARR0029', 'HARR0030', 'HARR0031', 'HARR0032', 'HARR0033', 'HARR0034', 'HARR0035', 'HARR0036', 'HARR0037', 'HARR0038', 'HARR0039', 'HARR0040', 'HARR0041', 'HARR0042', 'HARR0043', 'HARR0044', 'HARR0045', 'HARR0046', 'HARR0047', 'HARR0048', 'HARR0049', 'HARR0050', 'HARR0051', 'HARR0052', 'HARR0053', 'HARR0054', 'HARR0055', 'HARR0056', 'LHOUSE0001', 'LHOUSE0002', 'LHOUSE0003', 'LHOUSE0004', 'LHOUSE0005', 'LHOUSE0006', 'LHOUSE0007', 'LHOUSE0008', 'LHOUSE0009', 'LHOUSE0010', 'LHOUSE0011', 'LHOUSE0012', 'LHOUSE0013', 'LHOUSEn0001', 'LHOUSEn0002', 'LHOUSEn0003', 'LHOUSEn0004', 'LHOUSEn0005', 'LHOUSEn0006', 'LHOUSEn0007', 'LHOUSEn0008', 'LHOUSEn0009', 'LHOUSEn0010', 'LHOUSEn0011', 'LHOUSEn0012', 'LHOUSEn0013', 'LHOUSEn0014', 'LHOUSEn0015', 'LHOUSEn0016', 'LHOUSEn0017', 'LHOUSEn0018', 'LHOUSEn0019', 'LHOUSEn0020', 'LHOUSEn0021', 'LHOUSEn0022', 'LHOUSEn0023', 'LHOUSEn0024', 'LHOUSEn0025', 'LHOUSEn0026', 'LHOUSEn0027', 'LHOUSEn0028', 'LHOUSEn0029', 'LHOUSEn0030', 'LHOUSEn0031', 'LHOUSEn0032', 'LHOUSEn0033', 'LHOUSEn0034', 'LHOUSEn0035', 'LHOUSEn0036', 'LHOUSEn0037', 'LHOUSEn0038', 'LHOUSEn0039', 'LHOUSEn0040', 'LHOUSEn0041', 'LHOUSEn0042', 'LHOUSEn0043', 'LHOUSEn0044', 'LHOUSEn0045', 'LHOUSEn0046', 'LHOUSEn0047', 'LHOUSEn0048', 'LHOUSEn0049', 'LHOUSEn0050', 'LHOUSEn0051', 'LHOUSEn0052', 'LHOUSEn0053', 'LHOUSEn0054', 'LHOUSEn0055', 'LHOUSEn0056', 'LHOUSEn0057', 'LHOUSEn0058', 'LHOUSEn0059', 'LHOUSEn0060', 'LHOUSEn0061', 'LHOUSEn0062', 'LHOUSEn0063', 'LHOUSEn0064', 'LHOUSEn0065', 'LHOUSEn0066', 'LHOUSEn0067', 'LHOUSEn0068', 'LHOUSEn0069', 'LHOUSEn0070', 'LHOUSEn0071', 'LHOUSEn0072', 'LHOUSEn0073', 'LHOUSEn0074', 'LHOUSEn0075', 'LHOUSEn0076', 'LHOUSEn0077', 'LHOUSEn0078', 'LHOUSEn0079', 'LHOUSEn0080', 'LHOUSEn0081', 'LHOUSEn0082', 'LHOUSEn0083', 'LHOUSEn0084', 'LHOUSEn0085', 'LHOUSEn0086', 'LHOUSEn0087', 'LHOUSEn0088', 'LHOUSEn0089', 'LHOUSEn0090', 'LHOUSEn0091', 'LHOUSEn0092', 'LHOUSEn0093', 'LHOUSEs0001', 'LHOUSEs0002', 'LHOUSEs0003', 'LHOUSEs0004', 'LHOUSEs0005', 'LHOUSEs0006', 'LHOUSEs0007', 'LHOUSEs0008', 'LHOUSEs0009', 'LHOUSEs0010', 'LHOUSEs0011', 'LHOUSEs0012', 'LHOUSEs0013', 'LHOUSEs0014', 'LHOUSEs0015', 'LHOUSEs0016', 'LHOUSEs0017', 'LHOUSEs0018', 'LHOUSEs0019', 'LHOUSEs0020', 'LHOUSEs0021', 'LHOUSEs0022', 'LHOUSEs0023', 'LHOUSEs0024', 'LHOUSEs0025', 'LHOUSEs0026', 'LHOUSEs0027', 'LHOUSEs0028', 'LHOUSEs0029', 'LHOUSEs0030', 'LHOUSEs0031', 'LHOUSEs0032', 'MACM0001', 'MACM0002', 'MACM0003', 'MACM0004', 'MACM0005', 'MACM0006', 'MACM0007', 'MACM0008', 'MACM0009', 'MACM0010', 'MACM0011', 'MACM0012', 'MACM0013', 'MACM0014', 'MACM0015', 'MACM0016', 'MANNING0001', 'MANNING0002', 'MANNING0003', 'MANNING0004', 'MANNING0005', 'MANNING0006', 'MANNING0007', 'MANNING0008', 'MANNING0009', 'MANNING0010', 'MANNING0011', 'MANNING0012', 'MANNING0013', 'MANNING0014', 'MANNING0015', 'MANNING0016', 'MANNING0017', 'MANNING0018', 'MANNING0019', 'MANNING0020', 'MANNING0021', 'MANNING0022', 'MANNING0023', 'MANNING0024', 'MANNING0025', 'MANNING0026', 'MANNING0027', 'MANNING0028', 'MANNING0029', 'MANNING0030', 'MANNING0031', 'MANNING0032', 'MANNING0033', 'MANNING0034', 'MANNING0035', 'MANNING0036', 'MANNING0037', 'MANNING0038', 'MANNING0039', 'MANNING0040', 'MANNING0041', 'MANNING0042', 'MANNING0043', 'MANNING0044', 'MANNING0045', 'MANNING0046', 'MANNING0047', 'MANNING0048', 'MANNING0049', 'MANNING0050', 'MANNING0051', 'MANNING0052', 'MANNING0053', 'MANNING0054', 'MANNING0055', 'MANNING0056', 'MANNING0057', 'MANNING0058', 'MANNING0059', 'MANNING0060', 'MANNING0061', 'MANNING0062', 'MANNING0063', 'MANNING0064', 'MANNING0065', 'MANNING0066', 'MANNING0067', 'MANNING0068', 'MANNING0069', 'MANNING0070', 'MANNING0071', 'MANNING0072', 'MANNING0073', 'MANNING0074', 'MANNING0075', 'MANNING0076', 'MANNING0077', 'MANNING0078', 'MANNING0079', 'MANNING0080', 'MANNING0081', 'MANNING0082', 'MANNING0083', 'MANNING0084', 'MANNING0085', 'MANNING0086', 'MANNING0087', 'MANNING0088', 'MANNING0089', 'MANNING0090', 'MANNING0091', 'MANNING0092', 'MANNING0093', 'MANNING0094', 'MANNING0095', 'MANNING0096', 'MANNING0097', 'MANNING0098', 'MANNING0099', 'MANNING0100', 'MANNING0101', 'MANNING0102', 'MANNING0103', 'MANNING0104', 'MANNING0105', 'MANNING0106', 'MANNING0107', 'MANNING0108', 'MANNING0109', 'MANNING0110', 'MANNING0111', 'MANNING0112', 'MANNING0113', 'MANNING0114', 'MANNING0115', 'MANNING0116', 'MANNING0117', 'MANNING0118', 'MANNING0119', 'MANNING0120', 'MANNING0121', 'MANNING0122', 'MANNING0123', 'MANNING0124', 'MANNING0125', 'MANNING0126', 'MANNING0127', 'MONA0001', 'MONA0002', 'MONA0003', 'MONA0004', 'MONA0005', 'MONA0006', 'MONA0007', 'MONA0008', 'MONA0009', 'MONA0010', 'MONA0011', 'MONA0012', 'MONA0013', 'MONA0014', 'MONA0015', 'MONA0016', 'MONA0017', 'MONA0018', 'MONA0019', 'MONA0020', 'MONA0021', 'NAMB0001', 'NAMB0002', 'NAMB0003', 'NAMB0004', 'NAMB0005', 'NAMB0006', 'NAMB0007', 'NAMB0008', 'NAMB0009', 'NAMB0010', 'NAMB0011', 'NAMB0012', 'NAMB0013', 'NAMB0014', 'NAMB0015', 'NAMB0016', 'NAMB0017', 'NAMB0018', 'NAMB0019', 'NAMB0020', 'NAMB0021', 'NAMB0022', 'NAMB0023', 'NAMB0024', 'NAMB0025', 'NAMB0026', 'NAMB0027', 'NAMB0028', 'NAMB0029', 'NAMB0030', 'NAMB0031', 'NAMB0032', 'NAMB0033', 'NAMB0034', 'NAMB0035', 'NAMB0036', 'NAMB0037', 'NAMB0038', 'NAMB0039', 'NAMB0040', 'NAMB0041', 'NAMB0042', 'NAMB0043', 'NAMB0044', 'NAMB0045', 'NAMB0046', 'NAMB0047', 'NAMB0048', 'NAMB0049', 'NAMB0050', 'NAMB0051', 'NAMB0052', 'NAMB0053', 'NAMB0054', 'NAMB0055', 'NAMB0056', 'NAMB0057', 'NAMB0058', 'NAMB0059', 'NAMB0060', 'NAMB0061', 'NAMB0062', 'NAMB0063', 'NAMB0064', 'NAMB0065', 'NAMB0066', 'NAMB0067', 'NAMB0068', 'NAMB0069', 'NAMB0070', 'NAMB0071', 'NAMB0072', 'NAMB0073', 'NARRA0001', 'NARRA0002', 'NARRA0003', 'NARRA0004', 'NARRA0005', 'NARRA0006', 'NARRA0007', 'NARRA0008', 'NARRA0009', 'NARRA0010', 'NARRA0011', 'NARRA0012', 'NARRA0013', 'NARRA0014', 'NARRA0015', 'NARRA0016', 'NARRA0017', 'NARRA0018', 'NARRA0019', 'NARRA0020', 'NARRA0021', 'NARRA0022', 'NARRA0023', 'NARRA0024', 'NARRA0025', 'NARRA0026', 'NARRA0027', 'NARRA0028', 'NARRA0029', 'NARRA0030', 'NARRA0031', 'NARRA0032', 'NARRA0033', 'NARRA0034', 'NARRA0035', 'NARRA0036', 'NINEMn0001', 'NINEMn0002', 'NINEMn0003', 'NINEMn0004', 'NINEMn0005', 'NINEMn0006', 'NINEMn0007', 'NINEMn0008', 'NINEMn0009', 'NINEMn0010', 'NINEMn0011', 'NINEMn0012', 'NINEMn0013', 'NINEMn0014', 'NINEMn0015', 'NINEMn0016', 'NINEMn0017', 'NINEMn0018', 'NINEMn0019', 'NINEMn0020', 'NINEMn0021', 'NINEMn0022', 'NINEMn0023', 'NINEMn0024', 'NINEMn0025', 'NINEMn0026', 'NINEMn0027', 'NINEMn0028', 'NINEMn0029', 'NINEMn0030', 'NINEMn0031', 'NINEMn0032', 'NINEMn0033', 'NINEMn0034', 'NINEMn0035', 'NINEMn0036', 'NINEMn0037', 'NINEMn0038', 'NINEMn0039', 'NINEMn0040', 'NINEMn0041', 'NINEMn0042', 'NINEMn0043', 'NINEMn0044', 'NINEMn0045', 'NINEMn0046', 'NINEMn0047', 'NINEMn0048', 'NINEMn0049', 'NINEMn0050', 'NINEMn0051', 'NINEMn0052', 'NINEMn0053', 'NINEMn0054', 'NINEMs0001', 'NINEMs0002', 'NINEMs0003', 'NINEMs0004', 'NINEMs0005', 'NINEMs0006', 'NINEMs0007', 'NINEMs0008', 'NINEMs0009', 'NINEMs0010', 'NINEMs0011', 'NINEMs0012', 'NINEMs0013', 'NINEMs0014', 'NINEMs0015', 'NINEMs0016', 'NINEMs0017', 'NINEMs0018', 'NINEMs0019', 'NINEMs0020', 'NINEMs0021', 'NINEMs0022', 'NINEMs0023', 'NINEMs0024', 'NINEMs0025', 'NINEMs0026', 'NINEMs0027', 'NINEMs0028', 'NINEMs0029', 'NINEMs0030', 'NINEMs0031', 'NINEMs0032', 'NINEMs0033', 'NINEMs0034', 'NINEMs0035', 'NINEMs0036', 'NINEMs0037', 'NINEMs0038', 'NINEMs0039', 'NINEMs0040', 'NINEMs0041', 'NINEMs0042', 'NINEMs0043', 'NINEMs0044', 'NINEMs0045', 'NINEMs0046', 'NINEMs0047', 'NINEMs0048', 'NINEMs0049', 'NINEMs0050', 'NINEMs0051', 'NINEMs0052', 'NINEMs0053', 'NINEMs0054', 'NINEMs0055', 'NINEMs0056', 'NINEMs0057', 'NINEMs0058', 'NINEMs0059', 'NINEMs0060', 'NSHORE_n0001', 'NSHORE_n0002', 'NSHORE_n0003', 'NSHORE_n0004', 'NSHORE_n0005', 'NSHORE_n0006', 'NSHORE_n0007', 'NSHORE_n0008', 'NSHORE_n0009', 'NSHORE_n0010', 'NSHORE_n0011', 'NSHORE_n0012', 'NSHORE_n0013', 'NSHORE_n0014', 'NSHORE_n0015', 'NSHORE_n0016', 'NSHORE_n0017', 'NSHORE_n0018', 'NSHORE_n0019', 'NSHORE_n0020', 'NSHORE_n0021', 'NSHORE_n0022', 'NSHORE_n0023', 'NSHORE_n0024', 'NSHORE_n0025', 'NSHORE_n0026', 'NSHORE_n0027', 'NSHORE_n0028', 'NSHORE_n0029', 'NSHORE_n0030', 'NSHORE_n0031', 'NSHORE_n0032', 'NSHORE_n0033', 'NSHORE_n0034', 'NSHORE_n0035', 'NSHORE_n0036', 'NSHORE_n0037', 'NSHORE_n0038', 'NSHORE_n0039', 'NSHORE_n0040', 'NSHORE_n0041', 'NSHORE_n0042', 'NSHORE_n0043', 'NSHORE_n0044', 'NSHORE_n0045', 'NSHORE_n0046', 'NSHORE_n0047', 'NSHORE_n0048', 'NSHORE_n0049', 'NSHORE_n0050', 'NSHORE_n0051', 'NSHORE_n0052', 'NSHORE_n0053', 'NSHORE_n0054', 'NSHORE_n0055', 'NSHORE_n0056', 'NSHORE_n0057', 'NSHORE_n0058', 'NSHORE_n0059', 'NSHORE_n0060', 'NSHORE_n0061', 'NSHORE_n0062', 'NSHORE_n0063', 'NSHORE_n0064', 'NSHORE_n0065', 'NSHORE_n0066', 'NSHORE_n0067', 'NSHORE_n0068', 'NSHORE_n0069', 'NSHORE_n0070', 'NSHORE_n0071', 'NSHORE_n0072', 'NSHORE_n0073', 'NSHORE_n0074', 'NSHORE_n0075', 'NSHORE_n0076', 'NSHORE_n0077', 'NSHORE_n0078', 'NSHORE_n0079', 'NSHORE_n0080', 'NSHORE_n0081', 'NSHORE_n0082', 'NSHORE_s0001', 'NSHORE_s0002', 'NSHORE_s0003', 'NSHORE_s0004', 'NSHORE_s0005', 'NSHORE_s0006', 'NSHORE_s0007', 'NSHORE_s0008', 'NSHORE_s0009', 'NSHORE_s0010', 'NSHORE_s0011', 'NSHORE_s0012', 'NSHORE_s0013', 'NSHORE_s0014', 'NSHORE_s0015', 'NSHORE_s0016', 'NSHORE_s0017', 'NSHORE_s0018', 'NSHORE_s0019', 'NSHORE_s0020', 'NSHORE_s0021', 'NSHORE_s0022', 'NSHORE_s0023', 'NSHORE_s0024', 'NSHORE_s0025', 'NSHORE_s0026', 'NSHORE_s0027', 'NSHORE_s0028', 'NSHORE_s0029', 'NSHORE_s0030', 'NSHORE_s0031', 'NSHORE_s0032', 'NSHORE_s0033', 'NSHORE_s0034', 'NSHORE_s0035', 'NSHORE_s0036', 'NSHORE_s0037', 'NSHORE_s0038', 'NSHORE_s0039', 'NSHORE_s0040', 'NSHORE_s0041', 'NSHORE_s0042', 'NSHORE_s0043', 'NSHORE_s0044', 'OLDBAR0001', 'OLDBAR0002', 'OLDBAR0003', 'OLDBAR0004', 'OLDBAR0005', 'OLDBAR0006', 'OLDBAR0007', 'OLDBAR0008', 'OLDBAR0009', 'OLDBAR0010', 'OLDBAR0011', 'OLDBAR0012', 'OLDBAR0013', 'OLDBAR0014', 'OLDBAR0015', 'OLDBAR0016', 'OLDBAR0017', 'OLDBAR0018', 'OLDBAR0019', 'OLDBAR0020', 'OLDBAR0021', 'OLDBAR0022', 'OLDBAR0023', 'OLDBAR0024', 'OLDBAR0025', 'OLDBAR0026', 'OLDBAR0027', 'OLDBAR0028', 'OLDBAR0029', 'OLDBAR0030', 'OLDBAR0031', 'OLDBAR0032', 'OLDBAR0033', 'OLDBAR0034', 'OLDBAR0035', 'OLDBAR0036', 'ONEMILE0001', 'ONEMILE0002', 'ONEMILE0003', 'ONEMILE0004', 'ONEMILE0005', 'ONEMILE0006', 'ONEMILE0007', 'ONEMILE0008', 'ONEMILE0009', 'ONEMILE0010', 'ONEMILE0011', 'ONEMILE0012', 'ONEMILE0013', 'PEARLn0001', 'PEARLn0002', 'PEARLn0003', 'PEARLn0004', 'PEARLn0005', 'PEARLs0001', 'PEARLs0002', 'PEARLs0003', 'PEARLs0004', 'PEARLs0005', 'SCOT0001', 'SCOT0002', 'SCOT0003', 'SCOT0004', 'SCOT0005', 'SCOT0006', 'SCOT0007', 'SCOT0008', 'SCOT0009', 'SCOT0010', 'SCOT0011', 'SCOT0012', 'STOCNn0001', 'STOCNn0002', 'STOCNn0003', 'STOCNn0004', 'STOCNn0005', 'STOCNn0006', 'STOCNn0007', 'STOCNn0008', 'STOCNn0009', 'STOCNn0010', 'STOCNn0011', 'STOCNn0012', 'STOCNn0013', 'STOCNn0014', 'STOCNn0015', 'STOCNn0016', 'STOCNn0017', 'STOCNn0018', 'STOCNn0019', 'STOCNn0020', 'STOCNn0021', 'STOCNn0022', 'STOCNn0023', 'STOCNn0024', 'STOCNn0025', 'STOCNn0026', 'STOCNn0027', 'STOCNn0028', 'STOCNn0029', 'STOCNn0030', 'STOCNn0031', 'STOCNn0032', 'STOCNn0033', 'STOCNn0034', 'STOCNn0035', 'STOCNn0036', 'STOCNn0037', 'STOCNn0038', 'STOCNn0039', 'STOCNn0040', 'STOCNn0041', 'STOCNn0042', 'STOCNn0043', 'STOCNn0044', 'STOCNn0045', 'STOCNn0046', 'STOCNn0047', 'STOCNn0048', 'STOCNn0049', 'STOCNn0050', 'STOCNn0051', 'STOCNn0052', 'STOCNn0053', 'STOCNn0054', 'STOCNn0055', 'STOCNn0056', 'STOCNn0057', 'STOCNn0058', 'STOCNn0059', 'STOCNn0060', 'STOCNn0061', 'STOCNn0062', 'STOCNn0063', 'STOCNn0064', 'STOCNn0065', 'STOCNs0001', 'STOCNs0002', 'STOCNs0003', 'STOCNs0004', 'STOCNs0005', 'STOCNs0006', 'STOCNs0007', 'STOCNs0008', 'STOCNs0009', 'STOCNs0010', 'STOCNs0011', 'STOCNs0012', 'STOCNs0013', 'STOCNs0014', 'STOCNs0015', 'STOCNs0016', 'STOCNs0017', 'STOCNs0018', 'STOCNs0019', 'STOCNs0020', 'STOCNs0021', 'STOCNs0022', 'STOCNs0023', 'STOCNs0024', 'STOCNs0025', 'STOCNs0026', 'STOCNs0027', 'STOCNs0028', 'STOCNs0029', 'STOCNs0030', 'STOCNs0031', 'STOCNs0032', 'STOCNs0033', 'STOCNs0034', 'STOCNs0035', 'STOCNs0036', 'STOCNs0037', 'STOCNs0038', 'STOCNs0039', 'STOCNs0040', 'STOCNs0041', 'STOCNs0042', 'STOCNs0043', 'STOCNs0044', 'STOCNs0045', 'STOCNs0046', 'STOCNs0047', 'STOCNs0048', 'STOCNs0049', 'STOCNs0050', 'STOCNs0051', 'STOCNs0052', 'STOCNs0053', 'STOCNs0054', 'STOCNs0055', 'STOCNs0056', 'STOCNs0057', 'STOCNs0058', 'STOCNs0059', 'STOCNs0060', 'STOCNs0061', 'STOCNs0062', 'STOCNs0063', 'STOCNs0064', 'STOCNs0065', 'STOCNs0066', 'STOCNs0067', 'STOCNs0068', 'STOCNs0069', 'STOCNs0070', 'STOCNs0071', 'STOCNs0072', 'STOCNs0073', 'STOCNs0074', 'STOCNs0075', 'STOCNs0076', 'STOCNs0077', 'STOCNs0078', 'STOCNs0079', 'STOCNs0080', 'STOCNs0081', 'STOCNs0082', 'STOCNs0083', 'STOCNs0084', 'STOCNs0085', 'STOCNs0086', 'STOCNs0087', 'STOCNs0088', 'STOCNs0089', 'STOCNs0090', 'STOCNs0091', 'STOCNs0092', 'STOCNs0093', 'STOCNs0094', 'STOCNs0095', 'STOCNs0096', 'STOCNs0097', 'STOCNs0098', 'STOCNs0099', 'STOCNs0100', 'STOCNs0101', 'STOCNs0102', 'STOCNs0103', 'STOCNs0104', 'STOCNs0105', 'STOCNs0106', 'STOCNs0107', 'STOCNs0108', 'STOCNs0109', 'STOCNs0110', 'STOCNs0111', 'STOCNs0112', 'STOCNs0113', 'STOCNs0114', 'STOCNs0115', 'STOCNs0116', 'STOCNs0117', 'STOCNs0118', 'STOCNs0119', 'STOCNs0120', 'STOCNs0121', 'STOCNs0122', 'STOCNs0123', 'STOCNs0124', 'STOCNs0125', 'STOCNs0126', 'STOCNs0127', 'STOCNs0128', 'STOCNs0129', 'STOCNs0130', 'STOCNs0131', 'STOCNs0132', 'STOCNs0133', 'STOCNs0134', 'STOCNs0135', 'STOCNs0136', 'STOCNs0137', 'STOCNs0138', 'STOCNs0139', 'STOCNs0140', 'STOCNs0141', 'STOCNs0142', 'STOCNs0143', 'STOCNs0144', 'STOCNs0145', 'STOCNs0146', 'STOCNs0147', 'STOCNs0148', 'STOCNs0149', 'STOCNs0150', 'STOCNs0151', 'STOCNs0152', 'STOCNs0153', 'STOCNs0154', 'STOCNs0155', 'STOCNs0156', 'STOCNs0157', 'STOCNs0158', 'STOCNs0159', 'STOCNs0160', 'STOCNs0161', 'STOCNs0162', 'STOCNs0163', 'STOCNs0164', 'STOCNs0165', 'STOCNs0166', 'STOCNs0167', 'STOCNs0168', 'STOCNs0169', 'STOCNs0170', 'STOCNs0171', 'STOCNs0172', 'STOCNs0173', 'STOCNs0174', 'STOCNs0175', 'STOCNs0176', 'STOCNs0177', 'STOCNs0178', 'STOCNs0179', 'STOCNs0180', 'STOCNs0181', 'STOCNs0182', 'STOCNs0183', 'STOCNs0184', 'STOCNs0185', 'STOCNs0186', 'STOCNs0187', 'STOCNs0188', 'STOCNs0189', 'STOCNs0190', 'STOCNs0191', 'STOCNs0192', 'STOCNs0193', 'STOCNs0194', 'STOCNs0195', 'STOCNs0196', 'STOCNs0197', 'STOCNs0198', 'STOCNs0199', 'STOCNs0200', 'STOCNs0201', 'STOCNs0202', 'STOCNs0203', 'STOCNs0204', 'STOCNs0205', 'STOCNs0206', 'STOCNs0207', 'STOCNs0208', 'STOCNs0209', 'STOCS0001', 'STOCS0002', 'STOCS0003', 'STOCS0004', 'STOCS0005', 'STOCS0006', 'STOCS0007', 'STOCS0008', 'STOCS0009', 'STOCS0010', 'STOCS0011', 'STOCS0012', 'STOCS0013', 'STOCS0014', 'STOCS0015', 'STOCS0016', 'STOCS0017', 'STOCS0018', 'STOCS0019', 'STOCS0020', 'STOCS0021', 'STOCS0022', 'STOCS0023', 'STOCS0024', 'STOCS0025', 'STOCS0026', 'STOCS0027', 'STOCS0028', 'STOCS0029', 'STOCS0030', 'STOCS0031', 'STOCS0032', 'STOCS0033', 'STOCS0034', 'STOCS0035', 'STOCS0036', 'STOCS0037', 'STOCS0038', 'STOCS0039', 'STOCS0040', 'STOCS0041', 'STOCS0042', 'STOCS0043', 'STOCS0044', 'STOCS0045', 'STOCS0046', 'STUART0001', 'STUART0002', 'STUART0003', 'STUART0004', 'STUART0005', 'STUART0006', 'STUART0007', 'STUART0008', 'STUART0009', 'STUART0010', 'STUART0011', 'STUART0012', 'STUART0013', 'STUART0014', 'STUART0015', 'STUART0016', 'STUART0017', 'STUART0018', 'STUART0019', 'STUART0020', 'STUART0021', 'STUART0022', 'STUART0023', 'STUART0024', 'STUART0025', 'STUART0026', 'STUART0027', 'STUART0028', 'STUART0029', 'STUART0030', 'STUART0031', 'STUART0032', 'STUART0033', 'STUART0034', 'STUART0035', 'STUART0036', 'STUART0037', 'STUART0038', 'STUART0039', 'STUART0040', 'STUART0041', 'STUART0042', 'STUART0043', 'STUART0044', 'STUART0045', 'STUART0046', 'STUART0047', 'STUART0048', 'STUART0049', 'STUART0050', 'STUART0051', 'STUART0052', 'STUART0053', 'STUART0054', 'STUART0055', 'STUART0056', 'STUART0057', 'STUART0058', 'STUART0059', 'STUART0060', 'STUART0061', 'STUART0062', 'STUART0063', 'STUART0064', 'STUART0065', 'STUART0066', 'STUART0067', 'STUART0068', 'STUART0069', 'STUART0070', 'STUART0071', 'STUART0072', 'STUART0073', 'STUART0074', 'STUART0075', 'STUART0076', 'STUART0077', 'STUART0078', 'STUART0079', 'STUART0080', 'STUART0081', 'STUART0082', 'STUART0083', 'STUART0084', 'STUART0085', 'STUART0086', 'STUART0087', 'STUART0088', 'STUART0089', 'SWRO0001', 'SWRO0002', 'SWRO0003', 'SWRO0004', 'SWRO0005', 'SWRO0006', 'SWRO0007', 'SWRO0008', 'SWRO0009', 'SWRO0010', 'SWRO0011', 'SWRO0012', 'SWRO0013', 'SWRO0014', 'SWRO0015', 'SWRO0016', 'SWRO0017', 'SWRO0018', 'SWRO0019', 'SWRO0020', 'SWRO0021', 'SWRO0022', 'SWRO0023', 'SWRO0024', 'SWRO0025', 'SWRO0026', 'TREACH0001', 'TREACH0002', 'TREACH0003', 'TREACH0004', 'TREACH0005', 'TREACH0006', 'TREACH0007', 'TREACH0008', 'TREACH0009', 'TREACH0010', 'TREACH0011', 'TREACH0012', 'TREACH0013', 'TREACH0014', 'TREACH0015', 'TREACH0016', 'WAMBE0001', 'WAMBE0002', 'WAMBE0003', 'WAMBE0004', 'WAMBE0005', 'WAMBE0006', 'WAMBE0007', 'WAMBE0008', 'WAMBE0009', 'WAMBE0010', 'WAMBE0011', 'WAMBE0012', 'WAMBE0013', 'WAMBE0014', 'WAMBE0015', 'WAMBE0016', 'WAMBE0017', 'WAMBE0018', 'WAMBE0019', 'WAMBE0020', 'WAMBE0021', 'WAMBE0022', 'WAMBE0023', 'WAMBE0024', 'WAMBE0025', 'WAMBE0026', 'WAMBE0027'), value='NARRA0001'),)), HBox(children=(FigureWidget({\n",
" 'data': [{'name': 'Pre Storm Profile',\n",
" 'type': 'scatter',\n",
" 'uid': 'a4b395ae-dd30-4b11-8943-b57902ef3fbc',\n",
" 'x': [0],\n",
" 'y': [0]},\n",
" {'name': 'Post Storm Profile',\n",
" 'type': 'scatter',\n",
" 'uid': 'ca7b4abf-cfd0-4527-b57e-7f23ef048d19',\n",
" 'x': [0],\n",
" 'y': [0]},\n",
" {'marker': {'color': 'rgb(17, 157, 255)', 'size': 20},\n",
" 'mode': 'markers',\n",
" 'name': 'Pre-storm dune crest',\n",
" 'type': 'scatter',\n",
" 'uid': 'f14b6086-8986-43e0-bfb5-d4a9d08735c9',\n",
" 'x': [0],\n",
" 'y': [0]},\n",
" {'marker': {'color': 'rgb(231, 99, 250)', 'size': 20},\n",
" 'mode': 'markers',\n",
" 'name': 'Pre-storm dune toe',\n",
" 'type': 'scatter',\n",
" 'uid': 'fbc7b977-16fd-453e-b7a5-67a4337ca75c',\n",
" 'x': [0],\n",
" 'y': [0]}],\n",
" 'layout': {'legend': {'x': 0, 'y': 1},\n",
" 'margin': {'b': 50, 'l': 20, 'r': 20, 't': 50},\n",
" 'title': 'Bed Profiles',\n",
" 'xaxis': {'autorange': True,\n",
" 'range': [0, 200],\n",
" 'showgrid': True,\n",
" 'showline': True,\n",
" 'title': 'x (m)',\n",
" 'zeroline': True},\n",
" 'yaxis': {'autorange': False,\n",
" 'range': [-1, 20],\n",
" 'showgrid': True,\n",
" 'showline': True,\n",
" 'title': 'z (m)',\n",
" 'zeroline': True}}\n",
"}), FigureWidget({\n",
" 'data': [{'lat': array([-33.46381539, -33.46301835, -33.46221051, ..., -33.4279646 ,\n",
" -33.42732743, -33.42671036]),\n",
" 'lon': array([151.43639576, 151.43690633, 151.43738179, ..., 151.4501613 ,\n",
" 151.45092222, 151.45170635]),\n",
" 'marker': {'size': 10},\n",
" 'mode': 'markers',\n",
" 'text': array(['AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', ..., 'WAMBE0025', 'WAMBE0026',\n",
" 'WAMBE0027'], dtype='<U12'),\n",
" 'type': 'scattermapbox',\n",
" 'uid': 'e1eeba12-494d-4fca-b196-7d9728480f74'},\n",
" {'lat': [0],\n",
" 'lon': [0],\n",
" 'marker': {'color': 'rgb(255, 0, 0)', 'opacity': 0.5, 'size': 20},\n",
" 'mode': 'markers',\n",
" 'text': array(['AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', ..., 'WAMBE0025', 'WAMBE0026',\n",
" 'WAMBE0027'], dtype='<U12'),\n",
" 'type': 'scattermapbox',\n",
" 'uid': '716f1003-999e-4a6b-9f08-783b3f0d27f8'}],\n",
" 'layout': {'autosize': True,\n",
" 'hovermode': 'closest',\n",
" 'mapbox': {'accesstoken': ('pk.eyJ1IjoiY2hyaXNsZWFtYW4iLCJ' ... 'Hp5bCJ9.U2dwFg2c7RFjUNSayERUiw'),\n",
" 'bearing': 0,\n",
" 'center': {'lat': -33.7, 'lon': 151.3},\n",
" 'pitch': 0,\n",
" 'style': 'satellite-streets',\n",
" 'zoom': 12},\n",
" 'margin': {'b': 50, 'l': 20, 'r': 20, 't': 50},\n",
" 'showlegend': False}\n",
"})))))"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"###### Create widget to control which site we're viewing\n",
"textbox = widgets.Dropdown(\n",
" description='site_id: ',\n",
" value='NARRA0001',\n",
" options=df_profiles.index.get_level_values('site_id').unique().sort_values().tolist()\n",
")\n",
"container = widgets.HBox(children=[textbox])\n",
"\n",
"\n",
"# Add panel for pre/post storm profiles\n",
"trace1 = go.Scatter(\n",
" x = [0],\n",
" y = [0],\n",
" name='Pre Storm Profile'\n",
")\n",
"trace2 = go.Scatter(\n",
" x = [0],\n",
" y = [0],\n",
" name='Post Storm Profile'\n",
")\n",
"trace3 = go.Scatter(\n",
" x = [0],\n",
" y = [0],\n",
" name='Pre-storm dune crest',\n",
" mode = 'markers',\n",
" marker = dict(\n",
" color = 'rgb(17, 157, 255)',\n",
" size = 20,\n",
" ),\n",
")\n",
"trace4 = go.Scatter(\n",
" x = [0],\n",
" y = [0],\n",
" name='Pre-storm dune toe',\n",
" mode = 'markers',\n",
" marker = dict(\n",
" color = 'rgb(231, 99, 250)',\n",
" size = 20,\n",
" ),\n",
")\n",
"\n",
"layout = go.Layout(\n",
" title = 'Bed Profiles',\n",
" legend=dict(x=0, y=1),\n",
" margin=dict(t=50,b=50,l=20,r=20),\n",
" xaxis=dict(\n",
" title = 'x (m)',\n",
" autorange=True,\n",
" showgrid=True,\n",
" zeroline=True,\n",
" showline=True,\n",
" range=[0, 200]\n",
" ),\n",
" yaxis=dict(\n",
" title = 'z (m)',\n",
" autorange=False,\n",
" showgrid=True,\n",
" zeroline=True,\n",
" showline=True,\n",
" range=[-1, 20]\n",
" )\n",
")\n",
"\n",
"g1 = go.FigureWidget(data=[trace1, trace2, trace3, trace4],\n",
" layout=layout)\n",
"\n",
"\n",
"# Add panel for google maps\n",
"mapbox_access_token = 'pk.eyJ1IjoiY2hyaXNsZWFtYW4iLCJhIjoiY2pvNTY1MzZpMDc2OTN2bmw5MGsycHp5bCJ9.U2dwFg2c7RFjUNSayERUiw'\n",
"\n",
"data = [\n",
" go.Scattermapbox(\n",
" lat=df_sites['lat'],\n",
" lon=df_sites['lon'],\n",
" mode='markers',\n",
" marker=dict(\n",
" size=10\n",
" ),\n",
" text=df_sites.index.get_level_values('site_id'),\n",
" ),\n",
" go.Scattermapbox(\n",
" lat=[0],\n",
" lon=[0],\n",
" mode='markers',\n",
" marker=dict(\n",
" size=20,\n",
" color='rgb(255, 0, 0)',\n",
" opacity = 0.5,\n",
" ),\n",
" text=df_sites.index.get_level_values('site_id'),\n",
" ),\n",
"]\n",
"\n",
"layout = go.Layout(\n",
" autosize=True,\n",
" hovermode='closest',\n",
" showlegend=False,\n",
" margin=dict(t=50,b=50,l=20,r=20),\n",
" mapbox=dict(\n",
" accesstoken=mapbox_access_token,\n",
" bearing=0,\n",
" center=dict(\n",
" lat=-33.7,\n",
" lon=151.3\n",
" ),\n",
" pitch=0,\n",
" zoom=12,\n",
" style='satellite-streets'\n",
" ),\n",
")\n",
"\n",
"fig = dict(data=data, layout=layout)\n",
"\n",
"g2 = go.FigureWidget(data=data,\n",
" layout=layout)\n",
"\n",
"def response(change):\n",
" \n",
" site_id = textbox.value\n",
" site_profile = df_profiles.query('site_id == \"{}\"'.format(site_id))\n",
" prestorm_profile = site_profile.query('profile_type == \"prestorm\"')\n",
" poststorm_profile = site_profile.query('profile_type == \"poststorm\"')\n",
"\n",
" poststorm_x = poststorm_profile.index.get_level_values('x').tolist()\n",
" poststorm_z = poststorm_profile.z.tolist()\n",
"\n",
" prestorm_x = prestorm_profile.index.get_level_values('x').tolist()\n",
" prestorm_z = prestorm_profile.z.tolist()\n",
" \n",
" site_features = df_profile_features.query('site_id == \"{}\"'.format(site_id))\n",
" dune_crest_x = site_features.dune_crest_x\n",
" dune_crest_z = site_features.dune_crest_z\n",
" dune_toe_x = site_features.dune_toe_x\n",
" dune_toe_z = site_features.dune_toe_z\n",
" \n",
" with g1.batch_update():\n",
" g1.data[0].x = prestorm_x\n",
" g1.data[0].y = prestorm_z\n",
" g1.data[1].x = poststorm_x\n",
" g1.data[1].y = poststorm_z\n",
" g1.data[2].x = dune_crest_x\n",
" g1.data[2].y = dune_crest_z\n",
" g1.data[3].x = dune_toe_x\n",
" g1.data[3].y = dune_toe_z\n",
" \n",
" # Update \n",
" site_coords = df_sites.query('site_id == \"{}\"'.format(site_id))\n",
" with g2.batch_update():\n",
" g2.layout.mapbox['center'] = {\n",
" 'lat': site_coords['lat'].values[0],\n",
" 'lon': site_coords['lon'].values[0]\n",
" }\n",
" g2.layout.mapbox['zoom'] = 15\n",
" g2.data[1].lat = [site_coords['lat'].values[0]]\n",
" g2.data[1].lon = [site_coords['lon'].values[0]]\n",
" g2.data[1].text = site_coords['lon'].index.get_level_values('site_id').tolist()\n",
" \n",
"textbox.observe(response, names=\"value\")\n",
"widgets.VBox([container,widgets.HBox([g1,g2])])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-11T22:35:30.219167Z",
"start_time": "2018-11-11T22:35:30.045086Z"
}
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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xcdgBBBAAAEEgghQv2kAXcEjQC4+BiOAAAIIIBBEgPpNA+gKHgFy8TEYAQQQQACBIALUbxpAV/AIkIuPwQgggAACCAQRoH7TALqCR4BcfAxGAAEEEEAgiAD1mwbQFTwC5OJjMAIIIIAAAkEEqN80gK7gESAXH4MRQAABBBAIIkD9pgF0BY8AufgYjAACCCCAQBAB6jcNoCt4BMjFx2AEEEAAAQSCCFC/aQBdwSNALj4GI4AAAgggEESA+k0D6AoeAXLxMRgBBBBAAIEgAtRvGkBX8AiQi4/BCCCAAAIIBBGgftMAuoJHgFx8DEYAAQQQQCCIAPWbBtAVPALk4mMwAggggAACQQSo3zSAruARIBcfgxFAAAEEEAgiQP2mAXQFjwC5+BiMAAIIIIBAEAHqNw2gK3gEyMXHYAQQQAABBIIIUL8LrAGcNWuWTZ061YqLi61Lly42Y8YM69evX6Xhmj9/vt1zzz32yiuvRH/fs2dPmzhxoh133HE5h5EA5UzFAxFAAAEEEEiMAPW7gBrABx980C666CJTE9i3b1+bO3euLViwwNavX29t27atELphw4ZFj+vTp481adLEpkyZYg899JCtW7fOWrdunVNICVBOTDwIAQQQQACBRAlQvwuoAezVq5f16NHDZs+eXRayTp062eDBg23SpElZg7d792478MAD7Wc/+5kNHz486+P1AAKUExMPQgABBBBAIFEC1O8CaQB37dplTZs2taVLl9qQIUPKQjZ69GgrKiqyFStWZA3etm3brGXLltFznHnmmVkfTwOYExEPQgABBBBAIHECNIAF0gBu2bIlOm27atWq6JRuvOmavkWLFtnGjRuzhu/qq6+2xx9/PLomUKeEK9t27txp+i/eFKA2bdpYSUmJNWvWLOtr8AAEEEAAAQQQCC9AA1hgDeDq1autd+/eZcmaMGGCLV682DZs2LDXtOn6vzvvvNOWL19uRx99dJWPHTdunI0fP77C39MAhn8zswcIIIAAAgjkKkADWCANoOcU8E9+8hO744477Mknn7Rjjz12r9lhBTDXtxaPQwABBBBAILkCNIAF0gAqYroJRD/loruA461z5842aNCgKm8C0U/GqPnTqd/jjz++2kklQNUmYwACCCCAAALBBajfBdQAxj8DM2fOnOg08Lx580y/9aefdWnXrl10Z6+uE4zvCNZp31tv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11qLFi3siiuuiFwbNKh4B7lycf7559ugQYP2eG9W9li95pQpU+yGG27Y4+V37txpvXr1spdeemmP930u815ZXvXk3/3ud6P3aF1u1W0AFy5cGH1JyMfnhd7D119/va1bt84OO+ww++EPf2hXXnllYuZdc/PjH//Y/vrXv9q+++5r/fv3t4ceeqhs//72t7/Z1VdfbU8//bR99atftQsuuMB+8pOfRJ+35bfqZLsu81CXz52P+l2X+18bz00D6FDMR4DS0gDefvvtdsABB9i7775rP//5z/PygZ5t6tUwb9iwwbp0/aZt+vhzW/nsSpsz4Uc2fdo0u/LKK6LhDz74oF100UWmJrBv3742d+5cW7Bgga1fv97atm0bPUZz2LFjx+jDOd70Ady8efNsu1Bnf799+3bTf5nbt7/9bfvWt75lKqra1qxZEzWy//Ef/xE1fQ8//LDddtttpsZYzUVdblU1AlX9DmCf3S/bz38yLm+5KSkpsR49etg///M/2//8z//stQHU54Tm/6STTrKbb77ZXnvtNdOXL2X+Bz/4wR6Mb7/9dpSjr3/961GjmPnl7P3339/jsY899phddtlltmnTpujxmdvo0aPt9ddfNz0m84tfLvP+8ccf265du8qe7qOPPrJjjjkmyrX2uy63pDaAmzdvjhr9kSNHRs27GqSrrrrKHnjgATv77LMrJcnnvOuLmvZt4sSJdvLJJ5su7deXjnPOOSfat927d0df/g855BD76U9/aprTiy++2P71X//V7rrrrj32vzrZrsss1PVz56N+1/UxeJ+fBtAhmI8AqXnQB4+2e++91xo1amSjRo2KinK8IqD/q+I8ePDgsqNRM6WVKH1gl1850KqFnrf8CtAf//jH6M/1waECogZAK0L6gJs2bZrtt99+0fPHK4cnnHBC9GGiYjF06NDo9fbZZx+HqEXNR02+0esD7zvf+Y595StfiYqejlmrAkcffXTUoGnlqjY2fWDq2/XixYujp1MjpEZg9uzZZU/fqVOnaC4mTZoU/Zm3ideKXKtWrewXv/hF2Qe6nvfRRx+N3NUY7L///q7D00qRCsQzzzxTtnqpVUplXJ7xNnDgQDvwwAOjwpfLds8990SFUk3IN77xjWjItddea48//nj0Z7L84IMPokbmySeftEMPPdTuuOOOqFHKPAWs/N1999325ptvRo3R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oAEkAwgggAACCCCAQIoFWAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQTgEawHTOO0eNAAIIIIAAAikWoAFM8eRz6AgggAACCCCQToH/Bx6enUDmJXWtAAAAAElFTkSuQmCC\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"9"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"# Test of using matplotlib for manual point clicking\n",
"%matplotlib notebook\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(111)\n",
"ax.plot(np.random.rand(10), 'o',picker=5)\n",
"text1=ax.text(0,0, \"\", va=\"bottom\", ha=\"left\")\n",
"text2=ax.text(0.5,0.5, \"hello\", va=\"bottom\", ha=\"left\")\n",
"temp = []\n",
"n=1\n",
"\n",
"def onclick(event):\n",
" tx = 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f' % (event.button, event.x, event.y, event.xdata, event.ydata)\n",
" text1.set_text(tx)\n",
" temp.append(tx)\n",
" \n",
"def press(event):\n",
" if event.key == 'x':\n",
" text2.set_text('test')\n",
"\n",
"points = []\n",
"n = 5\n",
"\n",
"def onpick(event):\n",
" if len(points) < n:\n",
" thisline = event.artist\n",
" xdata = thisline.get_xdata()\n",
" ydata = thisline.get_ydata()\n",
" ind = event.ind\n",
" point = tuple(zip(xdata[ind], ydata[ind]))\n",
" points.append(point)\n",
" print('onpick point:', point)\n",
" else:\n",
" print('already have {} points'.format(len(points)))\n",
" return True\n",
"\n",
"fig.canvas.mpl_connect('pick_event', onpick)\n",
"\n",
"fig.canvas.mpl_connect('key_press_event',press)\n",
"fig.canvas.mpl_connect('button_press_event',onclick)\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-11T22:35:57.104492Z",
"start_time": "2018-11-11T22:35:57.098475Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[((3.0, 0.3693345274194554),),\n",
" ((6.0, 0.5016711151639491),),\n",
" ((1.0, 0.10238977657533999),),\n",
" ((2.0, 0.04706622152810236),),\n",
" ((4.0, 0.04404424214020075),)]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"points"
]
}
],
"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.6.4"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}