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.
1262 lines
93 KiB
Plaintext
1262 lines
93 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": 144,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-11-09T01:48:38.686778Z",
|
|
"start_time": "2018-11-09T01:48:31.350515Z"
|
|
}
|
|
},
|
|
"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": 145,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-11-09T01:48:38.721265Z",
|
|
"start_time": "2018-11-09T01:48:38.687781Z"
|
|
},
|
|
"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": 146,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-11-09T01:48:55.758881Z",
|
|
"start_time": "2018-11-09T01:48:38.723271Z"
|
|
},
|
|
"pixiedust": {
|
|
"displayParams": {}
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"C:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\numpy\\lib\\arraysetops.py:518: 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"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 147,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-11-09T01:48:56.438469Z",
|
|
"start_time": "2018-11-09T01:48:55.759856Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "89b213f09e874adaa67419df3a32499a",
|
|
"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': '5f83eb47-e017-4192-a508-54a2f91a379c',\n",
|
|
" 'x': [0],\n",
|
|
" 'y': [0]},\n",
|
|
" {'name': 'Post Storm Profile',\n",
|
|
" 'type': 'scatter',\n",
|
|
" 'uid': '91e7e1e3-4be0-42c5-96f1-6536602059fd',\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': '77f3ed9c-0deb-4ba3-8e85-cffb6b3eaf5c'},\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': '510eb04a-f70a-4364-a348-73c07cb3b8b2'}],\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",
|
|
"\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],\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",
|
|
" \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",
|
|
"\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": 148,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-11-09T01:48:59.291083Z",
|
|
"start_time": "2018-11-09T01:48:56.439445Z"
|
|
}
|
|
},
|
|
"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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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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O0D92wC4d8n5TZUApfgUEyBAgACBDoGNT/8izlr+gy5FVl9ycow/+uAut3unDfTvJhsAFy9eHAsWLIitW7fGqFGjYtGiRTFp0qS3zUDx8yVLlsR//ud/xiGHHBJ/+qd/GnPnzo3+/fvXFSwBqovJRgQIECBAoEuB+1teihlrWrrc7tYzx8TUMYO73M4A+M5Efdra2na91J5CLav47rvvjnPPPTeKIXDixImxbNmyWLFiRWzevDmGDh3aabfuvPPOuPjii+MrX/lKTJgwIZ588sm44IIL4owzzoiFCxfWdRgGwLqYbESAAAECBLoUcAawS6Ju3aBpBsBx48bF2LFja2f02h8jRoyIadOm1c7q7fr4i7/4i/jpT38a//zP/9zxo7/8y7+MRx99NB5++OG6kA2AdTHZiAABAgQIdCnQ/hnAl1u3d7oJpCj2GcAuCfdog6YYAF9//fXYf//9Y+3atTF9+vQOgBkzZkRLS0usW7euE8qaNWvisssui+9+97tx0kknxTPPPBN//Md/HOeff35ce+21u0XcsWNHFP+0P4oBcMiQIdHa2hoDBgzYI3gbEyBAgAABAm8VaL8LuPi/O1+edBdw9yelKQbALVu2xODBg2P9+vW1y7ntjzlz5sSqVaviiSee2K3cl770pSjO+hVXwX/961/H5ZdfXruE/HaPmTNnxqxZszr92ADY/cH0jAQIECBQTQHfA9g7695UA+CGDRti/PjxHXKzZ8+O22+/PR5//PFOmg899FCceeaZ8YUvfCGKy8dPPfVUFGcML7nkkrjxxhudAeyd/HkVAgQIECDQScBvAun5UDTFALg3l4CLu4NPPvnk2l3D7Y877rgjLr300njttdeib9++Xer7DGCXRDYgQIAAAQINJ6B/N9HXwBRn8U444YS3XMIdOXJkTJ06dbc3gRTbfvjDH4558+Z1BHP16tVx0UUX1QbAfv36dRlYAeqSyAYECBAgQKDhBPTvJhoA278GZunSpbXLwLfddlssX748Nm3aFMOGDYvzzjuv9jnB9juCi8/z3XLLLbXt2i8BF58BLAbD4rnqeQhQPUq2IUCAAAECjSWgfzfRAFhEq7iBY/78+bUvgh49enTt+/wmT55cS92UKVNi+PDhsXLlytp/Fzd9tH9G8KWXXor3vve98bGPfaz2/w488MC6kipAdTHZiAABAgQINJSA/t1kA2Bvp0uAelvc6xEgQIAAgbyA/m0ATKVIgFJ8igkQIECAQCkC+rcBMBU8AUrxKSZAgAABAqUI6N8GwFTwBCjFp5gAAQIECJQioH8bAFPBE6AUn2ICBAgQIFCKgP5tAEwFT4BSfIoJECBAgEApAvq3ATAVPAFK8SkmsFcCPf0rovZqpxQRILBPCejfBsBUYAUoxaeYwB4L9MYvid/jnVJAgMA+J6B/GwBToRWgFJ9iAnskUAx/l9/xw2jbparPb/57ySfHxmmjD9+j57QxAQLVFNC/DYCp5AtQik8xgboFisu+p8z7Xmxt3b7bmmIIPGxg/3jkmlOjX9/2kbDup7chAQIVE9C/DYCpyAtQik8xgboFNj79izhr+Q+63H71JSfH+KMP7nI7GxAgUG0B/dsAmHoHCFCKTzGBugXub3kpZqxp6XL7W88cE1PHDO5yOxsQIFBtAf3bAJh6BwhQik8xgboFnAGsm8qGBAjUIaB/GwDriMnbbyJAKT7FBOoWaP8M4Mut2zvdBFI8ic8A1k1pQwIEIkL/NgCm3ggClOJTTGCPBNrvAi6Kdr4T2F3Ae8RoYwIEDIC1DPRpa2vb9VsVhKNOAQNgnVA2I9BNAr4HsJsgPQ2Bigvo3wbA1FtAgFJ8ignslYDfBLJXbIoIENhJQP82AKbeEAKU4lNMgAABAgRKEdC/DYCp4AlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQvw2AqeAJUIpPMQECBAgQKEVA/zYApoInQCk+xQQIECBAoBQB/dsAmAqeAKX4FBMgQIAAgVIE9G8DYCp4ApTiU0yAAAECBEoR0L8NgKngCVCKTzEBAgQIEChFQP82AKaCJ0ApPsUECBAgQKAUAf3bAJgKngCl+BQTIECAAIFSBPRvA2AqeAKU4lNMgAABAgRKEdC/DYCp4AlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQvw2AqeAJUIpPMQECBAgQKEVA/zYApoInQCk+xQQIECBAoBQB/dsAmAqeAKX4FBMgQIAAgVIE9G8DYCp4ApTiU0yAAAECBEoR0L8NgKngCVCKTzEBAgQIEChFQP82AKaCJ0ApPsUECBAgQKAUAf3bAJgKngCl+BQTIECAAIFSBPRvA2AqeAKU4lNMgAABAgRKEdC/DYCp4AlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQvw2AqeAJUIpPMQECBAgQKEVA/zYApoInQCk+xQQIECBAoBQB/dsAmAqeAKX4FBMgQIAAgVIE9G8DYCp4ApTiU0yAAAECBEoR0L8NgKngCVCKTzEBAgQIEChFQP82AKaCJ0ApPsUECBAgQKAUAf3bAJgKngCl+BQTIECAAIFSBPRvA2AqeAKU4lNMgAABAgRKEdC/DYCp4AlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQv5tsAFy8eHEsWLAgtm7dGqNGjYpFixbFpEmT3jZcr776alx//fVxzz33xC9/+cs46qij4m//9m/jj/7oj+oKpADVxWQjAgQIECDQUAL6dxMNgHfffXece+65UQyBEydOjGXLlsWKFSti8+bNMXTo0E7Be/3112vbHXrooXHdddfFkUceGS+88EIccMABcdxxx9UVVAGqi8lGBAgQIECgoQT07yYaAMeNGxdjx46NJUuWdIRsxIgRMW3atJg7d26n4C1durR2tvDxxx+Pd73rXXsVTAHaKzZFBAgQIECgVAH9u0kGwOJs3v777x9r166N6dOnd4RqxowZ0dLSEuvWresUtOIy76BBg2p1999/f7z3ve+Ns88+O6655pro16/fboO5Y8eOKP5pfxQBGjJkSLS2tsaAAQNKDbMXJ0CAAAECBOoTMAA2yQC4ZcuWGDx4cKxfvz4mTJjQsfpz5syJVatWxRNPPNEpEe9///vjueeei3POOSeuuOKK+NnPfhZXXnllFEPjTTfdtNsEzZw5M2bNmtXpZwbA+t5wtiJAgAABAo0gYABssgFww4YNMX78+I5szZ49O26//fbaZd5dH8ccc0xs3749nn322Y4zfrfcckvHTSS7C6gzgI3wtrUPBAgQIEAgJ2AAbJIBcG8uAX/wgx+sffbvwQcf7EjRAw88ULsDuBj09ttvvy7TJUBdEtmAAAECBAg0nID+3SQDYJGs4iaQE044oXYXcPtj5MiRMXXq1N3eBFLc+XvXXXfFM888E3379q2V3HrrrTFv3rwoLinX8xCgepRsQ4AAAQIEGktA/26iAbD9a2CKu3uLy8C33XZbLF++PDZt2hTDhg2L8847r/Y5wfY7gouvfCkGxAsuuCA+9alP1T4DeNFFF8WnP/3p2ncD1vMQoHqUbEOAAAECBBpLQP9uogGwiFZx9m/+/Pm1L4IePXp0LFy4MCZPnlxL3ZQpU2L48OGxcuXKjhRu3LgxrrrqqtqdwsVwePHFF7/jXcC7xleAGusNbW8IECBAgEA9Avp3kw2A9Sx6d24jQN2p6bkIECBAgEDvCOjfBsBU0gQoxaeYAAECBAiUIqB/GwBTwROgFJ9iAgQIECBQioD+bQBMBU+AUnyKCRAgQIBAKQL6twEwFTwBSvEpJkCAAAECpQjo3wbAVPAEKMWnmAABAgQIlCKgfxsAU8EToBSfYgIECBAgUIqA/m0ATAVPgFJ8igkQIECAQCkC+rcBMBU8AUrxKSZAgAABAqUI6N8GwFTwBCjFp5gAAQIECJQioH8bAFPBE6AUn2ICBAgQIFCKgP5tAEwFT4BSfIoJECBAgEApAvq3ATAVPAFK8SkmQIAAAQKlCOjfBsBU8AQoxaeYAAECBAiUIqB/GwBTwWuWAE2ZMiXGjBkTixYt2iuPmTNnxn333RctLS21+gsuuCBeffXV2v/zIECAAAECjSbQLP0749qnra2tLfMEVa5tlgAZAKucYsdOgACB6gk0S//OrJwBMKHXLAEyACZCoJQAAQIE9jmBZunfGXgDYEKvWQJUDIDHHnts9O/fP1asWBH77bdfXHbZZVFc2i0era2t8dnPfrZ2SXf79u1x4oknxsKFC+O4446r/byrS8A7duyo1a9ZsyYKs/b6D3zgAwl9pQQIECBAYO8EmqV/793R//9VBsCEXrMEqBgAf/SjH8XVV18dZ599dmzcuLH2Ob7vfOc78eEPfzgmTZoUgwYNiptuuikGDhwYy5Yti5UrV8aTTz5Z+/9dDYAzZsyIr3/967XhctiwYTF//vz45je/GU899VSt3oMAAQIECPSmQLP074yZATCh1ywBKgbAN954Ix5++OEOjZNOOilOPfXU+MhHPhLTp0+PV155Jd797nd3/Pz3fu/34nOf+1xceuml7zgA/s///E8cdNBBtYGxGC6Lx//93//F8OHD4zOf+UztzKAHAQIECBDoTYFm6d8ZMwNgQq9ZAlQMgKNGjYq///u/79CYOnVqHHzwwTFixIi49tpr4z3vec9bpH71q1/FX/3VX8W8efPecQD88Y9/XLtU/Nxzz9XO/rU/iqGyGAy/8pWvJFZAKQECBAgQ2HOBZunfe37k/6/CAJjQa5YA7e4mkGnTpsWBBx5YGwC/9KUvxUMPPdRJqvj5IYcc8o4D4GOPPVb7ipnnn38+hg4d2vEcxfMXA+aXv/zlxAooJUCAAAECey7QLP17z4/cAJgx66htlgC90wB4zjnnxOmnn177vF5x2XZ3j3f6DGBxCbj4nN9Xv/rVt1wCPuqoo2qXgIuziB4ECBAgQKA3BZqlf2fMnAFM6DVLgN5pACwGt8mTJ8e2bdtql3vf9773xZYtW+Lb3/52FGfxijt6u7oJpBj01q5dWzvbV5wFbL8J5Omnn65dBvYgQIAAAQK9KdAs/TtjZgBM6DVLgN5pACxu3iiGv+uvvz6+8Y1vxM9//vM47LDDakPh3LlzY8iQIV0OgMVXxxQ3jKxevbr2XL4GJhE6pQQIECCQFmiW/p2BMAAm9AQogaeUAAECBAiUJKB/+x7AVPQEKMWnmAABAgQIlCKgfxsAU8EToBSfYgIECBAgUIqA/m0ATAVPgFJ8igkQIECAQCkC+rcBMBU8AUrxKSZAgAABAqUI6N8GwFTwBCjFp5gAAQIECJQioH8bAFPBE6AUn2ICBAgQIFCKgP5tAEwFT4BSfIoJECBAgEApAvq3ATAVPAFK8SkmQIAAAQKlCOjfBsBU8AQoxaeYAAECBAiUIqB/GwBTwROgFJ9iAgQIECBQioD+bQBMBU+AUnyKCRAgQIBAKQL6twEwFTwBSvEpJkCAAAECpQjo3wbAVPAEKMWnmAABAgQIlCKgfxsAU8EToBSfYgIECBAgUIqA/m0ATAVPgFJ8igkQIECAQCkC+rcBMBU8AUrxKSZAgAABAqUI6N8GwFTwBCjFp5gAAQIECJQioH8bAFPBE6AUn2ICBAgQIFCKgP5tAEwFT4BSfIoJECBAgEApAvq3ATAVPAFK8SkmQIAAAQKlCOjfBsBU8AQoxaeYAAECBAiUIqB/GwBTwROgFJ9iAgQIECBQioD+bQBMBU+AUnyKCRAgQIBAKQL6twEwFTwBSvEpJkCAAAECpQjo3wbAVPAEKMWnmAABAgQIlCKgfxsAU8EToBSfYgIECBAgUIqA/m0ATAVPgFJ8igkQIECAQCkC+rcBMBU8AUrxKSZAgAABAqUI6N8GwFTwBCjFp5gAAQIECJQioH8bAFPBE6AUn2ICBAgQIFCKgP5tAEwFT4BSfIoJECBAgEApAvq3ATAVPAFK8VnIpHgAABveSURBVCkmQIAAAQKlCOjfTTYALl68OBYsWBBbt26NUaNGxaJFi2LSpEldhmvNmjVx1llnxdSpU+O+++7rcvv2DQSobiobEiBAgACBhhHQv5toALz77rvj3HPPjWIInDhxYixbtixWrFgRmzdvjqFDh75t6J5//vna9r/7u78bgwYNMgA2zNvTjhAgQIAAgZ4RMAA20QA4bty4GDt2bCxZsqQjLSNGjIhp06bF3Llzd5ugN954Iz74wQ/GhRdeGA8//HC8+uqrBsCeea95VgIECBAg0DACBsAmGQBff/312H///WPt2rUxffr0joDNmDEjWlpaYt26dbsN3c033xw//vGP4957740LLrigywFwx44dUfyz8yXgIUOGRGtrawwYMKBhgm1HCBAgQIAAgbcXMAA2yQC4ZcuWGDx4cKxfvz4mTJjQseJz5syJVatWxRNPPNEpBcW2Z5xxRm1APOSQQ+oaAGfOnBmzZs3q9FwGQH/MECBAgACBfUfAANhkA+CGDRti/PjxHQmcPXt23H777fH444+/JZXbtm2LY489tvZ5wdNPP732M2cA9503rj0lQIAAAQIZAQNgkwyAe3oJuDjrd/zxx0e/fv068vPmm2/W/r1v3761M4ZHH310l9kSoC6JbECAAAECBBpOQP9ukgGwSFZxE8gJJ5xQO6vX/hg5cmTtq112vQlk+/bt8dRTT70lkDfccEMUZwZvvfXWOOaYY2K//fbrMrAC1CWRDQgQIECAQMMJ6N9NNAC2fw3M0qVLa5eBb7vttli+fHls2rQphg0bFuedd17tc4Jvd0dwPZeAd02wADXce9oOESBAgACBLgX07yYaAIvVLs7+zZ8/v/ZF0KNHj46FCxfG5MmTa0GYMmVKDB8+PFauXLnbYBgAu3y/2IAAAQIECDSFgAGwyQbA3k6lAPW2uNcjQIAAAQJ5Af3bAJhKkQCl+BQTIECAAIFSBPRvA2AqeAKU4lNMgAABAgRKEdC/DYCp4AlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQvw2AqeAJUIpPMQECBAgQKEVA/zYApoInQCk+xQQIECBAoBQB/dsAmAqeAKX4FBMgQIAAgVIE9G8DYCp4ApTiU0yAAAECBEoR0L8NgKngCVCKTzEBAgQIEChFQP82AKaCJ0ApPsUECBAgQKAUAf3bAJgKngCl+BQTIECAAIFSBPRvA2AqeAKU4lNMgAABAgRKEdC/DYCp4AlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQvw2AqeAJUIpPMQECBAgQKEVA/zYApoInQCk+xQQIECBAoBQB/dsAmAqeAKX4FBMgQIAAgVIE9G8DYCp4ApTiU0yAAAECBEoR0L8NgKngCVCKTzEBAgQIEChFQP82AKaCJ0ApPsUECBAgQKAUAf3bAJgKngCl+BQTIECAAIFSBPRvA2AqeAKU4lNMgAABAgRKEdC/DYCp4AlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQvw2AqeAJUIpPMQECBAgQKEVA/zYApoInQCk+xQQIECBAoBQB/dsAmAqeAKX4FBMgQIAAgVIE9G8DYCp4ApTiU0yAAAECBEoR0L8NgKngCVCKTzEBAgQIEChFQP82AKaCJ0ApPsUECBAgQKAUAf3bAJgKngCl+BQTIECAAIFSBPRvA2AqeAKU4lNMgAABAgRKEdC/DYCp4AlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQvw2AqeAJUIpPMQECBAgQKEVA/zYApoInQCk+xQQIECBAoBQB/dsAmAqeAKX4FBMgQIAAgVIE9G8DYCp4ApTiU0yAAAECBEoR0L8NgKngCVCKTzEBAgQIEChFQP82AKaCJ0ApPsUECBAgQKAUAf3bAJgKngCl+BQTIECAAIFSBPRvA2AqeAKU4lNMgAABAgRKEdC/DYCp4AlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQvw2AqeAJUIpPMQECBAgQKEVA/zYApoInQCk+xQQIECBAoBQB/dsAmAqeAKX4FBMgQIAAgVIE9O8mGwAXL14cCxYsiK1bt8aoUaNi0aJFMWnSpN2Ga/ny5fG1r30tfvKTn9R+fsIJJ8ScOXPipJNOqjuMAlQ3lQ0JECBAgEDDCOjfTTQA3n333XHuuedGMQROnDgxli1bFitWrIjNmzfH0KFDO4XunHPOqW03YcKE6N+/f8yfPz/uueee2LRpUwwePLiukApQXUw2IkCAAAECDSWgfzfRADhu3LgYO3ZsLFmypCNkI0aMiGnTpsXcuXO7DN4bb7wRBx10UPzd3/1dnHfeeV1uX2wgQHUx2YgAAQIECDSUgP7dJAPg66+/Hvvvv3+sXbs2pk+f3hGyGTNmREtLS6xbt67L4G3bti0OPfTQ2nN89KMf7XJ7A2BdRDYiQIAAAQINJ2AAbJIBcMuWLbXLtuvXr69d0m1/FJ/pW7VqVTzxxBNdhu/KK6+M73znO7XPBBaXhHf32LFjRxT/tD+KAA0ZMiRaW1tjwIABXb6GDQgQIECAAIHyBQyATTYAbtiwIcaPH9+RrNmzZ8ftt98ejz/++Dumrfj83xe/+MV46KGH4thjj33bbWfOnBmzZs3q9HMDYPlvZntAgAABAgTqFTAANskAmLkE/Dd/8zfxhS98IR588ME48cQT3zE7zgDW+9ayHQECBAgQaFwBA2CTDIBFxIqbQIqvcinuAm5/jBw5MqZOnfq2N4EUXxlTDH/Fpd+TTz55j5MqQHtMpoAAAQIECJQuoH830QDY/jUwS5curV0Gvu2226L4rr/ia12GDRtWu7O3+Jxg+x3BxWXfG2+8Me66667a18G0P377t387in/qeQhQPUq2IUCAAAECjSWgfzfRAFhEqzj7Vwx2xRdBjx49OhYuXBiTJ0+upW7KlCkxfPjwWLlyZe2/i39//vnnOyXy5ptvjuKzfvU8BKgeJdsQIECAAIHGEtC/m2wA7O14CVBvi3s9AgQIECCQF9C/DYCpFAlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQvw2AqeAJUIpPMQECBAgQKEVA/zYApoInQCk+xQQIECBAoBQB/dsAmAqeAKX4FBMgQIAAgVIE9G8DYCp4ApTiU0yAAAECBEoR0L8NgKngCVCKTzEBAgQIEChFQP82AKaCJ0ApPsUECBAgQKAUAf3bAJgKngCl+BQTIECAAIFSBPRvA2AqeAKU4lNMgAABAgRKEdC/DYCp4AlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQvw2AqeAJUIpPMQECBAgQKEVA/zYApoInQO/M98abbfHos/8Vr2zbHoce0D9OOmpQ9OvbJ2WumAABAgQIZAX0bwNgKkMC9PZ8//STrTHrW5tja+v2jo0OH9g/bv7YyDht9OEpd8UECBAgQCAjoH8bADP5CQHaPV8x/F1+xw+jbZcft5/7W/LJsYbAVPIUEyBAgEBGQP82AGbyYwDcjV5x2feUed97y5m/nTcrhsDDBvaPR6451eXgVPoUEyBAgMDeChgADYB7m51anQB15tv49C/irOU/6NJ19SUnx/ijD+5yOxsQIECAAIHuFtC/DYCpTAlQZ777W16KGWtaunS99cwxMXXM4C63swEBAgQIEOhuAf3bAJjKlAA5A5gKkGICBAgQKEVA/zYApoInQJ352j8D+HLr9k43gRRb+wxgKnKKCRAgQKAbBPRvA2AqRgK0e772u4CLn+58J7C7gFNxU0yAAAEC3SSgfxsAU1ESoLfn8z2AqWgpJkCAAIEeFNC/DYCpeAnQO/P5TSCpeCkmQIAAgR4S0L8NgKloCVCKTzEBAgQIEChFQP82AKaCJ0ApPsUECBAgQKAUAf3bAJgKngCl+BQTIECAAIFSBPRvA2AqeAKU4lNMgAABAgRKEdC/DYCp4AlQik8xAQIECBAoRUD/NgCmgidAKT7FBAgQIECgFAH92wCYCp4ApfgUEyBAgACBUgT0bwNgKngClOJTTIAAAQIEShHQvw2AqeAJUIpPMQECBBpGwBfXN8xS9MqO6N8GwFTQBCjFp5gAAQINIeBXVzbEMvTqTujfBsBU4AQoxaeYAAECpQsUw9/ld/ww2nbZkz6/+e8lnxwbp40+vPT9tAPdK6B/GwBTiRKgFJ9iAgQIlCpQXPY9Zd73Ymvr9t3uRzEEHjawfzxyzanRr2/7SFjqLnvxbhLQvw2AqSgJUIpPMQECBEoV2Pj0L+Ks5T/och9WX3JyjD/64C63s8G+I6B/GwBTaRWgFJ9iAgQIlCpwf8tLMWNNS5f7cOuZY2LqmMFdbmeDfUdA/zYAptIqQCk+xQQIEChVwBnAUvlLfXH92wCYCqAApfgUEyBAoFSB9s8Avty6vdNNIMWO+QxgqcvToy+ufxsAUwEToBSfYgIECJQu0H4XcLEjO98J7C7g0pemR3dA/zYApgImQCk+xQQIEGgIAd8D2BDL0Ks7oX8bAFOBE6AUn2ICBAg0jIDfBNIwS9ErO6J/GwBTQROgFJ9iAgQIECBQioD+bQBMBU+AUnyKCRAgQIBAKQL6twEwFTwBSvEpJkCAAAECpQjo3wbAVPAEKMWnmAABAgQIlCKgfxsAU8EToBSfYgIECBAgUIqA/m0ATAVPgFJ8igkQIECAQCkC+rcBMBU8AUrxKSZAgAABAqUI6N8GwFTwBCjFp5gAAQIECJQioH8bAFPBE6AUn2ICBAgQ6GYBX2hdH6j+bQCsLylvs5UApfgUEyBAgEA3CviVdvVj6t9NNgAuXrw4FixYEFu3bo1Ro0bFokWLYtKkSW+biG984xtx4403xtNPPx1HH310zJ49O6ZPn153ggSobiobEiBAgEAPChTD3+V3/DDadnmNPr/57yWfHBunjT68B/dg33pq/buJBsC77747zj333CiGwIkTJ8ayZctixYoVsXnz5hg6dGinZG7cuLE2HP71X/91bei7995746abbopHHnkkxo0bV1eSBaguJhsRIECAQA8KFJd9T5n3vdjaun23r1IMgYcN7B+PXHNq9OvbPhL24A7tA0+tfzfRAFgMbWPHjo0lS5Z0RG/EiBExbdq0mDt3bqc4nnHGGVEE4IEHHuj42WmnnRYHHXRQrF69uq74ClBdTDYiQIAAgR4U2Pj0L+Ks5T/o8hVWX3JyjD/64C63q8IG+neTDICvv/567L///rF27dq3XMKdMWNGtLS0xLp16zrluTgreNVVV9X+aX8sXLiwdtn4+eefryv/AlQXk40IECBAoAcF7m95KWasaenyFW49c0xMHTO4y+2qsIH+3SQD4JYtW2Lw4MGxfv36mDBhQkd258yZE6tWrYonnniiU57322+/WLlyZZx99tkdP7vrrrviwgsvjB07duw2/8X/3/lnRYCGDBkSra2tMWDAgCq8ZxwjAQIECDSYgDOAe74gBsAmGwA3bNgQ48eP70hCcVPH7bffHo8//vhuB8BiODzrrLM6fnbnnXfGxRdfHNu37/5zFDNnzoxZs2Z1ei4D4J6/+VQQIECAQPcItH8G8OXW7Z1uAilewWcAOzsbAJtkAOytS8DOAHbPH1aehQABAgS6V6D9LuDiWXe+E9hdwLt3NgA2yQBYLG9xE8gJJ5xQuwu4/TFy5MiYOnXq294Esm3btvj2t7/dsf3pp58eBx54oJtAuvfPJc9GgAABAr0g4HsA60c2ADbRANj+NTBLly6tXQa+7bbbYvny5bFp06YYNmxYnHfeebXPCbbfEVxcLp48eXLtu/+KIfH++++PG264wdfA1P/+sSUBAgQINJiA3wRS34IYAJtoACyWvDj7N3/+/NoXQY8ePTqKu3qLIa94TJkyJYYPH1678aP98fWvf7029D3zzDMdXwT9J3/yJ/WlJ6L2NTIDBw50E0jdYjYkQIAAAQLlC+jfTTYA9nakBKi3xb0eAQIECBDIC+jfBsBUigQoxaeYAAECBAiUIqB/GwBTwROgFJ9iAgQIECBQioD+bQBMBU+AUnyKCRAgQIBAKQL6twEwFTwBSvEpJkCAAAECpQjo3wbAVPAEKMWnmAABAgQIlCKgfxsAU8EToBSfYgIECBAgUIqA/m0ATAVPgFJ8igkQIECAQCkC+rcBMBU8AUrxKSZAgAABAqUI6N8GwFTwWltba787+IUXXogBAwaknksxAQIECBAg0DsCxQA4ZMiQePXVV2u/0auKjz5tbW1tVTzw7jjmF198sRYgDwIECBAgQGDfEyhO4Bx55JH73o53wx4bABOIb775ZmzZsiUOOOCA6NOnT+KZOpe2/+3E2cVuZd3rJ7Mee03XI4XWo0dY9/pJrcde0/VIofXomrU497Vt27Y44ogjom/fvl0XNOEWBsAGXVSfT2ishbEe1qOxBBprb7w/rEdjCdibegQMgPUolbCNP1BLQH+Hl7Qe1qOxBBprb7w/rEdjCdibegQMgPUolbCNP1BLQDcANha69bAe+4xAY+2o/tFY69Goe2MAbNCV2bFjR8ydOzc+//nPx7vf/e4G3cvq7Jb1aKy1th7Wo7EEGmtvvD8aaz0adW8MgI26MvaLAAECBAgQINBDAgbAHoL1tAQIECBAgACBRhUwADbqytgvAgQIECBAgEAPCRgAewjW0xIgQIAAAQIEGlXAANioK2O/CBAgQIAAAQI9JGAA7CHYzNMuXrw4FixYEFu3bo1Ro0bFokWLYtKkSZmnVLsXAsVd2Pfcc088/vjj8Z73vCcmTJgQ8+bNi/e973178WxKulugWJ/rrrsuZsyYUXuPeJQj8NJLL8U111wTDzzwQPzqV7+KY445Jr785S/HCSecUM4OVfhVf/3rX8fMmTPjzjvvjJdffjkOP/zwuOCCC+KGG26o7G+7qHAcujx0A2CXRL27wd133x3nnntuFEPgxIkTY9myZbFixYrYvHlzDB06tHd3puKvdtppp8WZZ54ZH/jAB6L4g/X666+P//iP/6itxW/91m9VXKfcw//Xf/3X+MQnPhEDBgyID33oQwbAkpbjl7/8ZRx//PG1Nbj88svj0EMPjaeffjqGDx8eRx99dEl7Vd2XnT17dixcuDBWrVpVO3nwb//2b3HhhRfGF77whdpflDwI7CxgAGywPIwbNy7Gjh0bS5Ys6dizESNGxLRp02rfC+hRnsDPf/7zWoNbt25dTJ48ubwdqfgrv/baa7X3SPGXpKKxjRkzxgBYUiauvfbaWL9+fTz88MMl7YGX3Vngox/9aPzO7/xO7Qxs++PjH/947L///nH77bfDIvAWAQNgAwXi9ddfr71R165dG9OnT+/Ys+Jvbi0tLbXBw6M8gaeeeip+//d/v3YWcPTo0eXtSMVf+fzzz49BgwbVznRMmTLFAFhiHkaOHBl/+Id/GC+++GLtz6fBgwfHFVdcEZdcckmJe1Xdl/7iF78YS5cuje9+97u1S/GPPfZYfOQjH6n9Bemss86qLowj362AAbCBgrFly5baH6DF36iLz5u1P+bMmVM7pf/EE0800N5Wa1fa2tpi6tSpUVzycrajvLVfs2ZN7axfcWmrf//+BsDylqL2ysUaFI+rr746/uzP/iweffTR+MxnPlP76Mp5551X8t5V7+WLP6eKz8UWn1Xu169fvPHGG1FcFi5+o5QHgV0FDIANlIn2AXDDhg0xfvz4jj0r3sDF6fviZgSPcgSuvPLK+Md//Md45JFH4sgjjyxnJyr+qi+88EKceOKJtbMbxx13XE3DGcByQ7HffvvV1qT4M6v98elPfzqKz2hu3Lix3J2r4KsXf0H67Gc/W7uJsPgMYHHlqBjIb7nllijOnHsQ2FnAANhAeXAJuIEWY6dd+dSnPhX33XdffP/734+jjjqqMXeyAntVrEHx0YjizEb7ozjD0adPn9odjsXvP935ZxUgKf0Qhw0bFn/wB39Qu1Gt/VF8frk4S1vcHezRuwJDhgyJ4nOZxV9Y2x/FWtxxxx1OIPTuUuwTr2YAbLBlKm4CKb4+ofiAe/uj+JxNcfnRTSC9u1jF5ZRi+Lv33nvjoYceqn3+z6M8gW3btsXzzz//lh0o7nB8//vfX/saEp/L7P21Ofvss6M4M7vzxyKuuuqq+Jd/+Ze3nBXs/T2r5isefPDBteG7uCO7/VH0ja9+9avx5JNPVhPFUb+tgAGwwcLR/jUwxQd5i8vAt912Wyxfvjw2bdoUxd+2PXpPoPgw+1133RX333//W777b+DAgbXvBfQoX8Al4HLXoLjUW3xeedasWbWv5Sk+A1jcAFL8uXXOOeeUu3MVfPXiO/8efPDB2mcwi0vAP/rRj+LSSy+Niy66qPa5QA8COwsYABswD8XZv/nz59e+CLo4q1Hc7ehrR3p/oYpLi7t7FH+bLv6g9ShfwABY/hr8wz/8Q+0mg5/97Ge1j0gUN4S4C7icdSnOkt944421qxavvPJKHHHEEbW7f2+66aYoPq/pQcAAKAMECBAgQIAAgQoLOANY4cV36AQIECBAgEA1BQyA1Vx3R02AAAECBAhUWMAAWOHFd+gECBAgQIBANQUMgNVcd0dNgAABAgQIVFjAAFjhxXfoBAgQIECAQDUFDIDVXHdHTYAAAQIECFRYwABY4cV36AQIECBAgEA1BQyA1Vx3R02AAAECBAhUWMAAWOHFd+gECBAgQIBANQUMgNVcd0dNgAABAgQIVFjAAFjhxXfoBAgQIECAQDUFDIDVXHdHTYAAAQIECFRYwABY4cV36AQIECBAgEA1BQyA1Vx3R02AAAECBAhUWMAAWOHFd+gECBAgQIBANQUMgNVcd0dNgAABAgQIVFjAAFjhxXfoBAgQIECAQDUFDIDVXHdHTYAAAQIECFRYwABY4cV36AQIECBAgEA1BQyA1Vx3R02AAAECBAhUWMAAWOHFd+gECBAgQIBANQUMgNVcd0dNgAABAgQIVFjAAFjhxXfoBAgQIECAQDUFDIDVXHdHTYAAAQIECFRYwABY4cV36AQIECBAgEA1BQyA1Vx3R02AAAECBAhUWMAAWOHFd+gECBAgQIBANQUMgNVcd0dNgAABAgQIVFjAAFjhxXfoBAgQIECAQDUFDIDVXHdHTYAAAQIECFRYwABY4cV36AQIECBAgEA1Bf4/MyDXfURWV6gAAAAASUVORK5CYII=\" width=\"640\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"9"
|
|
]
|
|
},
|
|
"execution_count": 148,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"%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": 149,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2018-11-09T01:48:59.300107Z",
|
|
"start_time": "2018-11-09T01:48:59.292086Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[]"
|
|
]
|
|
},
|
|
"execution_count": 149,
|
|
"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
|
|
}
|