From a6c2b0ccc9ee0036391e45a2c859f53890895cc8 Mon Sep 17 00:00:00 2001 From: Roger Labbe Date: Sat, 27 Feb 2016 17:52:17 -0800 Subject: [PATCH] Interactive plots with 5matplotlib inlien Need to make the plots antimated, but the notebook is essentially working. --- 02-Discrete-Bayes.ipynb | 14139 +++++++++++++++++++++++++++++++++++++- requirements.txt | 3 +- 2 files changed, 13971 insertions(+), 171 deletions(-) diff --git a/02-Discrete-Bayes.ipynb b/02-Discrete-Bayes.ipynb index 9deb95b..9412ed7 100644 --- a/02-Discrete-Bayes.ipynb +++ b/02-Discrete-Bayes.ipynb @@ -50,7 +50,7 @@ " font-family: 'Source Code Pro', Consolas, monocco, monospace;\n", "}\n", " div.cell{\n", - " width: 850px;\n", + " //width: 950px;\n", " margin-left: 0% !important;\n", " margin-right: auto;\n", " }\n", @@ -64,7 +64,7 @@ " //font-family: 'Chivo',verdana,arial,sans-serif;\n", " //font-family: 'Cardo',verdana,arial,sans-serif;\n", " //font-family: 'Arvo',verdana,arial,sans-serif;\n", - " //font-family: 'Poppins',verdana,arial,sans-serif; \n", + " //font-family: 'Poppins',verdana,arial,sans-serif;\n", " //font-family: 'Ubuntu',verdana,arial,sans-serif;\n", " //font-family: 'Fontin',verdana,arial,sans-serif;\n", " //font-family: 'Raleway',verdana,arial,sans-serif;\n", @@ -88,10 +88,10 @@ " h1 {\n", " font-family: 'Open sans',verdana,arial,sans-serif;\n", "\t}\n", - "\t\n", + "\n", " div.input_area {\n", " background: #F6F6F9;\n", - " border: 1px solid #586e75; \n", + " border: 1px solid #586e75;\n", " }\n", "\n", " .text_cell_render h1 {\n", @@ -104,7 +104,7 @@ " display: block;\n", " white-space: wrap;\n", " text-align: left;\n", - " } \n", + " }\n", " h2 {\n", " font-family: 'Open sans',verdana,arial,sans-serif;\n", " text-align: left;\n", @@ -120,7 +120,7 @@ " display: block;\n", " white-space: wrap;\n", " text-align: left;\n", - " } \n", + " }\n", " h3 {\n", " font-family: 'Open sans',verdana,arial,sans-serif;\n", " }\n", @@ -187,42 +187,38 @@ " margin: 2em;\n", " }\n", " ul li{\n", - " padding-left: 0.5em; \n", - " margin-bottom: 0.5em; \n", - " margin-top: 0.5em; \n", + " padding-left: 0.5em;\n", + " margin-bottom: 0.5em;\n", + " margin-top: 0.5em;\n", " }\n", " ul li li{\n", - " padding-left: 0.2em; \n", - " margin-bottom: 0.2em; \n", - " margin-top: 0.2em; \n", + " padding-left: 0.2em;\n", + " margin-bottom: 0.2em;\n", + " margin-top: 0.2em;\n", " }\n", " ol{\n", " margin: 2em;\n", " }\n", " ol li{\n", - " padding-left: 0.5em; \n", - " margin-bottom: 0.5em; \n", - " margin-top: 0.5em; \n", + " padding-left: 0.5em;\n", + " margin-bottom: 0.5em;\n", + " margin-top: 0.5em;\n", " }\n", " ul li{\n", - " padding-left: 0.5em; \n", - " margin-bottom: 0.5em; \n", - " margin-top: 0.2em; \n", + " padding-left: 0.5em;\n", + " margin-bottom: 0.5em;\n", + " margin-top: 0.2em;\n", " }\n", " a:link{\n", - " font-weight: bold;\n", " color:#447adb;\n", " }\n", " a:visited{\n", - " font-weight: bold;\n", " color: #1d3b84;\n", " }\n", " a:hover{\n", - " font-weight: bold;\n", " color: #1d3b84;\n", " }\n", " a:focus{\n", - " font-weight: bold;\n", " color:#447adb;\n", " }\n", " a:active{\n", @@ -230,10 +226,10 @@ " color:#447adb;\n", " }\n", " .rendered_html :link {\n", - " text-decoration: underline; \n", + " text-decoration: underline;\n", " }\n", " .rendered_html :hover {\n", - " text-decoration: none; \n", + " text-decoration: none;\n", " }\n", " .rendered_html :visited {\n", " text-decoration: none;\n", @@ -246,7 +242,7 @@ " }\n", " .warning{\n", " color: rgb( 240, 20, 20 )\n", - " } \n", + " }\n", " hr {\n", " color: #f3f3f3;\n", " background-color: #f3f3f3;\n", @@ -300,7 +296,7 @@ ], "source": [ "#format the book\n", - "%matplotlib inline\n", + "%matplotlib notebook\n", "from __future__ import division, print_function\n", "from book_format import load_style\n", "load_style()" @@ -401,9 +397,775 @@ "outputs": [ { "data": { - "image/png": "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\nwIAB+slPfqIDBw5YHctS5eXlSk1NVXR0tKKjo5WRkaGtW7daHSugPPvsswoNDdWCBQusjmKZp59+\nWqGhoV5/Bg4caHUsyzmdTuXm5mrAgAGKjIxUSkqKdu3aZXUsywwdOtTn6yQ0NFTTp0+3Oppl3G63\nnnjiCU83SUpK0hNPPCG32211NEudO3dOBQUFGjJkiKKiojRhwgQ1NDRYHavDuk3J7uhbw3cH586d\n05gxY1RWVqaoqCir41hu586d+tWvfqXdu3ertrZW4eHhysrK0hdffGF1NMskJibq+eef13vvvafG\nxkb96Ec/0owZM9Tc3Gx1tICwZ88erV27VqmpqVZHsdyIESPkcrnkdDrldDr1/vvvWx3JUi0tLcrM\nzFRISIhqamp06NAhrVq1SgMGDLA6mmUaGho8Xx9Op1P79u1TSEiI7r77bqujWWbFihWqqKjQ6tWr\ndfjwYZWVlam8vFzPPvus1dEs9cADD8hut2vjxo1qbm5Wdna2srKy5HA4rI7WMUY3ccsttxgPPvig\n19qwYcOMxx9/3KJEgaV3797Ghg0brI4RUM6dO2eEhYUZb7zxhtVRAkr//v2NP/zhD1bHsNwXX3xh\nJCcnG9u3bzcmTZpkzJ8/3+pIlnnqqaeMMWPGWB0joBQVFRkTJkywOkZAW758udGvXz/jwoULVkex\nzI9//GMjNzfXa23u3LnG9OnTLUpkva+++soIDw83/v73v3utp6WlGU888YRFqa5Ot7iSfTVvDQ+c\nOXNGbrdb/fr1szpKQHC73dqyZYvOnz+vjIwMq+NYbt68ecrJydHEiROtjhIQjh49qkGDBikpKUmz\nZ8/2+mX47ui1117TLbfcolmzZik2NlY33XST1qxZY3WsgPLHP/5R9913n6677jqro1hmwoQJqq2t\n1eHDhyVJ//rXv/TOO+9o2rRpFiezzqVLl3T58mWfr4vIyMigu823W5TsU6dO6fLly4qNjfVaj42N\nldPptCgVAt3ChQs1duxYjR8/3uoolmpublafPn103XXX6eGHH9Zf//pXjR492upYllq7dq2OHj2q\n5cuXWx0lIIwbN05VVVV66623tG7dOjmdTmVkZOjzzz+3Oppljh49qvLyciUnJ2vbtm0qKCjQ0qVL\nVV5ebnW0gLBt2zZ9/PHH+uUvf2l1FEs99thj+vnPf65Ro0apR48eGjNmjHJzc/Xggw9aHc0yvXv3\n1vjx47V8+XKdPHlSbrdbmzZt0u7du4PudhG/HuEHdDeFhYWqr6/Xu+++q5CQEKvjWGrEiBHav3+/\nWlpa9Je//EVz5szRjh07NGrUKKujWeKDDz7Qr3/9a7377rsKDe0W1ynaNWXKFK+/jxs3TkOHDtWG\nDRu67aNb3W63br75ZpWUlEiSUlNT9cEHH2jNmjV6+OGHLU5nvbVr1yo9PV0pKSlWR7HUli1btHHj\nRm3ZskWjRo1SU1OTFixYoKFDh+r++++3Op5lNm3apLy8PCUkJCg8PFxjx47VPffco8bGRqujdUi3\n+A5xNW8Nj+7r0UcfVXV1tWpra33eobQ7Cg8PV1JSkm666SaVlJToxhtvVGlpqdWxLLN792795z//\n0ahRoxQREaGIiAjt2LFDa9asUY8ePdTa2mp1RMtFRUVp9OjROnLkiNVRLBMfH6+RI0d6rY0cOVLH\njx+3KFHg+Oyzz/T6669r3rx5Vkex3JIlS7R48WLNnDlTo0eP1r333qvCwsJu/4uPQ4cOVW1trc6f\nP69PP/1Ue/bs0cWLF5WUlGR1tA7pFiX7v98a/r/Z7XZlZmZalAqBaOHChZ6CPWzYMKvjBCS3262v\nv/7a6hiW+elPf6r3339f+/fv9/yx2WyaPXu29u/fr4iICKsjWu7ChQs6dOiQ4uPjrY5imczMTM99\ntt86fPgwP7hLqqysVM+ePTVr1iyro1juyy+/9PkfsdDQ0G7/CL9vRUZGKjY2Vp9//rneeustzZgx\nw+pIHdJtbhcpLCzUnDlzlJ6erszMTFVUVMjhcHTr+57Onz+vDz/8UIZhyO126/jx49q/f7/69++v\nxMREq+N1uUceeUSbNm3Sa6+9pujoaM//fPTu3Vu9evWyOJ01ioqKNG3aNCUmJurs2bP605/+pB07\ndnTrZ2X37dvX51aZXr16qX///j5XLruLxYsXa/r06br++uvlcrlUXFysL7/8UnPnzrU6mmUeffRR\nZWZm6plnntHdd9+tffv2adWqVVqxYoXV0Sy3fv16zZ49m0fHSpo+fbpWrFihIUOGaPTo0dq3b59K\nS0uVm5trdTRLbdu2TW63WyNGjNCRI0e0ZMkSjRo1KvjmYvXjTbpSRUWFMXToUKNnz56GzWYz6urq\nrI5kqe3btxshISFGaGio15/777/f6miWaGsWoaGhxtNPP211NMvk5uYaQ4YMMXr27GnExsYa2dnZ\nht1utzpWwLntttu69SP8Zs2aZQwaNMi47rrrjISEBOOuu+4yDh48aHUsy23dutVITU01IiMjjeHD\nhxurV6+2OpLlamtrjdDQUKOhocHqKAHh3LlzxqOPPmoMGTLEiIqKMpKTk41ly5YZX3/9tdXRLPXn\nP//ZSE5ONnr27GkMHDjQWLBggXHmzBmrY3UYb6sOAAAAmKxb3JMNAAAAdCVKNgAAAGAySjYAAABg\nMko2AAAAYDJKNgAAAGAySjYAAABgMko2AAAAYDJKNgAAAGCy/weZfX90eh3ZMgAAAABJRU5ErkJg\ngg==\n", + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\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 = $('
');\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", + " 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", + " this.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", + " '
');\n", + " var titletext = $(\n", + " '
');\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 = $('
');\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 = $('');\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 rubberband = $('');\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);\n", + " canvas.attr('height', height);\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 = $('
')\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 = $('');\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 = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var 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= 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": [ - "" + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" ] }, "metadata": {}, @@ -549,7 +2079,8 @@ "reading = 1 # 1 is 'door'\n", "update_belief(hallway, belief, z=reading, correct_scale=3.)\n", "print('sum =', sum(belief))\n", - "bp.bar_plot(belief)" + "with interactive_plot():\n", + " bp.bar_plot(belief)" ] }, { @@ -634,7 +2165,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": { "collapsed": false, "scrolled": true @@ -651,9 +2182,775 @@ }, { "data": { - "image/png": "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\nxz3x1113nex2ux5++GGlpqZq8uTJKi0tVVFRkScmLi5O9fX1Ki4uVm1traKjo1VVVaXFixeP8BYB\nAACAwDPkXVMAAAAAjDzumnKB6upqxcfHy2KxyGazqbm52XRKRr3xxhv6p3/6J8XGxio4OFjbt283\nnZJRTzzxhL7xjW9o0qRJmjJliv7xH/9RR44cMZ2WUdXV1UpOTtakSZM0adIkpaWlqb6+3nRaAeWJ\nJ55QcHCwHnnkEdOpGPOTn/xEwcHBXo/o6GjTaRnndDqVl5enKVOmyGKxKCkpSW+88YbptIyZPn26\nz/skODhYd955p+nUjBkYGNCaNWs8vUl8fLzWrFmjgYEB06kZc/r0aRUVFSkuLk7h4eHKyMhQa2ur\n6bSGhUb8b9TV1amoqEjl5eVqb29XWlqaFixYoK6uLtOpGXP69Gndcsst2rBhg8LDw02nY1xTU5N+\n+MMf6s0339TevXsVGhqqzMxM/elPfzKdmjFTp07Vv//7v+vgwYNqa2vT7bffrsWLF+vw4cOmUwsI\nBw4c0LPPPqvk5GTTqRh30003yeVyyel0yul06ve//73plIzq6elRenq6goKCtHv3bnV2dqqqqkpT\npkwxnZoxra2tnveH0+nU22+/raCgIH33u981nZoxTz75pGpqavSLX/xC7777rjZs2KDq6mo98cQT\nplMz5l/+5V9kt9v13HPP6fDhw8rKylJmZqYcDofp1C6fGx5z5sxxP/jgg15jM2fOdP/oRz8ylFFg\nufbaa93btm0znUZAOX36tDskJMT96quvmk4loFx//fXu//iP/zCdhnF/+tOf3DNmzHDv27fPPX/+\nfHdhYaHplIz513/9V/ctt9xiOo2AUlZW5s7IyDCdRkBbu3ate/Lkye6//OUvplMx5o477nDn5eV5\njd13333uO++801BGZp09e9YdGhrq/tWvfuU1npKS4l6zZo2hrIaPM+J/1dfXp7a2NmVlZXmNZ2dn\nq6WlxVBWCHSffvqpBgYGNHnyZNOpBISBgQHt3LlTZ86cUVpamul0jFuxYoWWLl2qf/iHfzCdSkA4\nduyYYmJiFB8fr7vvvtvrS/5Xo5dffllz5sxRbm6urFarbr31Vm3cuNF0WgHlP//zP/X9739f11xz\njelUjMnIyNDevXv17rvvSpLeeecd/fa3v9WiRYsMZ2bG+fPn1d/f7/OesFgsY/JyYhrxv+ru7lZ/\nf7+sVqvXuNVqldPpNJQVAt3KlSv19a9/XXPnzjWdilGHDx/WxIkTdc011+gHP/iBdu3apcTERNNp\nGfXss8/q2LFjWrt2relUAsJtt92mrVu36je/+Y02bdokp9OptLQ0ffLJJ6ZTM+bYsWOqrq7WjBkz\n1NDQoKKiIq1evVrV1dWmUwsIDQ0NOnHihB544AHTqRj12GOP6Xvf+55mz56tcePG6ZZbblFeXp4e\nfPBB06kZce2112ru3Llau3atPv74Yw0MDGjHjh168803x+SlKX7dvhCAr5KSErW0tGj//v0KCgoy\nnY5RN910kw4dOqSenh7993//t5YtW6bGxkbNnj3bdGpGHD16VD/+8Y+1f/9+BQdzvkOScnJyvJ7f\ndtttmj59urZt2+Z1a9urycDAgL7xjW+ooqJCkpScnKyjR49q48aN+sEPfmA4O/OeffZZpaamKikp\nyXQqRu3cuVPPPfecdu7cqdmzZ6u9vV2PPPKIpk+frvvvv990ekbs2LFD+fn5io2NVWhoqL7+9a/r\nnnvuUVtbm+nULhufEH8VERGhkJAQuVwur3GXy6XIyEhDWSFQFRcXq66uTnv37vX8WuzVLDQ0VPHx\n8br11ltVUVGhr33ta6qsrDSdljFvvvmm/u///k+zZ89WWFiYwsLC1NjYqI0bN2rcuHHq6+sznaJx\n4eHhSkxM1HvvvWc6FWOioqJ08803e43dfPPN+vDDDw1lFDj+93//V6+88opWrFhhOhXjVq1apdLS\nUi1ZskSJiYm69957VVJSclV/WXP69Onau3evzpw5oz/+8Y86cOCAent7FR8fbzq1y0Yj/ldhYWFK\nSUmR3W73Grfb7UpPTzeUFQLRypUrPU34zJkzTacTkAYGBnTu3DnTaRjz7W9/W7///e916NAhz8Nm\ns+nuu+/WoUOHFBYWZjpF4/7yl7+os7NTUVFRplMxJj093XPd7+feffdd/riXtGXLFo0fP165ubmm\nUzHuz3/+s8+/rAUHB1/Vty/8nMVikdVq1SeffKLf/OY3Y/JHIbk05W+UlJRo2bJlSk1NVXp6umpq\nauRwOK7a67Ak6cyZM3r//ffldrs1MDCgDz/8UIcOHdL111+vqVOnmk5v1D388MPasWOHXn75ZU2a\nNMnzLyjXXnutJkyYYDg7M8rKyrRo0SJNnTpVp06d0n/913+psbHxqr6X+HXXXedzWc6ECRN0/fXX\n+5wBvVqUlpbqzjvv1Fe+8hW5XC49/vjj+vOf/6z77rvPdGrGFBcXKz09Xf/2b/+m7373u3r77bdV\nVVWlJ58xUHatAAABbElEQVR80nRqxm3evFl33303t82VdOedd+rJJ59UXFycEhMT9fbbb6uyslJ5\neXmmUzOmoaFBAwMDuummm/Tee+9p1apVmj179tisienbtgSampoa9/Tp093jx49322w2d3Nzs+mU\njNq3b587KCjIHRwc7PW4//77TadmxGC1CA4Odv/kJz8xnZoxeXl57ri4OPf48ePdVqvVnZWV5bbb\n7abTCjjf/OY3r+rbF+bm5rpjYmLc11xzjTs2Ntb9z//8z+6Ojg7TaRlXX1/vTk5OdlssFndCQoL7\nF7/4hemUjNu7d687ODjY3draajqVgHD69Gl3cXGxOy4uzh0eHu6eMWOGu7y83H3u3DnTqRnzy1/+\n0j1jxgz3+PHj3dHR0e5HHnnE/emnn5pOa1j4iXsAAADAAK4RBwAAAAygEQcAAAAMoBEHAAAADKAR\nBwAAAAygEQcAAAAMoBEHAAAADKARBwAAAAygEQcAAAAM+H/Uw0AYefrvSAAAAABJRU5ErkJggg==\n", + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\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 = $('
');\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", + " 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", + " this.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", + " '
');\n", + " var titletext = $(\n", + " '
');\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 = $('
');\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 = $('');\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 rubberband = $('');\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);\n", + " canvas.attr('height', height);\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 = $('
')\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 = $('');\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 = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var 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= 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": [ - "" + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" ] }, "metadata": {}, @@ -805,13 +3869,14 @@ " result[i] = belief[(i-move) % n]\n", " belief[:] = result # copy back to original array\n", " \n", - "belief = np.array([.35, .1, .2, .3, 0, 0, 0, 0, 0, .05])\n", - "plt.subplot(121)\n", - "bp.bar_plot(belief, title='Before prediction', ylim=(0, .4))\n", + "with interactive_plot():\n", + " belief = np.array([.35, .1, .2, .3, 0, 0, 0, 0, 0, .05])\n", + " plt.subplot(121)\n", + " bp.bar_plot(belief, title='Before prediction', ylim=(0, .4))\n", "\n", - "perfect_predict(belief, 1)\n", - "plt.subplot(122)\n", - "bp.bar_plot(belief, title='After prediction', ylim=(0, .4))" + " perfect_predict(belief, 1)\n", + " plt.subplot(122)\n", + " bp.bar_plot(belief, title='After prediction', ylim=(0, .4))" ] }, { @@ -872,16 +3937,782 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\nnNChQ4e0ceNGxcbGNvqhFl+sWLFCaWlp+sUvfqGFCxfq1ltvVefOnfXFF19o165dKi8v13//93+r\nR48eVh4+AFwzfM37y5Wdna21a9dq7dq1uummm3T33XertrZWq1evVmVlpcaPH6+f/exnFh0N8B2f\nzmRv2rRJP/3pTxUTEyOn06k333yzyW127typ1NRUhYWFqUePHpozZ06LF4trg8PhUOfOnVVSUqIb\nb7xRr7/+upYvX674+HitXLlSkydP9pqfnZ2tzZs365577tH//u//Kjc3VytXrtSBAwf04IMPNvqE\nrsautXM4HA3Gu3btqrKyMs2fP18hISFauXKlXnnlFZWUlKhLly5auHChhg0b5tP+gbaIfEdr69Sp\nk89531hOX+jC14OCgvTee+9p/vz5ateunfLy8rR48WLFxMRo0aJFev31133aD9BcDnP+72cuorCw\nUJs3b9bAgQP10EMPKS8vTw899NBF5x89elTXX3+9UlNT9cwzz6iiokITJkzQ7Nmz9eSTT1p6AACA\ny0e+o7UcPHhQsbGxSk1N1fvvv9/aywEs59PlIiNHjtTIkSMlSePHj29y/vLly3XixAm98cYbCg4O\nVr9+/VRRUaGXX36ZEAaANoR8BwB72PLBx48++ki33XabgoODPWN33nmnKisrdfDgQTtKAgD8gHwH\nAN/Y8sHHqqqqBh8Ei4qKkjFGVVVVXk92uvAm8wBwNbvwnr9XGvIdVqmpqZHD4VBdXR1/V3DFayzb\nubsIAADwu549e+rw4cOtvQzANrZcLhIdHd3gCU5ut1sOh6NZj0MFALQt5DsA+MaWM9lDhgzRtGnT\ndPr0ac91e++99566devm9avEC/n6a9SysjJJrfOEptasbXX9koNH9MTGr1q8n0tZ+MMIDe3VqcX7\nuZred2pfGfWtrH01/SqcfL/6ard2/Wu1dmvXv1ZrW1m/qWz36Uz28ePH9fHHH6u8vFz19fU6dOiQ\nPv74Y8+T7qZPn660tDTP/Pvvv19hYWGaMGGCdu3apbfeeksvvviipk6d2oJDAQBYjXwHAHv41GSX\nlZVpwIABSkxM1MmTJ/XLX/5SAwcO1C9/+UtJZz8Is3//fs/8jh07qqioSJWVlRo0aJCeeOIJPfXU\nU8rKyrLnKAAAl4V8BwB7+HS5yLBhw1RfX3/R15csWdJg7Pvf/742bNhw2QsDANiPfAcAe9jywUcA\nAADgWkaTDQAAAFiMJhsAAACwGE02AAAAYDGabAAAAMBiNNkAAACAxWiyAQAAAIvRZAMAAAAWo8kG\nAAAALEaTDQAAAFiMJhsAAACwGE02AAAAYDGabAAAAMBiPjfZeXl5iouLU2hoqJKSklRSUnLJ+evW\nrVNycrI6duyoLl26aPTo0dq7d2+LFwwAsBb5DgDW86nJLigoUFZWlmbOnKny8nIlJydr5MiR+vzz\nzxudf+DAAY0ePVrDhg1TeXm51q9fr5MnT2rUqFGWLh4A0DLkOwDYw6cmOycnRxkZGcrIyFDfvn2V\nm5urrl27Kj8/v9H5W7du1ZkzZ/TCCy8oLi5ON998s6ZNm6Z9+/bp8OHDlh4AAODyke8AYI8mm+za\n2lpt3bpVw4cP9xofMWKESktLG91m0KBBCgoK0qJFi1RfX6+jR49q6dKl+sEPfqDOnTtbs3IAQIuQ\n7wBgH4cxxlxqgsvlUvfu3bVx40YNHTrUMz5nzhytWLFCFRUVjW5XUlKiMWPG6KuvvlJ9fb0GDhyo\nwsJCRUREeM2rrq72fM01ff7195BIzdh+ytYaLwxopy4nv7S1BtDWxcfHe74ODw9vxZV4I98B4PI1\nle2BdhR1u92aOHGixo8fr3Hjxuno0aN65plnNGbMGBUXF9tREgDgB+Q72roz13XWkTpb2huPTgFn\nFHicy6NwaU3+LYyIiFBAQIDcbrfXuNvtVnR0dKPbvPbaa2rfvr3mz5/vGVu2bJl69Oih0tJSJScn\nN7pdUlKST4suKytr1nwrtWZtq+uXHDwiyd4z2R06dFBSQs8W7+dqet+pfWXUt7L2+Wd02xLyndpt\nob7VtUsOHtGMjV9Zsq+LWfjDCN3aL67F+7ma3vcrpbaV9ZvK9iavyQ4KClJiYqKKioq8xouKipSS\nktLoNt9++60CAgK8CznPlqqvr2+qJADAD8h3ALCPT3cXyc7O1tKlS7V48WLt3r1bU6ZMkcvlUmZm\npiRp+vTpSktL88wfNWqUtm3bpjlz5uivf/2rtm3bpocfflg9e/ZUYmKiPUcCAGg28h0A7OHTRUvp\n6ek6fPiw5s6dK5fLpYSEBBUWFiomJkaSVFVVpf3793vm33777VqxYoV+9atf6aWXXlJYWJhuvfVW\nrV27VqGhofYcCQCg2ch3ALCHz58MyMzM9JzZuNCSJUsajKWnpys9Pf3yVwYA8AvyHQCs5/Nj1QEA\nAAD4hiYbAAAAsBhNNgAAAGAxmmwAAADAYjTZAAAAgMVosgEAAACL0WQDAAAAFqPJBgAAACxGkw0A\nAABYjCYbAAAAsBhNNgAAAGAxmmwAAADAYjTZAAAAgMV8brLz8vIUFxen0NBQJSUlqaSkpMlt/uM/\n/kP9+vVTSEiIunfvrhkzZrRosQAA65HvAGC9QF8mFRQUKCsrS7/5zW+UkpKi1157TSNHjlRFRYVi\nYmIa3SY7O1tr1qzRggULlJCQoOrqarlcLksXDwBoGfIdAOzhU5Odk5OjjIwMZWRkSJJyc3O1du1a\n5efna+7cuQ3m79mzR6+++qp27typ66+/3jPev39/i5YNALAC+Q4A9mjycpHa2lpt3bpVw4cP9xof\nMWKESktLG93mj3/8o/r06aM1a9aoT58+io2N1YQJE/T3v//dmlUDAFqMfAcA+ziMMeZSE1wul7p3\n766NGzdq6NChnvE5c+ZoxYoVqqioaLDNo48+qqVLl+qWW27RggULJElTp06Vw+HQhx9+6DW3urra\n8/XevXtbdDBonr+HRGrG9lO21nhhQDt1OfmlrTWAti4+Pt7zdXh4eCuuxBv5jqsR39vgL01lu0+X\nizRXfX29Tp8+reXLl6tPnz6SpGXLlqlv377asmWLBg0aZEdZAIDNyHcA8E2TTXZERIQCAgLkdru9\nxt1ut6KjoxvdpmvXrgoMDPQEsHS22w8ICNChQ4cuGsJJSUk+LbqsrKxZ863UmrWtrl9y8Igke3/a\n79Chg5ISerZ4P1fT+07tK6O+lbXPP6PblpDv1G4L9a2uzfc2avurflPZ3uQ12UFBQUpMTFRRUZHX\neFFRkVJSUhrdJiUlRWfOnNH+/fs9Y/v27VNdXZ169erly7oBADYj3wHAPj7dJzs7O1tLly7V4sWL\ntXv3bk2ZMkUul0uZmZmSpOnTpystLc0zPy0tTQMHDlRGRobKy8u1fft2TZw4UUOGDGm1n1oAAA2R\n7wBgD5+uyU5PT9fhw4c1d+5cuVwuJSQkqLCw0HMP1aqqKq+zGg6HQ++8844mT56sYcOGKTQ0VCNG\njNCvf/1re44CAHBZyHcAsIfPH3zMzMz0nNm40JIlSxqMRUVFqaCg4PJXBgDwC/IdAKzn82PVAQAA\nAPiGJhsAAACwGE02AAAAYDGabAAAAMBiNNkAAACAxWiyAQAAAIvRZAMAAAAWo8kGAAAALEaTDQAA\nAFiMJhsAAACwGE02AAAAYDGabAAAAMBiNNkAAACAxXxusvPy8hQXF6fQ0FAlJSWppKTEp+327t2r\nDh06qGPHjpe9SACAfch3ALCeT012QUGBsrKyNHPmTJWXlys5OVkjR47U559/fsntamtrNW7cOKWm\nplqxVgCAxch3ALCHT012Tk6OMjIylJGRob59+yo3N1ddu3ZVfn7+Jbf7t3/7N/Xv31/33XefJYsF\nAFiLfAcAezTZZNfW1mrr1q0aPny41/iIESNUWlp60e3effddrVmzRgsXLmz5KgEAliPfAcA+gU1N\n+Oqrr1RXV6eoqCiv8aioKK1fv77RbSorKzVp0iS9/fbbCgsL83kxZWVlPs+9nPlWas3aVtU/GhJp\nwUqaqHH0qMrK9lm2v6vhfaf2lVXfitrx8fEWrMR65Du121J9q2rzvY3a/qrfVLbbcneRBx98UI89\n9piSkpIkScYYO8oAAPyMfAcA3zR5JjsiIkIBAQFyu91e4263W9HR0Y1uU1xcrE2bNunZZ5+VdDaE\n6+vrFRwcrLy8PD3yyCONbncutJty7icPX+dbqTVrW12/5OARSadavJ9L6dChg5ISerZ4P1fT+07t\nK6O+lbWrq6tbvA87kO/Ubgv1ra7N9zZq+6t+U9neZJMdFBSkxMREFRUV6d577/WMFxUVacyYMY1u\ns3PnTq9//5//+R+98MIL2rJli7p16+bLugEANiPfAcA+TTbZkpSdna2HHnpIgwYNUkpKivLz8+Vy\nuZSZmSlJmj59urZs2aI///nPkqQbb7zRa/stW7bI6XSqX79+Fi8fANAS5DsA2MOnJjs9PV2HDx/W\n3Llz5XK5lJCQoMLCQsXExEiSqqqqtH//flsXCgCwHvkOAPbwqcmWpMzMTM+ZjQstWbLkktuOHz9e\n48ePb97KAAB+Qb4DgPVsubsIAAAAcC2jyQYAAAAsRpMNAAAAWIwmGwAAALAYTTYAAABgMZpsAAAA\nwGI02QAAAIDFaLIBAAAAi9FkAwAAABajyQYAAAAsRpMNAAAAWIwmGwAAALAYTTYAAABgMZ+b7Ly8\nPMXFxSk0NFRJSUkqKSm56NwPPvhAo0ePVrdu3XTdddepf//+WrJkiSULBgBYi3wHAOv51GQXFBQo\nKytLM2fOVHl5uZKTkzVy5Eh9/vnnjc4vLS3VzTffrNWrV2vXrl169NFHNWnSJK1cudLSxQMAWoZ8\nBwB7BPoyKScnRxkZGcrIyJAk5ebmau3atcrPz9fcuXMbzJ8+fbrXv2dmZqq4uFirV6/W2LFjLVg2\nAMAK5DsA2KPJM9m1tbXaunWrhg8f7jU+YsQIlZaW+lyopqZGnTp1av4KAQC2IN8BwD4OY4y51ASX\ny6Xu3btr48aNGjp0qGd8zpw5WrFihSoqKpos8s477+jee+9VaWmpEhMTvV6rrq72fL13797mrh8t\n8PeQSM3YfsrWGi8MaKcuJ7+0tQbQ1sXHx3u+Dg8Pb8WVeCPfcTXiexv8palst/3uIps3b9YDDzyg\nhQsXNghgAMCVi3wHgItr8prsiIgIBQQEyO12e4273W5FR0dfctuSkhKNGjVKzz//vCZNmtTkYpKS\nkpqcI0llZWXNmm+l1qxtdf2Sg0ck2fvTfocOHZSU0LPF+7ma3ndqXxn1rax9/hndtoR8p3ZbqG91\nbb63Udtf9ZvK9ibPZAcFBSkxMVFFRUVe40VFRUpJSbnodhs3btRdd92l5557Tk888YSPywUA+Av5\nDgD28elykezsbC1dulSLFy/W7t27NWXKFLlcLmVmZko6+2nztLQ0z/wNGzborrvu0qOPPqqxY8fK\n7XbL7Xbrq6++sucoAACXhXwHAHv4dAu/9PR0HT58WHPnzpXL5VJCQoIKCwsVExMjSaqqqtL+/fs9\n89944w2dOHFCCxYs0IIFCzzjvXr10meffWbxIQAALhf5DgD28KnJls7eC/XcmY0LXfi0ryVLlvAE\nMAC4QpDvAGA92+8uAgAAAFxraLIBAAAAi9FkAwAAABajyQYAAAAsRpMNAAAAWIwmGwAAALCYz7fw\nAwAA8MW+r47KdfyMT3OPhkRKOvc4dN91vS5QfSI6NHttdmrOcUuXd+xt8bjROJpsAABgKdfxM3pi\nY3OfAnqqWbMX/jBCfSKaWcJml3fcUnOOvS0eNxrH5SIAAACAxWiyAQAAAIvRZAMAAAAWo8kGAAAA\nLEaTDQAAAFjM5yY7Ly9PcXFxCg0NVVJSkkpKSi45f+fOnUpNTVVYWJh69OihOXPmtHixAADrke8A\nYD2fmuyCggJlZWVp5syZKi8vV3JyskaOHKnPP/+80flHjx7V8OHD1bVrV23dulWvvPKKXnrpJeXk\n5Fi6eABAy5DvAGAPn5rsnJwcZWRkKCMjQ3379lVubq66du2q/Pz8RucvX75cJ06c0BtvvKF+/frp\nZz/7mZ5++mm9/PLLli4eANAy5DsA2KPJJru2tlZbt27V8OHDvcZHjBih0tLSRrf56KOPdNtttyk4\nONgzduedd6qyslIHDx5s4ZIBAFYg3wHAPg5jjLnUBJfLpe7du2vjxo0aOnSoZ3zOnDlasWKFKioq\nGmxz5513qkePHlq0aJFn7G9/+5t69eqlDz/8UIMHD/aMV1dXW3EcAHBFCA8Pb+0leJDvAGCNxrKd\nu4sAAAAAFmuyyY6IiFBAQIDcbrfXuNvtVnR0dKPbREdHNzrf4XBcdBsAgH+R7wBgn8CmJgQFBSkx\nMVFFRUW69957PeNFRUUaM2ZMo9sMGTJE06ZN0+nTpz3X7b333nvq1q2bevXq5TW3Lf3qFACuJeQ7\nANjHp8tFsrOztXTpUi1evFi7d+/WlClT5HK5lJmZKUmaPn260tLSPPPvv/9+hYWFacKECdq1a5fe\neustvfjii5o6dao9RwEAuCzkOwDYo8kz2ZKUnp6uw4cPa+7cuXK5XEpISFBhYaFiYmIkSVVVVdq/\nf79nfseOHVVUVKTHH39cgwYNUqdOnfTUU08pKyvLnqMAAFwW8h0A7NHk3UUAAAAANM8Vd3eR5j7+\n1yqbNm3ST3/6U8XExMjpdOrNN9/0S11Jmjdvnn7wgx8oPDxckZGR+slPfqJdu3b5rX5eXp769++v\n8PBwhYeHKzk5WWvWrPFb/XPmzZsnp9OpyZMn+6Xe7Nmz5XQ6vf5069bNL7Wls2cQJ0yYoMjISIWG\nhiohIUGbNm3yS+3Y2NgGx+50OvXjH//Y9tr19fWaNWuW5//zuLg4zZo1S/X19bbXlqRjx44pKytL\nvXv3VlhYmIYOHaqysjK/1L7Wke/+zfe2ku0S+U6+X535fkU12c19/K+Vjh07pptuukm5ubkKCwuz\nvd75Nm7cqH/5l3/Rhx9+qOLiYgUGBiotLU3ffPONX+r36NFDv/rVr7R9+3Zt3bpVd9xxh0aPHq2d\nO3f6pb509gEYv/vd79S/f3+/1ZSkG264QW63W1VVVaqqqtKOHTv8Ure6ulopKSlyOBwqLCzU7t27\ntXDhQkVGRvqlfllZmeeYq6qqtG3bNjkcDv385z+3vfb8+fOVn5+vV199VXv27FFubq7y8vI0b948\n22tL0sSJE1VUVKRly5Zp586dGj58uNLS0uRyufxS/1pFvvs/39tCtkvkO/l+Fee7uYIMHjzY/OIX\nv/Aai4+PNzNmzPDrOtq3b2/eeOMNv9Y837Fjx0xAQIB55513Wm0NnTt3Nr/97W/9Uuubb74xffr0\nMRs2bDCpqanmiSee8EvdZ5991tx0001+qXWh6dOnm6FDh7ZK7cY8//zzplOnTubkyZO217r77rvN\nhAkTvMbGjx9vfvzjH9te+8SJEyYwMND86U9/8hpPTEw0s2bNsr3+tYx8P6u1892f2W4M+d4WkO/2\n5fsVcyb7ch7/e7WqqalRfX29OnXq5Pfa9fX1WrlypY4fP67k5GS/1Jw0aZLS09M1bNgwv9Q732ef\nfabu3bsrLi5O48aN8/oAmJ3efvttDR48WGPHjlVUVJQGDBig1157zS+1G/P666/rwQcfVLt27Wyv\nNXToUBUXF2vPnj2SpP/7v//T+++/r1GjRtle+8yZM6qrq2twnKGhoX67dOFaRL5/p7XyvTWyXSLf\nyferPN9tad1tUFlZaRwOh9m0aZPX+HPPPWduuOEGv66ltc90jBkzxiQmJpr6+nq/1dyxY4dp3769\nCQwMNJ06dTJr1qzxS93f/va3JikpydTV1RljjF/PdKxdu9b8/ve/Nzt27DDr1683qampJjo62hw+\nfNj22iEhISY0NNTMmDHDlJeXm6VLl5r27dub1157zfbaF1q3bp1xOp1mx44dfqv57//+78bpdJqg\noCDjdDr9ehY5OTnZ/PCHPzRffPGFqaurM8uWLTMBAQF+z5lrCfn+HX/ne2tluzHkO/l+9ec7TfZl\naM0QfvLJJ0337t3NgQMH/Fq3trbW7Nu3z2zbts3MmDHDREREmF27dtlac8+ePaZLly7m008/9Yz5\nM4QvdPz4cRMZGWlycnJsrxUcHNzg14kzZswwN954o+21L3TfffeZwYMH+63ef/3Xf5mePXuaVatW\nmZ07d5rly5ebzp07m9dff90v9T/77DOTmppqHA6HCQoKMoMHDzYPPvhgq7z31wry/azWyPfWyHZj\nyHfy/drI9yumyT59+rQJDAw0f/jDH7zGH3/8cZOamurXtbRWCGdlZZlu3bp5hVJrSUtLM4888oit\nNZYuXWqcTqcJDAz0/HE4HJ6fgE+fPm1r/cbcfvvt5rHHHrO9Tq9evcw///M/e40tW7bMtG/f3vba\n5/vyyy9NcHCwWbx4sd9q9ujRwyxcuNBr7Pnnnzfx8fF+W4Mxxnz77bemqqrKGGPMz3/+c3P33Xf7\ntf61hHxvO/nuj2w3hnwn379zNef7FXNN9vmP/z1fUVGRUlJSWmlV/jNlyhQVFBSouLhY8fHxrb0c\n1dfX69QHNkNDAAACt0lEQVSpU7bWuOeee7Rjxw59/PHHnj9JSUkaN26cPv74YwUFBdla/0InT57U\n7t271bVrV9trpaSkeK5ZO2fPnj0NHltttyVLligkJERjx471W81vv/1WTqd3NDmdTr/d4umc0NBQ\nRUVF6ciRI1q3bp1Gjx7t1/rXEvK97eS7P7JdIt/J9+9c1fluS+tuk4KCAtOuXTuzaNEiU1FRYSZP\nnmw6dOhgDh06ZHvtY8eOmfLycrN9+3YTFhZm5syZY8rLy/1S+7HHHjMdO3Y0xcXFpqqqyvPn2LFj\nttc2xphp06aZTZs2mQMHDpgdO3aYadOmmYCAALNu3Tq/1D+fP3+d+K//+q/mgw8+MPv37zcfffSR\nGTVqlAkPD/fLf/MtW7aY4OBgM3fuXPPXv/7VrFq1yoSHh5v8/Hzba5/v+uuvb3DHB7tNmDDB9OjR\nw7z77rvmwIED5q233jJdunQxTz31lF/qr1u3zhQWFpr9+/eb9957z9xyyy0mOTnZnDlzxi/1r1Xk\nu//zvS1luzHkO/luP3/n+xXVZBtjTH5+vomNjTUhISEmKSnJlJSU+KXuhg0bPL/KOv/Pww8/bHvt\nxuo6nU4ze/Zs22sbc/Z/it69e5uQkBATFRVlhg8fboqKivxS+0K3336730J47Nixpnv37qZdu3Ym\nJibG3HfffaaiosIvtY0xZs2aNaZ///4mNDTU9O3b17z66qt+q22MMcXFxcbpdJqysjK/1j127Jh5\n8sknTe/evU1YWJjp06ePmTlzpjl16pRf6q9atcr06dPHhISEmG7dupnJkyebmpoav9S+1pHv/s33\ntpTtxpDv/kS++yffeaw6AAAAYLEr5ppsAAAA4EpBkw0AAABYjCYbAAAAsBhNNgAAAGAxmmwAAADA\nYjTZAAAAgMVosgEAAACL0WQDAAAAFvt/qGgp0KrjpusAAAAASUVORK5CYII=\n", + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\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 = $('
');\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", + " 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", + " this.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", + " '
');\n", + " var titletext = $(\n", + " '
');\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 = $('
');\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 = $('');\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 rubberband = $('');\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);\n", + " canvas.attr('height', height);\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 = $('
')\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 = $('');\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 = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var 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= 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": [ - "" + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" ] }, "metadata": {}, @@ -933,7 +5531,8 @@ "source": [ "belief = [0, 0, .4, .6, 0, 0, 0, 0, 0, 0]\n", "prior = predict_move(belief, 2, .1, .8, .1)\n", - "bp.plot_belief_vs_prior(belief, prior)" + "with interactive_plot():\n", + " bp.plot_belief_vs_prior(belief, prior)" ] }, { @@ -944,47 +5543,828 @@ "\n", "If you look at the probabilities after performing the update you probably feel dismay. In the example above we started with probabilities of 0.4 and 0.6 in two positions; after performing the update the probabilities are not only lowered, but they are strewn out across the map.\n", "\n", - "This is not a coincidence, or the result of a carefully chosen example - it is always true of the evolution (predict step). If the sensor is noisy we lose some information on every prediction. Suppose we were to perform the prediction an infinite number of times - what would the result be? If we lose information on every step, we must eventually end up with no information at all, and our probabilities will be equally distributed across the `belief` array. Let's try this with 500 iterations." + "This is not a coincidence, or the result of a carefully chosen example - it is always true of the evolution (predict step). If the sensor is noisy we lose some information on every prediction. Suppose we were to perform the prediction an infinite number of times - what would the result be? If we lose information on every step, we must eventually end up with no information at all, and our probabilities will be equally distributed across the `belief` array. Let's try this with 100 iterations. The plot is animated; recall that you put the cursor in the cell and press Ctrl-Enter to execute the code and see the animation." ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\nAElFTkSuQmCC\n", + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\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 = $('
');\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", + " 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", + " this.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", + " '
');\n", + " var titletext = $(\n", + " '
');\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 = $('
');\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 = $('');\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 rubberband = $('');\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);\n", + " canvas.attr('height', height);\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 = $('
')\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 = $('');\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 = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var 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= 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": [ - "" + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" ] }, "metadata": {}, @@ -1067,7 +7213,8 @@ "\n", "belief = [.05, .05, .05, .05, .55, .05, .05, .05, .05, .05]\n", "prior = predict(belief, offset=1, kernel=[.1, .8, .1])\n", - "bp.plot_belief_vs_prior(belief, prior, ylim=(0,0.6))" + "with interactive_plot():\n", + " bp.plot_belief_vs_prior(belief, prior, ylim=(0,0.6))" ] }, { @@ -1081,16 +7228,782 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\n0mq3eKqnVqvh7u6OK1euYOfOnRg7dqxV8zsT1ve2U9+tUdsB1nfW9z916PouS+suk8zMTNGlSxex\natUqUVxcLObMmSOcnZ3F+fPnZc+urKwURUVF4vDhw8LJyUksWrRIFBUVWSV71qxZolu3biI7O1uU\nlpYaPyorK2XPFkKI119/XRw4cECcPXtWHD16VLz++utCpVKJnTt3WiX/Vtb8deL//d//if3794uS\nkhLx3XffidGjRwsXFxer/D/Pz88XDg4OIjk5Wfz4449i8+bNwsXFRaSnp8uefat+/fo1uOOD3KZN\nmyZ69+4ttm3bJs6ePSu+/PJL0bNnT/HKK69YJX/nzp0iKytLlJSUiF27don7779fhIWFiZqaGqvk\nd1as79av722ptgvB+s76Lj9r1/d21WQLIUR6errw9fUVjo6OQqPRiNzcXKvk7tu3z/irrFs/nnvu\nOdmzG8tVKpVi4cKFsmcLcfMvhY+Pj3B0dBTu7u4iMjJS6HQ6q2Tf7pFHHrFaEY6JiRFeXl6iS5cu\nwtvbW4wfP14UFxdbJVsIIbZv3y6Cg4OFWq0WgYGB4uOPP7ZathBCZGdnC6VSKQoKCqyaW1lZKV5+\n+WXh4+MjnJychL+/v5g/f76oqqqySv7mzZuFv7+/cHR0FL169RJz5swRFRUVVsnu7FjfrVvf21Jt\nF4L13ZpY361T3/lYdSIiIiIiibWba7KJiIiIiNoLNtlERERERBJjk01EREREJDE22UREREREEmOT\nTUREREQkMTbZREREREQSY5NNRERERCQxNtlERERERBL7fy5EskiexuadAAAAAElFTkSuQmCC\n", + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\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 = $('
');\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", + " 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", + " this.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", + " '
');\n", + " var titletext = $(\n", + " '
');\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 = $('
');\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 = $('');\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 rubberband = $('');\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);\n", + " canvas.attr('height', height);\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 = $('
')\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 = $('');\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 = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var 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= 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": [ - "" + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" ] }, "metadata": {}, @@ -1162,7 +8842,8 @@ "prior = np.array([.1] * 10)\n", "likelihood = lh_hallway(hallway, z=1, z_prob=.75)\n", "posterior = update(likelihood, prior)\n", - "bp.plot_prior_vs_posterior(prior, posterior, ylim=(0,.5))" + "with interactive_plot():\n", + " bp.plot_prior_vs_posterior(prior, posterior, ylim=(0,.5))" ] }, { @@ -1174,16 +8855,782 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtkAAACrCAYAAACzOIB9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt0VOW9xvFnJhdyAQIYcyHhFopBVjBiEimEtgEJHhRP\nVeSmNWCgmoMFI7YqKfSogFCqpgZJXBaNKIsKLVarCHRAEBA9J1wPeCIgcjmWSSqCwShCCO/5g5WR\nIYFMwp6ZXL6ftbIg77x7nncnmd/8smdnj80YYwQAAADAMnZ/LwAAAABoaWiyAQAAAIvRZAMAAAAW\no8kGAAAALEaTDQAAAFiMJhsAAACwGE02YJEJEybIbrfryJEj/l4KALRK3bt3V0JCgr+XAUiiyUYL\n9cQTT8hut+u1117zWabNZpPNZvNZHgDAHXUYTQlNNlokfxTaefPmqbS0VHFxcT7NBQCc9/7772vt\n2rX+XgYgSQr09wIAb/DHG5lGR0crOjra57kAgPN69Ojh7yUALhzJhmUOHz4su92uIUOG6OjRo7rn\nnnsUFRWlsLAwpaWlafny5XVut2jRIg0YMEDt27dXeHi4brjhBj333HM6e/Zsrbm7d+/W3XffrYSE\nBIWGhurqq69WcnKyHnzwQX3zzTeSpMGDB+upp56S9MN50na7XQEBAW7nSxtjtGjRIg0aNEgdOnRQ\naGio+vbtq3nz5qmqqqpWtt1uV0JCgk6ePKnc3Fx1795dQUFBKigocMuq65zsN998U4MHD3bl9OnT\nR//5n/+pb7/9ttbcjIwM2e12HTp0SM8//7z69u2r0NBQ3XnnnR58FwCgeWjoc8YHH3wgu92u7Oxs\n7du3T6NGjVJUVJQCAgL0P//zP5IufU52VVWV/vCHP6hfv34KDw9X+/btNWDAABUXF9e5tvrqPeAJ\njmTDcidOnFB6ero6deqkiRMn6sSJE1q+fLnGjh0rp9Ophx56yDU3KytLS5YsUXx8vLKzsxUUFKR3\n3nlHv/71r+VwOLRy5UrZ7ed/F9y9e7f69+8vu92uESNGqGfPnqqsrNTBgwe1ePFiPfLII2rXrp3u\nu+8+SdLGjRt1++236/rrr5d0/hSSDh06SJKqq6t1xx136N1331ViYqLuvvtuhYSE6IMPPlBeXp7e\nf/99rV692pVd4/Tp0xoyZIgqKip0yy23KCwsTPHx8a77r+sUld/97neaPXu2rrrqKo0bN04dOnSQ\nw+HQrFmz9M4772jTpk0KDw93za+5nylTpmjLli269dZbNWLECLVr187C7xIANA0Nec6QpP3796t/\n//7q06ePsrKydPLkSYWFhUlSnTX47Nmz+rd/+zetX79eiYmJmjx5ss6cOaM333xTEydO1IcffqhF\nixbV2u5y9R7wiAEscujQIWOz2Yzdbjfjxo1zu+3zzz83HTp0MCEhIebIkSPGGGPeeOMNY7PZTL9+\n/UxlZaVrblVVlbnpppuM3W43zz77rGv8kUceMXa73fz973+vlV1ZWWnOnDnj+vyJJ54wdrvdLF68\nuM61zpo1y9hsNjN16lRz7tw5t9seeOABY7fbzQsvvOA2XrNvN998szl16lSt+5wwYYKx2+3m8OHD\nrrGPP/7Y2Gw207VrV1NWVuY2f/z48cZut5spU6a4jWdkZBibzWbi4+NdXysAaGka+pyxYcMG1/yZ\nM2fWeZ/du3c3PXr0cBubN2+esdlsZvjw4aaqqso1fvLkSZOUlGTsdrtZsWKF2zb11XvAE5wuAssF\nBARo7ty5bmM9evRwHT1YsmSJpPOnidhsNs2dO9ftSG5gYKDy8/NljNGf/vSnWvcfEhJSayw8PFxB\nQUEerc8Yo4KCAkVHRys/P7/WkY/f//73kqTXX3+9zu2feeaZOtdQl5p9zMvLq3W+9vz58xUSEqJX\nX31V1dXVbrfZbDY99thj6tKli0c5ANBcefqcUSM6OlozZ870+P5r6vBzzz2nwMAfXsBv166d5s6d\ne8nnGqlh9R64GKeLwHJdu3ZVt27dao3/7Gc/09y5c7Vjxw5Jcv2bkZFRa27fvn0VFRWlffv26bvv\nvlNYWJjGjBmj559/Xj//+c81cuRI3XTTTRowYIASExMbtL59+/bp2LFj+tGPfqRZs2bVut0Yo9DQ\nUJWWlta6LSQkRElJSR5n1ezj4MGDa90WFRWlvn37qqSkRPv27dO1117rdntaWprHOQDQXHn6nFEj\nOTnZ44MqlZWVOnDggGJiYtS7d+9at990002SpO3bt9e6raH1HrgYTTYsd6krbNSMV1RUuP6NiIhQ\nmzZt6pwfGxurL7/8UhUVFa4/hPnwww/19NNP66233tLSpUtljFH37t312GOP6YEHHvBofV999ZUk\n6cCBA64/kKxLXef2RUVFeZRRo2ZfY2Ji6rw9NjZWkvT111/Xuu1S2wBAS+Lpc0aNhtTG+mpwaGio\nIiIi6qzBDa33wMU4XQSWKy8vv+x4RESE69+KigqdPn26zvlOp9NtviTdeOONeuutt3TixAl9/PHH\nmj17tr7//ntNnjy51kuKl1Jzf7fddpuqq6sv+VHX1U0aeu3tmqyysjKP97GxWQDQHHn6nFGjIbWx\nvhp86tQp1wGfi1GDcaVosmG5I0eO1HkZuw0bNkiSbrjhBrd/a8YvtGfPHv3rX/9SYmKi66/GLxQY\nGKi0tDTl5eVp8eLFMsbob3/7m+v2gIAASap1rrMk9e7dWx06dNB///d/19lIW6lmH9evX1/rti+/\n/FJ79uxReHh4g095AYCWwtPnjMZo27atfvSjH6m8vFyffvpprdvXrVsnSUpNTW10BnApNNmwXHV1\ntR577DG3N4Q5cOCAioqKFBwcrLvvvluSNHHiRBljlJeX53a96LNnz2ratGmy2WyaNGmSa/yjjz7S\n999/Xyuv5mjwhX88edVVV8kYU2fhDggI0EMPPaSysjJNnjxZp06dqjXnq6++0q5duxqx9+6ys7Nl\njNHTTz9d62jNo48+qu+++04TJkxw/VIAAK2Np88ZjVXzXPPII4+4HVg5efKk8vLyaj3XAFbhnGxY\n7rrrrtN//dd/KTU1VcOGDdNXX32lv/zlLzp58qTy8/PVtWtXSdKYMWP0zjvv6M9//rP69OmjO+64\nw3Wd7P3792vo0KHKzc113e/8+fO1bt06/eQnP1GPHj3Uvn177du3T++++67Cw8PdrqU6ZMgQ2e12\n/fGPf9SxY8dc5+NNnTpV7dq104wZM7Rnzx69/PLLWrlypW666SbFx8fryy+/1IEDB7R582b96le/\n0nPPPXdFX4sf//jHmj59uubNm6ekpCSNGjVKERERcjgc2r59u5KTk/X0009fUQYANGeePmc01rRp\n07R69WqtXr1affv21YgRI1RVVaUVK1bo6NGjGj9+PG/2Be/w9Fp/CxcuND169DAhISEmJSXFbNq0\n6ZJza659eeGH3W43a9asafS1BtH01XzfBw8ebP75z3+aX/ziFyYqKsqEhoaatLQ0s3z58jq3e+ml\nl0z//v1N27ZtTVhYmLn++uvNs88+63Y9U2OMcTgcZuLEiSYpKcl07NjRhIeHm2uuucY88MADZu/e\nvbXu94033jCpqakmPDzc2O32Wtewrplz8803m8jISNOmTRvTuXNnM2DAAPPkk0+azz77zG2uzWYz\n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\nQ3126kJrRH3/gb/quz9qu0R9p7638PruldbdC44ePWpsNpvZtGmT2/hTTz1levfu7dO1+PtIx6hR\no0xKSoq4+/EQAAAFBUlEQVQ5d+6czzJ3795t2rZtawIDA03Hjh3Ne++955Pcl156yaSmpprq6mpj\njPHpkY7Vq1ebv/zlL2b37t1m3bp1JiMjw8TExJjjx497PTskJMSEhoaavLw8s3PnTvPqq6+atm3b\nmoULF3o9+2Jr1qwxdrvd7N6922eZv/3tb43dbjdBQUHGbrf79CjywIEDzU9/+lPzz3/+01RXV5vX\nX3/dBAQE+LzOtCbU9x/4ur77q7YbQ32nvrf8+k6T3Qj+LMIPP/ywiYuLM4cOHfJpblVVlTlw4IDZ\nvn27ycvLM5GRkeaTTz7xaubevXvN1Vdfbfbt2+ca82URvti3335roqKiTH5+vtezgoODa72cmJeX\nZ/r06eP17Ivdddddpn///j7L+/Of/2y6du1qli9fbvbs2WOWLFliOnXqZF555RWf5H/++ecmIyPD\n2Gw2ExQUZPr372/uvfdev3ztWwvq+3n+qO/+qO3GUN+p762jvjebJvvMmTMmMDDQ/PWvf3Ubf/DB\nB01GRoZP1+KvIpybm2s6d+7sVpT8ZejQoWbSpElezXj11VeN3W43gYGBrg+bzeb6DfjMmTNeza/L\n4MGDzeTJk72e061bN/PLX/7Sbez11183bdu29Xr2hf71r3+Z4OBg8/LLL/sss0uXLmbBggVuY7Nn\nzza9evXy2RqMMea7774zZWVlxhhjxowZY0aMGOHT/NaE+t506rsvarsx1Hfq+w9acn1vNudkX/j2\nvxdyOBxKT0/306p856GHHtKyZcu0fv169erVy9/L0blz53T69GmvZtxxxx3avXu3du3a5fpITU3V\nuHHjtGvXLgUFBXk1/2Lff/+9Pv30U8XGxno9Kz093XXOWo29e/fWettqbysuLlZISIjGjh3rs8zv\nvvtOdrt7abLb7T67xFON0NBQRUdH68SJE1qzZo1uv/12n+a3JtT3plPffVHbJeo79f0HLbq+e6V1\n95Jly5aZNm3amEWLFpnS0lIzdepU065dO3PkyBGvZ1dWVpqdO3eaHTt2mLCwMDNr1iyzc+dOn2RP\nnjzZtG/f3qxfv96UlZW5PiorK72ebYwxjz/+uNm0aZM5dOiQ2b17t3n88cdNQECAWbNmjU/yL+TL\nlxN//etfmw8++MAcPHjQfPzxx+bWW281ERERPvmel5SUmODgYDNnzhzz2WefmeXLl5uIiAhTVFTk\n9ewLXXPNNbWu+OBtEyZMMF26dDErV640hw4dMm+++aa5+uqrzW9+8xuf5K9Zs8asWrXKHDx40Pzj\nH/8w119/vRk4cKA5e/asT/JbK+q77+t7U6rtxlDfqe/e5+v63qyabGOMKSoqMj169DAhISEmNTXV\nbN682Se5GzZscL2UdeHHfffd5/XsunLtdrt58sknvZ5tzPkHRffu3U1ISIiJjo42mZmZxuFw+CT7\nYoMHD/ZZER47dqyJi4szbdq0MfHx8eauu+4ypaWlPsk2xpj33nvPJCcnm9DQUJOYmGheeOEFn2Ub\nY8z69euN3W43W7du9WluZWWlefjhh0337t1NWFiY6dmzp5kxY4Y5ffq0T/KXL19uevbsaUJCQkzn\nzp3N1KlTzcmTJ32S3dpR331b35tSbTeG+u5L1Hff1HfeVh0AAACwWLM5JxsAAABoLmiyAQAAAIvR\nZAMAAAAWo8kGAAAALEaTDQAAAFiMJhsAAACwGE02AAAAYDGabAAAAMBi/w/fVMd4x7UVBQAAAABJ\nRU5ErkJggg==\n", + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\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 = $('
');\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", + " 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", + " this.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", + " '
');\n", + " var titletext = $(\n", + " '
');\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 = $('
');\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 = $('');\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 rubberband = $('');\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);\n", + " canvas.attr('height', height);\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 = $('
')\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 = $('');\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 = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var 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= 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": [ - "" + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" ] }, "metadata": {}, @@ -1224,7 +10438,8 @@ "source": [ "likelihood = lh_hallway(hallway, z=1, z_prob=.75)\n", "posterior = update(likelihood, prior)\n", - "bp.plot_prior_vs_posterior(prior, posterior, ylim=(0,.5))" + "with interactive_plot():\n", + " bp.plot_prior_vs_posterior(prior, posterior, ylim=(0,.5))" ] }, { @@ -1256,7 +10471,8 @@ "prior = predict(posterior, 1, kernel)\n", "likelihood = lh_hallway(hallway, z=0, z_prob=.75)\n", "posterior = update(likelihood, prior)\n", - "bp.plot_prior_vs_posterior(prior, posterior, ylim=(0,.5))" + "with interactive_plot():\n", + " bp.plot_prior_vs_posterior(prior, posterior, ylim=(0,.5))" ] }, { @@ -1270,7 +10486,8 @@ "cell_type": "code", "execution_count": 24, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": true }, "outputs": [ { @@ -1288,7 +10505,8 @@ "prior = predict(posterior, 1, kernel)\n", "likelihood = lh_hallway(hallway, z=0, z_prob=.75)\n", "posterior = update(likelihood, prior)\n", - "bp.plot_prior_vs_posterior(prior, posterior, ylim=(0,.5))" + "with interactive_plot():\n", + " bp.plot_prior_vs_posterior(prior, posterior, ylim=(0,.5))" ] }, { @@ -1297,30 +10515,9 @@ "source": [ "## The Discrete Bayes Algorithm\n", "\n", - "This chart illustrates the algorithm:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import gh_internal\n", - "gh_internal.create_predict_update_chart()" + "This chart illustrates the algorithm:\n", + "\n", + "source: `book_plots.create_predict_update_chart()`" ] }, { @@ -1375,16 +10572,782 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\n", + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\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 = $('
');\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", + " 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", + " this.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", + " '
');\n", + " var titletext = $(\n", + " '
');\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 = $('
');\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 = $('');\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 rubberband = $('');\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);\n", + " canvas.attr('height', height);\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 = $('
')\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 = $('');\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 = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var 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= 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": [ - "" + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" ] }, "metadata": {}, @@ -1432,7 +12162,8 @@ "source": [ "likelihood = lh_hallway(hallway, z=0, z_prob=.75)\n", "posterior = update(likelihood, prior)\n", - "bp.bar_plot(posterior, ylim=(0, .4))" + "with interactive_plot():\n", + " bp.bar_plot(posterior, ylim=(0, .4))" ] }, { @@ -1444,16 +12175,782 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\nlEjHjh3N7qmsFAcHh2ofXc6bN0+eeOIJxbMfNHbsWAkICFAt75NPPpHHHntMtm7dKjk5OfLhhx+K\nq6urfPDBB6rkX7x4UUJDQ0Wn04m9vb0EBATI5MmTNXnvbQXr+32s76zvamN9V7a+W9VEvLS0VAwG\ng3z22Wdmy2fOnCmhoaGq7otWhXr27Nni5eVlVri0EBYWJlOnTlU8Z8OGDaLX68VgMJgeOp3O9C/p\n0tJSxffhQUOHDpUZM2YontO5c2f53e9+Z7YsKSlJnJycFM+u6qeffhIHBwdZt26dapmdOnWSuLg4\ns2VLliyRbt26qbYPIiK3b9+WoqIiERGZMGGCjBo1StV8W8L6zvrO+s76ria16rtVXSPekHbN1mTW\nrFnYsmUL0tLS0K1bN033paKiAnfv3lU8Z8yYMcjOzsbJkydND39/f0yaNAknT56Evb294vtQ1S+/\n/IIzZ87A09NT8aygoCDTNXSVzp49a2ozrpb169fD0dEREydOVC3z9u3b0OvNy5der1ft9laVjEYj\n3N3dcf36dezduxejR49WNd+WsL6zvrO+s76rSbX6rsj0XkO1tWu+dOmS4tnFxcWSlZUlJ06ckNat\nW8vixYslKytLlewZM2ZIu3btJC0tTYqKikyP4uJixbNjY2MlIyND8vPzJTs7W2JjY8XOzk727t2r\neHZN1Pzo8vXXX5cDBw5IXl6eHDlyRCIiIsTZ2VmV/+fHjh0TBwcHWbp0qZw/f162bt0qzs7OkpCQ\noHh2Vd27d692JwulRUZGSqdOnWTXrl2Sn58v27dvlw4dOsicOXNUyd+7d6/s3r1b8vLyJCUlRfr2\n7SuBgYFSVlamSr6tYn1nfWd9Z31Xmtr13eom4iIPb9espPT0dNPHZlUfU6ZMUTy7ply9Xi8LFy5U\nPDsyMlJ8fHzE0dFR3N3dZfjw4ZKamqp4bm2GDh2qWqGeOHGieHt7S6tWreTRRx+VsWPHSm5urirZ\nIiLJycnSp08fMRqN4ufnJ++9955q2SIiaWlpotfrJTMzU9Xc4uJiiYmJER8fH2ndurX4+vrK/Pnz\n5e7du6rkb926VXx9fcXR0VG8vLzktddek5s3b6qSbetY31nfWd/VwfquTn1ni3siIiIiIg1Y1TXi\nREREREQtBSfiREREREQa4ESciIiIiEgDnIgTEREREWmAE3EiIiIiIg1wIk5EREREpAFOxMlqhIaG\n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\nuka8Ie2arcmsWbOwZcsWpKWloVu3bpruS0VFBe7evat4zpgxY5CdnY2TJ0+aHv7+/pg0aRJOnjwJ\ne3t7xfehql9++QVnzpyBp6en4llBQUGma+gqnT171tRmXC3r16+Ho6MjJk6cqFrm7du3odebly+9\nXq/a7a0qGY1GuLu74/r169i7dy9Gjx6tar4tYX1nfWd9Z31Xk2r1XZHpvYZqa9d86dIlxbOLi4sl\nKytLTpw4Ia1bt5bFixdLVlaWKtkzZsyQdu3aSVpamhQVFZkexcXFimfHxsZKRkaG5OfnS3Z2tsTG\nxoqdnZ3s3btX8eyaqPnR5euvvy4HDhyQvLw8OXLkiERERIizs7Mq/8+PHTsmDg4OsnTpUjl//rxs\n3bpVnJ2dJSEhQfHsqrp3717tThZKi4yMlE6dOsmuXbskPz9ftm/fLh06dJA5c+aokr93717ZvXu3\n5OXlSUpKivTt21cCAwOlrKxMlXxbxfrO+s76zvquNLXru9VNxEUe3q5ZSenp6aaPzao+pkyZonh2\nTbl6vV4WLlyoeHZkZKT4+PiIo6OjuLu7y/DhwyU1NVXx3NoMHTpUtUI9ceJE8fb2llatWsmjjz4q\nY8eOldzcXFWyRUSSk5OlT58+YjQaxc/PT9577z3VskVE0tLSRK/XS2Zmpqq5xcXFEhMTIz4+PtK6\ndWvx9fWV+fPny927d1XJ37p1q/j6+oqjo6N4eXnJa6+9Jjdv3lQl29axvrO+s76rg/VdnfrOFvdE\nRERERBqwqmvEiYiIiIhaCk7EiYiIiIg0wIk4EREREZEGOBEnIiIiItIAJ+JERERERBrgRJyIiIiI\nSAOciBMRERERaYATcSIiIiIiDXAiTkRERESkgf8DzUXzRB4zL58AAAAASUVORK5CYII=\n", + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\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 = $('
');\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", + " 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", + " this.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", + " '
');\n", + " var titletext = $(\n", + " '
');\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 = $('
');\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 = $('');\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 rubberband = $('');\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);\n", + " canvas.attr('height', height);\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 = $('
')\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 = $('');\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 = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var 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= 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": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "output_type": "stream", @@ -1649,16 +13922,6 @@ "final position is 6\n", "predicted position is 6 with confidence 100.0000%:\n" ] - }, - { - "data": { - "image/png": "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\n+XQRAAAAABenRz1d5GI/Gv5qt2XLFt1+++1KTExUcHCwXnvtNasjWerZZ5/VjTfeqOjoaA0YMEA/\n/elPtWvXLqtjWaqyslJpaWmKjo5WdHS0MjMztX79eqtj+ZVnn31WwcHBmjdvntVRLPPMM88oODi4\nw5+BAwdaHctyTqdT+fn5GjBggCIiIpSamqotW7ZYHcsyQ4cO9XqfBAcHa+rUqVZHs4zb7daTTz7p\n6SbJycl68skn5Xa7rY5mqZMnT6qoqEhDhgxRZGSksrOz1dTUZHWsi9ZjSvbFfjR8T3Dy5EmNHj1a\nFRUVioyMtDqO5TZv3qxf//rX2rp1q+rr6xUaGqqcnBx9+eWXVkezTFJSkp5//nl98MEHam5u1o9/\n/GNNmzZNra2tVkfzC9u2bdMrr7yitLQ0q6NY7rrrrpPL5ZLT6ZTT6dSHH35odSRLtbW1KSsrS0FB\nQaqrq9OePXu0fPlyDRgwwOpolmlqavK8P5xOp3bs2KGgoCDdddddVkezzNKlS1VVVaWXXnpJe/fu\nVUVFhSorK/Xss89aHc1S999/v+x2u1avXq3W1lbl5uYqJydHDofD6mgXx+ghbrrpJuOBBx7oMDZs\n2DDjiSeesCiRf+nTp4+xatUqq2P4lZMnTxohISHG22+/bXUUv9K/f3/jj3/8o9UxLPfll18aKSkp\nxsaNG40JEyYYc+fOtTqSZZ5++mlj9OjRVsfwKyUlJUZ2drbVMfza4sWLjX79+hmnT5+2OoplfvKT\nnxj5+fkdxmbPnm1MnTrVokTW++abb4zQ0FDjH//4R4fx9PR048knn7Qo1aXpEXeyL+Wj4YGvvvpK\nbrdb/fr1szqKX3C73Vq3bp1OnTqlzMxMq+NYbs6cOcrLy9P48eOtjuIX9u/fr4SEBCUnJ2vmzJkd\nfhm+J3rzzTd10003acaMGYqNjdWYMWO0YsUKq2P5lT/96U+699571bt3b6ujWCY7O1v19fXau3ev\nJOk///mP/v3vf2vKlCkWJ7POt99+q3Pnznm9LyIiIgLumG+PKNlHjx7VuXPnFBsb22E8NjZWTqfT\nolTwd/Pnz9fYsWM1btw4q6NYqrW1VVFRUerdu7ceeugh/e1vf9OoUaOsjmWpV155Rfv379fixYut\njuIXbr75ZtXU1Ojdd9/Vq6++KqfTqczMTB0/ftzqaJbZv3+/KisrlZKSog0bNqioqEgLFy5UZWWl\n1dH8woYNG/Tpp5/qV7/6ldVRLPX444/rF7/4hUaOHKlevXpp9OjRys/P1wMPPGB1NMv06dNH48aN\n0+LFi3XkyBG53W6tWbNGW7duDbjjIj49wg/oaYqLi9XY2Kj3339fQUFBVsex1HXXXaedO3eqra1N\nf/3rXzVr1ixt2rRJI0eOtDqaJT766CP95je/0fvvv6/g4B5xn6JLkyZN6vD3m2++WUOHDtWqVat6\n7KNb3W63brzxRpWVlUmS0tLS9NFHH2nFihV66KGHLE5nvVdeeUUZGRlKTU21Ooql1q1bp9WrV2vd\nunUaOXKkWlpaNG/ePA0dOlT33Xef1fEss2bNGhUUFCgxMVGhoaEaO3as7r77bjU3N1sd7aL0iP9D\nXMpHw6PneuSRR1RbW6v6+nqvTyjtiUJDQ5WcnKwxY8aorKxMN9xwg8rLy62OZZmtW7fqv//9r0aO\nHKmwsDCFhYVp06ZNWrFihXr16qX29narI1ouMjJSo0aN0r59+6yOYpn4+HiNGDGiw9iIESN06NAh\nixL5jy+++EJvvfWW5syZY3UUyz322GNasGCBpk+frlGjRumee+5RcXFxj//Fx6FDh6q+vl6nTp3S\nZ599pm3btuns2bNKTk62OtpF6REl+38/Gv5/2e12ZWVlWZQK/mj+/Pmegj1s2DCr4/glt9utM2fO\nWB3DMj/72c/04YcfaufOnZ4/NptNM2fO1M6dOxUWFmZ1RMudPn1ae/bsUXx8vNVRLJOVleU5Z/u9\nvXv38oO7pOrqaoWHh2vGjBlWR7Hc119/7fUvYsHBwT3+EX7fi4iIUGxsrI4fP653331X06ZNszrS\nRekxx0WKi4s1a9YsZWRkKCsrS1VVVXI4HD363NOpU6f08ccfyzAMud1uHTp0SDt37lT//v2VlJRk\ndbwr7uGHH9aaNWv05ptvKjo62vMvH3369NE111xjcTprlJSUaMqUKUpKStKJEyf05z//WZs2berR\nz8ru27ev11GZa665Rv379/e6c9lTLFiwQFOnTtWgQYPkcrlUWlqqr7/+WrNnz7Y6mmUeeeQRZWVl\nacmSJbrrrru0Y8cOLV++XEuXLrU6muVWrlypmTNn8uhYSVOnTtXSpUs1ZMgQjRo1Sjt27FB5ebny\n8/OtjmapDRs2yO1267rrrtO+ffv02GOPaeTIkYG3L1Y/3uRKqqqqMoYOHWqEh4cbNpvNaGhosDqS\npTZu3GgEBQUZwcHBHf7cd999VkezRGd7ERwcbDzzzDNWR7NMfn6+MWTIECM8PNyIjY01cnNzDbvd\nbnUsv3Prrbf26Ef4zZgxw0hISDB69+5tJCYmGnfeeaexe/duq2NZbv369UZaWpoRERFhDB8+3Hjp\npZesjmS5+vp6Izg42GhqarI6il84efKk8cgjjxhDhgwxIiMjjZSUFGPRokXGmTNnrI5mqb/85S9G\nSkqKER4ebgwcONCYN2+e8dVXX1kd66LxseoAAACAyXrEmWwAAADgSqJkAwAAACajZAMAAAAmo2QD\nAAAAJqNkAwAAACajZAMAAAAmo2QDAAAAJqNkAwAAACb7f6dlWzX+0qwQAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ @@ -1666,8 +13929,9 @@ "\n", "random.seed(3)\n", "np.set_printoptions(precision=2, suppress=True, linewidth=60)\n", - "train_filter(4, kernel=[1.], sensor_accuracy=.999,\n", - " move_distance=4, do_print=True)" + "with interactive_plot():\n", + " train_filter(4, kernel=[1.], sensor_accuracy=.999,\n", + " move_distance=4, do_print=True)" ] }, { @@ -1679,11 +13943,787 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\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 = $('
');\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", + " 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", + " this.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", + " '
');\n", + " var titletext = $(\n", + " '
');\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 = $('
');\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 = $('');\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 rubberband = $('');\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);\n", + " canvas.attr('height', height);\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 = $('
')\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 = $('');\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 = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var 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= 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": [ - "" + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" ] }, "metadata": {}, @@ -1747,14 +15544,16 @@ } ], "source": [ - "with figsize(y=5):\n", - " for i in range (4):\n", - " random.seed(3)\n", - " plt.subplot(321+i)\n", - " train_filter(148+i, kernel=[.1, .8, .1], \n", - " sensor_accuracy=.8,\n", - " move_distance=4, do_print=False)\n", - " plt.title ('iteration {}'.format(148+i))" + "with figsize(y=5.5):\n", + " with interactive_plot():\n", + " for i in range (4):\n", + " random.seed(3)\n", + " plt.subplot(321+i)\n", + " train_filter(148+i, kernel=[.1, .8, .1], \n", + " sensor_accuracy=.8,\n", + " move_distance=4, do_print=False)\n", + " plt.title ('iteration {}'.format(148+i))\n", + " plt.tight_layout()" ] }, { diff --git a/requirements.txt b/requirements.txt index 063e869..ac9b9b8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -filterpy \ No newline at end of file +filterpy +seaborn \ No newline at end of file