{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "e4bed248-56f0-4852-b98e-ff612d222ffb",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import holoviews as hv\n",
"import panel as pn\n",
"\n",
"from colorcet import bmy\n",
"\n",
"pn.extension('tabulator', template='fast')\n",
"import hvplot.pandas"
]
},
{
"cell_type": "markdown",
"id": "df3cf9ed-a109-410b-9955-0dcb42d06eac",
"metadata": {},
"source": [
"## Create intro"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a2d16e0e-9dd5-4f04-8724-4e25ac07f34f",
"metadata": {},
"outputs": [],
"source": [
"instruction = pn.pane.Markdown(\"\"\"\n",
"This dashboard visualizes all global glaciers and allows exploring the relationships\n",
"between their locations and variables such as their elevation, temperature and annual\n",
"precipitation.
Box- or lasso-select on each plot to subselect and hit the \n",
"\"Clear selection\" button to reset. See the notebook source code for how to build apps\n",
"like this!\"\"\", width=600)\n",
"\n",
"panel_logo = pn.pane.PNG(\n",
" 'https://panel.holoviz.org/_static/logo_stacked.png',\n",
" link_url='https://panel.holoviz.org', height=95, align='center'\n",
")\n",
"\n",
"oggm_logo = pn.pane.PNG(\n",
" 'https://raw.githubusercontent.com/OGGM/oggm/master/docs/_static/logos/oggm_s_alpha.png',\n",
" link_url='https://oggm.org/', height=100, align='center'\n",
")\n",
"\n",
"intro = pn.Row(\n",
" oggm_logo,\n",
" instruction,\n",
" pn.layout.HSpacer(),\n",
" panel_logo,\n",
" sizing_mode='stretch_width'\n",
")\n",
"\n",
"intro"
]
},
{
"cell_type": "markdown",
"id": "130476bf-0923-46ec-bb39-f349439127e7",
"metadata": {},
"source": [
"### Load and cache data"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "361cec45-e131-44f8-8dad-32706e187ded",
"metadata": {},
"outputs": [],
"source": [
"from holoviews.element.tiles import lon_lat_to_easting_northing\n",
"\n",
"@pn.cache\n",
"def load_data():\n",
" df = pd.read_parquet('https://datasets.holoviz.org/oggm_glaciers/v1/oggm_glaciers.parq')\n",
" df['latdeg'] = df.cenlat\n",
" df['x'], df['y'] = lon_lat_to_easting_northing(df.cenlon, df.cenlat)\n",
" return df\n",
"\n",
"df = load_data()\n",
"\n",
"df.tail()"
]
},
{
"cell_type": "markdown",
"id": "4d9b4125-eef1-4d28-9557-315f8fb42737",
"metadata": {},
"source": [
"### Set up linked selections"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "336c6b94-062c-4409-b67b-327089616d91",
"metadata": {},
"outputs": [],
"source": [
"ls = hv.link_selections.instance()\n",
"\n",
"def clear_selections(event):\n",
" ls.selection_expr = None\n",
"\n",
"clear_button = pn.widgets.Button(name='Clear selection', align='center')\n",
"\n",
"clear_button.param.watch(clear_selections, 'clicks');\n",
"\n",
"total_area = df.area_km2.sum()\n",
"\n",
"def count(data):\n",
" selected_area = np.sum(data['area_km2'])\n",
" selected_percentage = selected_area / total_area * 100\n",
" return f'## Glaciers selected: {len(data)} | Area: {selected_area:.0f} kmĀ² ({selected_percentage:.1f}%)'\n",
"\n",
"pn.Row(\n",
" pn.pane.Markdown(pn.bind(count, ls.selection_param(df)), align='center', width=600),\n",
" clear_button\n",
").servable(area='header', title='OGGM Glaciers')"
]
},
{
"cell_type": "markdown",
"id": "4a1834f9-5759-448e-86eb-28f92d99d1c6",
"metadata": {},
"source": [
"### Create plots"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b9b79640-3acf-4722-8038-d192283100a9",
"metadata": {},
"outputs": [],
"source": [
"geo = df.hvplot.points(\n",
" 'x', 'y', rasterize=True, tools=['hover'], tiles='ESRI', cmap=bmy, logz=True, colorbar=True,\n",
" xaxis=None, yaxis=False, ylim=(-7452837.583633271, 6349198.00989753), min_height=400, responsive=True\n",
").opts('Tiles', alpha=0.8)\n",
"\n",
"scatter = df.hvplot.scatter(\n",
" 'avg_prcp', 'mean_elev', rasterize=True, fontscale=1.2, grid=True,\n",
" xlabel='Avg. Precipitation', ylabel='Elevation', responsive=True, min_height=400\n",
")\n",
"\n",
"temp = df.hvplot.hist(\n",
" 'avg_temp_at_mean_elev', fontscale=1.2, responsive=True, min_height=350, fill_color='#85c1e9'\n",
")\n",
"\n",
"precipitation = df.hvplot.hist(\n",
" 'avg_prcp', fontscale=1.2, responsive=True, min_height=350, fill_color='#f1948a'\n",
")\n",
"\n",
"plots = pn.pane.HoloViews(ls(geo + scatter + temp + precipitation).cols(2).opts(sizing_mode='stretch_both'))\n",
"plots"
]
},
{
"cell_type": "markdown",
"id": "28fc8348-3ef0-4028-ac73-3bcc9e09b46e",
"metadata": {},
"source": [
"## Dashboard content\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "28b00ffa-6ffb-4775-87aa-320710a2b8a1",
"metadata": {},
"outputs": [],
"source": [
"pn.Column(intro, plots, sizing_mode='stretch_both').servable();"
]
}
],
"metadata": {
"language_info": {
"name": "python",
"pygments_lexer": "ipython3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}