{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import panel as pn\n",
    "\n",
    "pn.extension('plotly')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since Plotly plots are represented as simple JavaScript objects, we can easily define a JS callback to modify the data and trigger an update in a plot:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "xs, ys = np.mgrid[-3:3:0.2, -3:3:0.2]\n",
    "contour = dict(ncontours=4, type='contour', z=np.sin(xs**2*ys**2))\n",
    "layout = {'width': 600, 'height': 500, 'margin': {'l': 8, 'b': 8, 'r': 8, 't': 8}}\n",
    "fig = dict(data=contour, layout=layout)\n",
    "plotly_pane = pn.pane.Plotly(fig, width=600, height=500)\n",
    "\n",
    "buttons = pn.widgets.RadioButtonGroup(value='Medium', options=['Low', 'Medium', 'High'], button_type=\"success\")\n",
    "\n",
    "range_callback = \"\"\"\n",
    "var ncontours = [2, 5, 10]\n",
    "target.data[0].ncontours = ncontours[source.active]\n",
    "target.properties.data.change.emit()\n",
    "\"\"\"\n",
    "\n",
    "buttons.jslink(plotly_pane, code={'active': range_callback})\n",
    "\n",
    "component=pn.Column(buttons, plotly_pane)\n",
    "component"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## App\n",
    "\n",
    "Lets wrap it into nice template that can be served via `panel serve plotly_link.ipynb`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pn.template.FastListTemplate(\n",
    "    site=\"Panel\", title=\"Plotly JS Links\", main_max_width=\"650px\",\n",
    "    main=[\n",
    "        pn.pane.Markdown(\"Since Plotly plots are represented as simple JavaScript objects, we can easily define a **JS callback** to modify the data and trigger an update in a plot. \\n\\nThis allows you to **export your app as a static HTML file**.\", sizing_mode=\"stretch_width\"), \n",
    "        component\n",
    "    ]\n",
    ").servable();"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python",
   "pygments_lexer": "ipython3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
