replot/Examples.ipynb
Phyks (Lucas Verney) a736d41069 Enable the use of orthonormal axis.
Also move the `_render` method to the public API and add `xlim` and
`ylim` extra keywords arguments.

Closes https://github.com/Phyks/replot/issues/16.
2016-03-10 18:02:56 +01:00

35882 lines
3.4 MiB

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Replot\n",
"======\n",
"\n",
"This is some basic Jupyter notebook to show you the features of [replot](https://github.com/Phyks/replot). It gives you usage examples, and is used by me as a visual test suite to check I did not break anything between updates.\n",
"\n",
"For detailed documentations, please refer to the module documentation."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Let's go!\n",
"\n",
"First import the required modules. Note that importing `replot` will not have any side effect and that if you previously imported `matplotlib` it will be left untouched."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import replot\n",
"\n",
"%matplotlib notebook"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Also import numpy as it will be useful…\n",
"import numpy as np\n",
"\n",
"# and add some black magic for easy reloading of the module before executing any cell (just here to ease testing)\n",
"%load_ext autoreload\n",
"%autoreload 2\n",
"\n",
"# ignore matplotlib warnings about too many figures in the notebook\n",
"import matplotlib as mpl\n",
"mpl.rcParams[\"figure.max_open_warning\"] = 50"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Basic plotting\n",
"\n",
"Let's start by doing some basic plotting."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"scrolled": 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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Let's plot a basic data series, as we would do with matplotlib\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.plot(x)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Or a (X, Y) point series, as we would do with matplotlib\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" y = [i**2 for i in x]\n",
" figure.plot(x, y)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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dOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/wDqzGIxGo9/etm3b26b3N01zfDgc7o2civUdsx7feThw0wtuunH2w00z7m5rbxgw10S5e3+UvP+IEvjvkW/E+ouR98X6+Xw8lttj+8Ksx3ceDtz0gptunP1w04y7W3dNA+aSKHf7YrEp17du3fr2KISHovSdiOXRqZ9ZnvX4zsOBm15w042zH26acXfroGKAClH0PhmLu2P5eOTg1P4rCwsLW2Y5Zg7HysqrN5NT0gk3veCmG2c/3DTj7tZZuYD5JkreTzdN83O5PhqNzsX6/vax2L7W6/U2z3LcMQAAAMjRVb+AOSdK3t8uLi5+/2Q9XwI+MvXY1VmPmzeR629HuOkFN904++GmGXe3LroFzD+bouT9ZyzvzY1Yvz+fBcz1fr8/DC7OeuAcjryZqt/PwHs/cMNNO85+uGnG3a2jfgHzzOLi4vdE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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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dOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/gDjOw4GbXnDTjbMfbppxd6vuDyCO83DgphfcdOPsh5tm3N2q+wOI4zwcuOkFN904++GmGXe36v4A4jgPB256wU03zn64acbdrbo/wDqzGIxGo9/etm3b26b3N01zfDgc7o2civUdsx7feThw0wtuunH2w00z7m5rbxgw10S5e3+UvP+IEvjvkW/E+ouR98X6+Xw8lttj+8Ksx3ceDtz0gptunP1w04y7W3dNA+aSKHf7YrEp17du3fr2KISHovSdiOXRqZ9ZnvX4zsOBm15w042zH26acXfroGKAClH0PhmLu2P5eOTg1P4rCwsLW2Y5Zg7HysqrN5NT0gk3veCmG2c/3DTj7tZZuYD5JkreTzdN83O5PhqNzsX6/vax2L7W6/U2z3LcMQAAAMjRVb+AOSdK3t8uLi5+/2Q9XwI+MvXY1VmPmzeR629HuOkFN904++GmGXe3LroFzD+bouT9ZyzvzY1Yvz+fBcz1fr8/DC7OeuAcjryZqt/PwHs/cMNNO85+uGnG3a2jfgHzzOLi4vdE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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plotting a discrete (X, Y) point series\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" y = [i**2 for i in x]\n",
" figure.plot(x, y, line=False)\n",
" \n",
"# or equivalently plotting a discrete (X, Y) point series, as we would do with matplotlib\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" y = [i**2 for i in x]\n",
" figure.plot(x, y, \"x\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# But we can also plot a function, by automatically\n",
"# evaluating it on the given interval\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.sin, (-2, 2)) # Plot sinus on [-2, 2]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# We can also do the same forcing replot to use some evaluation points\n",
"with replot.Figure() as figure:\n",
" x = np.linspace(-np.pi, np.pi, 200)\n",
" figure.plot(np.sin, x)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"scrolled": 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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# And we can plot multiples graphs on the same figure\n",
"with replot.Figure() as figure:\n",
" figure.plot(range(5))\n",
" for i in range(8):\n",
" figure.plot(lambda x: np.sin(x + np.pi * i / 4), (-10, 10))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Advanced plotting\n",
"\n",
"We can do more elaborated stuff easily with `replot`."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"scrolled": 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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot with a label on the axis, and a title for the figure\n",
"# Note how the legend will be automatically added when a \"label\" is found!\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.plot(x, x, label=\"x\")\n",
" figure.xlabel = \"some x label\"\n",
" figure.ylabel = \"some y label\"\n",
" figure.title = \"A title for the figure\""
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false,
"scrolled": 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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# We can also pass these options directly to the constructor\n",
"# Here, we force the legend to be at the best location\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\") as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")\n",
" \n",
"# But we could also not constraint it (best location will be choosen)\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\") as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")\n",
" \n",
"# Or just say we want a legend (same as not constraining it)\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=True) as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")\n",
"\n",
"# Or force it to be in the lower right corner\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"lower right\") as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")\n",
" \n",
"# Or explicitly disable the legend, even if labels are found\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=False) as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# We can also force the range of the axis\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=False,\n",
" xrange=(-20, 10),\n",
" yrange=(-3.0, 3.0)) as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")\n",
" \n",
"# Or equivalently\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=False) as figure:\n",
" figure.xrange = (-20, 10)\n",
" figure.yrange = (-3.0, 3.0)\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9CXhUx5U2jJ3JzJeZJN8s9uT7iZNgbXHimSQTT2zTsj2Ol3gnjm2IV9TCC5jFNhgMxgaLRS0hQCxCbGKREDuIVYDEIsQqxCIhQAKEhBACAd6TmTiZycT668jddrvdLXX3ve89t26f93leJLUadZ06Vafee2/VOV26CAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBF/grxITE99NSEhIj+Y/q/93q/r/Lerbr4d6T1JS0ouKJxXPRt3Kzz7r5+pvHFSfV66+Hu7WrdsNRv5eZ1CfU6T4kfrc0Wb+XfX37lN/t0pxJ9kTFxd3W2d9KBAIBAKBQGAa4uPjHyUB6BUgV3X0XvWehYoLAl+/7rrr/tH/ZyVqmhR7B7yWYlQAqv9fpj7/LfpeiahfKeGUZOTvBfxtal9T4Osk0swWgNQP6m8+4/37T1P/BfahQCAQCAQCAQxKgKxWvFfxUxJVnbw3qAAMBFAAng38u2ZB2eUO1j6EAKS+VrzDzL8pEAgEAoFAEBa6du16DT3mpO/V1/2Ky0K9V/1unBJIlxRb6U6cYqESRvHq9QoSNHFxcd/3vm+j4ieKdd73vU6vBxOA6v8PVu87QCJLsVT9fGOIj/+69z2f/131ef/u/Ru91M/7vI9T96qfewb8nz8qvq1+t0J9PRpC5D1Oj6jp73vbXPbd7373n7y/o78xVXG+9/HzAZ+tXvwVPT739gO1Ya36+bpgRsTHx3/P+/f+Qo+AvZ91e2Afeu3qo147rriLPltxlbf/Z3ht/vyR+vXXX/+dwL+hfpdL71evLVGc7v07/0u/v/baa7+pvp/p9Tk9Tl/UrVu3vw/le4FAIBAIBA6CEhKvKT7i/Z4ExydKIPzfUO8PdgdQiY8fkKDxFy/h3AFUnzdA/XzOJzy8IqxV/fx/Qn1+4N9Vgup+9f9+5/ts9X+70c/+dzLp/5D46eLdX0fCJ8TfDnqH0ivqjl133XXf8P5cQoLK7/cTFSvVt3/t/Tuvq5+rQ9ng/T+fkvDz/RzYhzckJPyH+v2ffYKYhLb6+T/9+z6wvcH84PXXuz5Bqt6fpvrsn71icp3vfer3Oeq19R21WSAQCAQCxyOtm/v/eLq7H83o7s7yuNy7M1ypLZ7k1D+rr/+j+PvPfnbnj3elPJ52Y89vcrc3WigRsFl9uZq+/853vvN3JJ4U+4V6v5kCUP2f2sCDJ17x1quD9n7p76r3b1JcHPA36I5Xsf//UT+/Gupvhmqf398jAZjt+1m1z6N+3uL3//6TDrn4fqY7h16Bd3Oozwp8BPzz+BsTqA+H3tyrICPZXfHgT2778+03/ntb+5hLdl/KcLn33XLDzxpvuuFfS1+66aavB2tvKAFIdyT9P1u1/1rv59/re02JwpvoNbqT2Fk/CfRHxr8+/Q/p3d2vqrG1UsW3asXfeWPb/6i4dt7jSt2vvs4e3z3V1aWTfcECgUDgCAzu3vMbFBhV8GvNSE5tC4cUPD3JKRPTkp/syt3+SKCEwU/pDpzvkadX6FykR5yh/o/JAvAP6udT/p+vWN+RAA0iAElETgp4TzY9Ou2oLSH+dkgB6L8HUH3/DrXX+71PTB0NsKNR8eFQn+UTgDRm1FjLePOWJz9W/7ftrVufbh9Tv/yXW9ru/ZfuXxpnD/7rbW0P/eQ2Nd5SP8jonpr9kx/+6OUw7wB+yV/q97/wfv4Br8+p3Xu8bf5ZZ/0k0BdpN/X+foYrJU9dUHwSQXw7me5yu3t26fk17vYLBAIBBOnJvX+pAl5juIHxq4Ey9Q8qsL4zKOGBv+G2JRzQvjYlGn4S8Nq93v1pPwrxf8y+AzjC/z20N029FrL/or0DiBKA3v9HdwCf9P8/3sfofxXqs0iAPfuz+6aqcfMnGjtv3fpU2w/9BODDP7m9je4A+o+vu5QoJAHo+/n5mx78+EdJN3zo165/C0cAekXrXyh9j//r3lPIcrfHgaCYpERcmrrY+GO08S0j2X1C/f/bO/80gUAg0AdXqavc9OgDYwBd7n1pruf+mduoTvB1uusT5PWvKXFwRXFCsP9EopEOU9D36uvy733ve129++4+DRAeR5XAeJn286n3bfe+9qVTtur3/dXPNddcc8236Gf6Snvn1Os/DtXoIHsAH1D/52MSofTzD37wg+vpZ8qzF+r/hII3Hc4Vb9sGq//zG2+7OxSA1Fe0L7CLdw+gasP/p34+Eyqty9CfPPd3dLfv1V889vmYGakEoP8dwME3P952Q9IP24bd0qv95zdvfbLtX374oy8JwNdvfkKJxh+2vXFLrwW0wNP+vnAEoLdP6EDM/C5ewUeCX712Wn0rd3kcBk939w0qJh0zLb51d2elebeNCAQCgbag/VQqqBWYFhy/eGzSkHbLM0FPgnJDCZhv02lWOnBBYsb/d0oITFGvv6e+fqQ4K8j//bl6vc57ojRfvTcu8bPTp3TXcD/dhfL+nVQSFPSYkYRgkjcRdKL3lG2XL4THIPr/6rUddBqVRFiIZn898cungFf4talX4menWelx5j7/PYS0x9Hv/2QH/9Ofge4+0ilirz3l3//+9/+BxJN67cMkb/oZ711CEpQfegVUe9vUz2O8dmwnUmLnYJ9x3423/dT1o5//nu723frjf2v79U//o13cJf/4pvY7gPR16M09vXf4Hmq7+Uc/a7vjxn9v6/GTO9ru/1fXlwQgkf7/v//oJ/Sed3+ceENffz949yq2elnm3w7a76lem0H9RX1Pexo7Et4CPZHucv9MjZP3APFtkTwSFggE2oLEnwpkm8wOjjqIQIH1SPuZ++/pMVqYY6ctrftzX3qN9gU+8bO7OrrzvCPtpkf+lttOgT2Q0f3ZBIT4+3yMJrtnd5EtAwKBQEeoADYDFRz9gmQNHSzhtlXAC3pE63Glloc7bt7p/myb68c/b0tXQpB+HnHLk20//uENbUNufqIT4Zi6Pk0ez8U80m956jsZBvYzh3+RmzKO21ZBDCIpKemlUI9ZfEhISBiemJj4mOK4UIlZBbGJjGR3P3RwDLhSFsQwPMkpOZGMmfGulPZTvyQC6TAIfX3xpofD+r/pye5h3PYK+JCmLgDobrBV8W18996/4bZZEDv4a28C2UOJHZRSUu/prt6TR9+rr99N9FY7EAjG/iLlxgzv6UvLROCt7se47RbwIL176n1WjjV1cfO/nltTkrntFvDA40p5xdLx5kr9ePwvUr/HbbcghuA93RZSACrRN1KJwBf83t9iTcsEdkaaujr2uFIPWbsgU5B0N+mSHkZgHtK69/zHSHJKmnbB4Uo9I1sPYg+U589Yqpcox1uyW26wCKxDZwIw8bPal0/5/XyeTvlZ0zqBXaGujlMtF3+fL8ruIdz2C6wFPf7nGm+U943bfoG1aE/yzBXfkt0PctsviBGEcQcwNyAdRGvXrl2jOiH36aeftgn0x5/+8Enb9B6vsQRH4pT7B7b98Xf/xd0NAovwbmNLW8ZtfdjG26R7+rX91wcfc3eDwCJ8cP5yW+Ydz7ONt5lPDGv783//D3c3fAXRrPkCmyPMR8B9/H6+GO1n0SB6//3ft733nlBnbs5ewhYcfSzOWsTeD8IvSPMaNb+XD5vGPt7Wpy9g72M7Eelvbq4cOYN9vJXnF7P3Q6C/o133BTZGoABUYi/e//dUiJ3uAtL3cXGUqzZxQ7SfRQGDBtO77wp15fmGS20T7+7LHiAn/McLbY3Hm9j7Q/gZaV4j5vfJypPsY41Id4Qaas6y97NdiPI3N08dOsV6t9nH6T0Gt12+9BF7f/j7O3qVIbAlqLKAEnQnqBKB+v5O9dJV6vsGqnAQ8D7KhP+kYmZ8fHxCtJ/nxIARa9w6czV7cPRxxYgc9v4QfkaUIFg6JJt9nPm4Zkweez/bhU4VgEuHTGEfZz4e3LiXvT/8/W1UbwhiHE4MGLHEK5c/bpvx2FD2wOjPuopa9n4RYgRBfdUZ9vHlz6xfvtTW0nSZva/tQCcKQIol3GPMnwX9M9n7xN/f3PpBoDmcFjBijdXbDrEHxUDKXUB7ECEINmTms4+vQO4u3MLe13agEwVg4aAs9vEVyDNHG9j7xedvbv0g0BxOCxixxuVvTGcPiIHMvP35tub6C+x9E+s0WxDQ/qcpDw5iH1+BnJeaxt7XdqDTBGD73j8bjK9AbpxQwN43Pn9z6weB5nBSwIg1Np9pbT94wR0Qg5FOzHH3T6zTbEFwZEsF+7gKxfoj9ez9zU2nCUA65c09roJx8n0D2lpb3mfvHxGAAsNwUsCINe7IW8ceDENx/vNj2fsn1mm2IFgxPId9XIVi8cRC9v7mppME4OVLH7dNfegV9nEVinuXb2PvIxGAAsNwSsCINV658ru2mb2GswfCjth4QlLCcNJMQXDh3LvtBy64x1QoTn34VVul6NDd39ysKTvCPqY6Yl7KO+x9JAJQYBhOCRixxmPl1exBsDNum1XE3k+xTDMFwd5lW9nHU2c8vLmCvc+d4m9urh07j308dcba/SfY/c2tHwSawykBI9a46q2Z7AGwM85+eiR7P8UyzRQE+X097OOpMy4bOpW9z53ib062HzZ6wH6HjQJZ9M4cdn9z6weB5nBCwIg1Ut4zOz+O8yed5OPur1ilWYLgbF2zLSoxdEY6EHW+oZW933X3NzePbrdfaqtgnHTvy22XLn7I6m9u/SDQHE4IGLHGPUtK2YNfuNycvZS9v2KVZgkCepTPPY7C5c4FG9n7XXd/c5Oqu3CPo3BZvfUgq7+59YNAczghYMQaF78ykT3whUuqUkIHVrj7LBZphiAg38168k32cRQu83qPZu93nf3NTXr8m33/QPZxFC43ZOSz+ptbPwg0h+4BI9bYeuGDtol39WUPfJHwxN5j7P0WizRDENQdqGMfP5Gy8cQ59r7X1d/crNp6kH38RMLcJ4ax+ptbPwg0h+4BI9Zox9JvnXG9ZyF7v8UizRAEmyYtZh8/kXL34hL2vtfV39ykgxXc4ydScpWGEwEoMAzdA0askcoQcQe8SEkJXSmxK3ffxRrNEARznxvFPn4iZayeBtZdAF5u/ai9ygb3+ImUZfM3sPmbWz8INIfOASMWqdN+LH/WVdSy912s0aggoFKD3OMmGk7+Vf+YTAqtuwCsKqlkHzvRsKB/Jpu/ufWDQHPoHDBijWdrz7EHu2i5fc5a9v6LNRoVBAfWlLOPm2h5Ys8x9v7Xzd/cRJ7+RdZMp799sfk9Fn9z6weB5tA5YMQaaW8TKogtGjgBWnx90YAJ7P0XazQqCJD7sVaOzG1bMjgb9vdLclaw979u/uYmHahAjYfSnJVtM3uNgP39Qxv3sfibWz8INIfOASPWuHQIbsHctWhz2/HdNbC/T4mrOZOmxiKNCAJK/zL90SGw8UCnPWnRRP39+c+PZe9/nfzNzaa687CxQKw/Ut+2MWsR7O+vSZvL4m9u/SDQHLoGjFgjiadJ9/SDBbCGY2fbF/2c37wO+4yanVXs/RhLNCII6GQjahxMe/jV9kNBrS3vt2Xd+SLkMzJvf769Yg63D3TxNzf3rdwBG2++kpRHdxzBjeker1me71QEoMAwdA0YscaasipY8JrZc/jnn7Np8hLY55RMW87ej7FEI4KA7gijxgHt9fJ9Dm2gR33OwfV72H2gi7+5uXrUbNg42Jq7uv0z0BfRJytPWu5vbv0g0By6BoxYIzIfm382+9r9J2CfsyAGH8tx0oggWDpkCmwcVK7b/fnn7Ji7DvY5a/2EZixQZwGIfPJwpvqLPH2UIgj1OVtnrrbc39z6QaA5dA0YscY5z7wNC1yUfsH3OfRoDpWLK/OO51lOy8UqoxUE7WPg3v6Y8XZbn7bzDZc+/6xTB0/CxjWJilgqQ6irAGw80QQbA77Hvz7uXboV9llWX+CKABQYho4BI9bYdKoFFrTocAbtxfL/POTdnyNbDrD3Z6wwWkFApftQ/s9L+XKtXhJoUx9+FfZ5XFUadPI3N/cuw4kySpzv/1nngLE08/Y+bRearljqb279INAcOgaMWCMyQBYOzPrK55Xnb8IF5KxF7P0ZK4xWENCeKZT/aY9p4Oetemsm7PNoLHP7we7+5ibS/4c37f/K5yGr21SVVlrWbyIABYahY8CINSIDZLAyRvVVZ2CfN+fZt9n7M1YYrSBY+FI6zP9Htx/+yuftX1UG+7wlr01m94Pd/c3J9nRDPQZDfB/qjtyWqcth443+tpX+5tYPAs2hW8CIRc54HJcg1X+DtI8UlKcBH8udb2hl79NYYDSC4OL592BVE9q3G1z44Cuf2Vx/ETbWJt3dr73GLLcv7OpvbjbUNMJ8n5fyTtDPRG5xKHg5w1J/c+sHgebQLWDEGpGL44zHhobcJE+VGlCf638KVIhjNIKA9mii/N5RNRjkYzk62c7tC7v6m5vI6kbFkxYH/Uw65DTlgYGQz5x4d1/L6lCLABQYhm4BI9aIrJawbtz8kJ+7d/k22OeuHTuPvV9jgdEIAmS1hI7qQSPzT5bnF7P7wq7+5uaK4Tkwv/tnNwgkcltNXUWtZf7m1g8CzaFbwIg1FgPz/wXbIO3j2dpzsM/NfeIN9n6NBUYjCKiEGsrvJyvrQn4uskrDyjdnsPvCrv7mZPsJ8Idegfi8s5RTyIN1Oxdac8EhAlBgGDoFjFjkghfHYwLk7Z3n5EMWZ6fUNtx963RGKgioUgLt00P4e8oDg9quXP64w8+eeFdfyGfTVgduX9jR39yk+ryo+NJZLWja+4z6bLqraZW/ufWDQHPoFDBijcgFOTAfWzBSJQVUkDy4cS97/zqdkQoCZBWYcBbFxa9MhH0+7aXl9ofd/M3N8gJcuqnNU5Z1+Nl09xG1D3D6rwdb5m9u/SDQHDoFjFhj7b7jsAC53rOw088/sHYX7POD5YMTmstIBQEy/+OepaWdfj6yLNyh4n3s/rCbv7m5YgRu/9/R7Yc6/XxKEYT6/LN1zZb4m1s/CDSHTgEj1kg5+lABqqKovNPPbz7TCvv8/H4e9v51OiMVBMiN8Y0nznX6+cd3HYV9/uZs519w6CYAZ/YaDvE1pTEKrG4UjHQoiTO+muFvbv0g0Bw6BYxY4/Lh01kXZCKqBvGke/p1uCdMaJyRCoKZPTEL8rQer4X1+bRo0+Z9RBvy+6az+8Nu/uYk7T+mutAIXy98cXxYbUBecITzhMUMf3PrB4Hm0CVgxCJpLwlkQX7ktZD5/wK5ITMfFiRPH6ln72MnMxJB0NJ4CebnZa9PCbvNlLwX0QYr87Pp4G9uIsVXyfQVYbWBkpKjkp5TXksr/M2tHwSaQ5eAEWtsqjsPC5DLh00Lux30KAPVDso1yN3PTmYkgoBypqH83FH+v0DSnRNUO05WnmT3iV38zU3KzYjyc01ZVdjtQKU9CifLghn+5tYPAs2hS8CINVYCD2CUzVsfdjsajzfB2rF2nCSERjISQVCSswK3IO8Mf0GuKNoJa8euRZvZfWIXf3Nz9ajZMOEVzv4/H4uzCmHjLZyDKEb9za0fBJpDl4ARa9yQWQALTLV7j4XdDmS6hLzenaeiEUbPSARB4cAs2IJM9YXDbTPygmP127PYfWIXf3NzzrOYvcWznxoZUTsoHRVqvJXOWAX3N7d+EGgOXQJGrHFeahokKGXd+WLb5dYPI2pLISg/G234j+RqXRgZwxUEJPKz7xsA8TEt9JG0uf2C48FBkLbQIRdun9jB39yk/Kaowz50kj2StiBrrS8aGLr2tVn+5tYPAs2hQ8CINSI3Jy/qlx6xv5GPB4/vrmHvb6cyXEFw5iiuKgIlE4+03UsGZ8Pac77hErtfuP3NTaqVi/Ivpc6KtD1UmhLRlkn3vgzNdCACUGAYOgSMWCPyhNyOnOUR+xt5QCCagC0Mj+EKgv0rd8D8G81Bn22zimDtObLlALtfuP3NTUoKjvJvJAdAfFw9ahasPVRyDulvbv0g0Bw6BIxYI7IiwqnywxH7m+6aoNqz8s0Z7P3tVIYrCNaNXwDzb30UqX5oEUe1Z8vU5ex+4fY3N9eNmw/z74WmKxG3Z/fiElh7kAmhRQAKDEOHgBFrpLqpqID0n+99FJW/Zzw+DNIe+rvc/e1UhisIqC40wreT7+0f1SMwOjSSeTsmSXBB/0x2v3D7m5vz+4yxVSyhfKSoeFs8aTHU39z6QaA5dAgYsUZUiaSc37we9QKBrNvp5H1ZnAxHECD3mxoRW6hTouh9WXb3NzcvX/q4beJdfSG+XTY0/Pym/qTxMBl0CKqgfwbU39z6QaA57B4wYo3IEkn0uDVafyPrEtMeQ+5+dyLDEQR0CAfl1y1Tl0XddsoRiWoXHXrh9g2Xv7lZD7zbRntHo21X4SBMGqTs+weGXXUpGn9z6weB5rB7wIg1Ihdkyr4frb+R7aJTxtz97kSGIwgoKTjKr4c37Y+67ftWbIe1i5Ksc/uGy9/c3L+qDOZXIxeSm6csg7XrbG14ddej8Te3fhBoDrsHjFhjef4mWCCq23886gWC8vWhcndRnkHufnciwxEEK0fmwsZb85nWqNuOTE2zOXspu2+4/M3NjVmLcOOt/kLU7apcvxvWrkMb98H8za0fBJrD7gEj1lj0zlxIEKKKDJcufmBogaDKHYi2UaUR1GOSWGY4gmD20yMhPp3x2FBDbUcmp3bqBYcOAjC/nwfi02mPvGaoXQ3HzsIEYMk0zMlzEYACw7B7wIg1okQWlUgyukAg92WhHpPEMjvzN7IiAx0aMtp+VHk6o2LBrrS7ACRRP/lX/SE+XWxQ1Le37V5M25a8Nhnmb279INAcdg4YscbLrR/BTmRSiSSjCwQl9UUJQCP7xYTB2Zm/6w7Uwfy5c8FGw+3fNHkJrH1UAozbP1b7m5uNJ3B1ns3I75jfNx3Stmk9MBccIgAFhmHngBFrPHXwJCxA7shbb3iBQObL2pq7mr3/ncbO/L132VaYP80o8XdgTTmsfdVbD7L7x2p/c/Pg+j0wfx7csMdw+zZOKIC1D3HBIQJQYBh2DhixRuTJx6M7jhheIChf1qR7+kHat3xYdDm8hKHZmb83ZORjxtttfdrTGRltf331Gdh82D5nLbt/rPY3NyktEMqfjSeMbyFBlkSsKjU/1ZUIQIFh2DlgxBo3ZIIWZMWWs5dNWSBQj0lm9hzO3v9OY2f+Rvky94k3TGk/MmmwE0sQ2l0A0uEbhC8pibMZh8iQTziM5CjsyN/c+kGgOewcMGKNC1/CLMg5j77+ecAw6m/kXSNKNcPtAyexI38jN+RHW5EhGOeljoG0cdaTb7L7x0p/24HTHn4V4ks6WWxG++iCI+uXL0HaiHjCIQJQYBh2DhixROQptKVDsj8PGEb9jdw3Vrv3OLsfnMSO/E2nrlF+LM1dZZoNa8diTp5TrWGnXXDYWQCeO30BNt6KswpNayfqgiP3CfNrnosAFBiGXQNGrLHxOO6EXGnOys8DhlF/11XUwtq5e3EJux+cxI78TaeuUX4080T37sItsHbW7nPWBYedBeCRLQdgfqxYXWZaO5Gpri40XTHd39z6QaA57BowYo3IE3KHivd9HjCM+rv1wgftSaUR7VyfvoDdD05iR/4unbEKNt7O1jWbZsOJvcdg7XTaBYedBeDWmathfqyvOmNaO/csKYW1s2Znlen+5tYPAs1h14ARa0SekPMtyGYtELR/CtHOBS+OZ/eDk9iRv5cNnQrxoVkb8n1sL0F4ex9IW9eNm8/uI6v8zU3UeKNDQrR3z6x2Ip9wlM3fYLq/ufWDQHPYNWDEGheDTshl3/9FmTWzFogVw3Mw4uHe/lISzkR25O8Zjw+D+JBOFpttx8xeIyBtnf/8WHYfWeVvblJpQIgP+4wxtZ3I6jiUjN9sf3PrB4HmsGvAiDVSeSpE0Cnon/GlgGGGvymlAaKtRKoWwO0LpzCUvy80vwvzH6UyMtsO1AXHxLv7tue25PYT2t/cbGm6DBtv68abv21kzjNvQ9pK5TjN9je3fhBoDjsGjFgjZYlHBUj/E3JmLRDIDd2+/YpC4wzlb6rSgfIflQs0245ts9fA2numuoHdT2h/c7Om7AjMf3uWlpre3tWjZkHaSnun6Q6jmf7m1g8CzWHHgBFrrNp6EBYg/U/ImbVANJ08D2svHU7g9odTGMrf5QWbYP6j+sKmz4/SSlh7D6zdxe4ntL+5WTZvPW68VdSa3t6dC4th7T19+LSp/ubWDwLNYceAEWukslSogFN/pP5LAcMMf9M+PdpbiGgvbRbn9odTGMrfa8bkQXxHe6fMvMPhY3M9Lofc5uwl7H5C+5ubK0fmQnw34T9egIy3Y+XVsPFWaeIFhwhAgWHYMWDEGle/jXnkQFnt/U/ImblAUPZ9RJvNKiMmDO3vealpEN/NftrcPU7+nAqqIlE4KIvdT2h/cxOVNWDOs29D2tu+R/Y2zMlzX05Ws/zNrR8EmsOOASPWOM+NWZBpoQ8MGGb5G1a3WAXei+ffY/eJExjM38hyV3SnB2VL4cAsSJupPBm3n5D+5iYyjU/R6NmwdqNOLS8fPt1Uf3PrB4FeuGq8K+WODJf7HU+ye4nHlXoo/4Wx7YXRS6Ytb7/1LWk4rCX196R7+kGCDZXRCgwYZi0QtNkfIgAVT+w5xu4XJzCYv+urz8D8tiNvHcyWTZOXwF4+UZEAACAASURBVNrdcvYyu69Q/uYmMpF3eX4xrN2LX50EabOZd8lFAArCQlqXLlcr4fe4x+Wu7GyA0t0o2qfgpPQIdibyQMWuRZu/EjDMWiCgJeEKt7D7xQkM5m869IDyW/W2QzBbDqwph7WbTkVz+wrlb25SDIL5bddRWLuLJy2GtDnrzhfbLl/6yDR/c2sLgc0xuHvPb3hcqasiHajL35juuGLpdmQ18ARwTdmXSw+ZuUAgS8I5rUIDF4P5G1lxpvlMK8wW5J1LRCoRu/ibm2vS5mL8RltFmnFbRZBPOM4cNSf1kAhAQYdIu+mpa5T42x/tQKUs68igLvx9284FG3ELcv3FrwQMMxcIWEk4h1Vo4GIwf6NKclEic6QtyL2LG7MWsfsK5W9u5qWMhvhsZq/h0HbX7j0Oi8uHNpqT61QEoKAjXKXEX5nRwVrQP1P2BQJJ+/QQQca/BJx/wDBzgVgxAlOhgfZEypgzzmD+Rol2K07Tzn1uFKbtr0xk9xXK35y83PpRe6oWhM8o9iDbjqyWQ5WUzPI3t8gQ2BTp3d19zBqwiOz+ws+48MXxkCCz4IVxQQOGmQsEskID7Y3k9o3uDPQ37T1CLch0SANtDx1WQ7SdTnxy+wrhb26eOngSFh8odyq6/dN/PRjSdrNqAosAFARFWvee/5iR7P7QrAE7+Vf9HXNSzm6c8sAgSJChvTfBAoaZC0RVCa5Cw9HtuAMFscJAf1PZM5S/9q/cAbenNHcVpv239XHEfme7CUDkPjrkgSMfFw2YAGl7Xu/RpvmbW2sIbIj07im9TQ/wq8pMGbTCL3i+oRUWIMvmbwgaMMxcIJpOtcDaj0zxECsM9DfVWUb5C1GSK5CV63fD2n+y0vwSdtz+5ibVIUf563zDJXj7UblOJ97V15QsGyIABUHhcbmXmz1ozUxgKfyMyJJDVD81WMAwc4FoLwl33wBI+9eNX8DuH90Z6G/kI3vkiUwfTx+ph7W/omgnu7/M9jc3Ubn0pj86xJL2715cAhtvjSfOmeJvbq0hsB+u8iS7PzJ7wE6+t7/kBtQowJyt/WqAQSwQdGIX0f6ClzPY/aM7A/2NKjlIe6WssIfqvqJSD1EifG5/me1vbuY+MQziq6VDsi1pP/IC/ciWA6b4m1tsCOyHq1CD1oyrFuEXRD1imHR38FO0iAWi6J05EBum9cCmFYkFBvobVQOY9kpZZROl/0DYsHzYNHZ/me1vTn4m1jEl4EpyVlhiAz1mRq2lZlTNEQEoCArUoKWkxdyBxUmEbTJOCb7JGLFAUCBDjbcL595l95HO9Pd3e8nBe1+G+Gm9Z6FlNtHdH4QNs58yr0SXHfzN3ZbTh0/D4kLlut2W2TH1oVcgNphRx1gEoCAoUBOvPH8Te2BxEq1OM4BYIA5vroAF+tp9x9l9pDP9/X0OeGAnsOQgkpuzMTWBKT2OWSW67OBv7rYgD+ycOnTKMjvy+6ZDbKAiC2b4m1trCGyIjGT3JcSgtfJK3+mkTfOoABkq0ShigWioOQuzY58FqUWcTH9/H91+GOanwJKDSNKYQNlhVokuO/ibuy1bc1dDfESPlakMpVV2UFlKhB3te+oNJrsXASgIigyXexdi0BYOxGf7jxXW7j8BW8hClRpCLBDtJbrufBFix+bspex+0pn+/qa796jx1lx/wRnzpticEl128Dd3W1aOzIX4aMbjwyy1AzlvKI2WUX9zaw2ByUhISBiemJj4mOI49f11od6XlJT0U/Xla9dee+034+PjE/x/l+FKyYNMPodkzLcD963YDgsslPA3VMBALBCznx4JsWPpkCnsftKZ/v5en74A4qPJ9w2wtGwf9M757DXsPjPL39xtQdUAXmxx2b6jO47AxpvRZPciAB0GJfi6K2GXR9+rr99VIrAo1HvV76rVe95XXNu1a9dr/H+XnuwehhiwdPudTndxBxcnkEpnIXzU0V4m1AJBJygRtsz67Qh2P+lMf39TWh2Ej8zYyxQpUXtnKU0Ot8/M8jdnO9oPHN3dD+KjjVmLLLXl3OkLEDuIOxcaS3YvAtBhUGJupBKBL/h+ViKvpYP39g71u/Gu1F+jBm39kXr2QOcELhls/WlG1AKxZepyiC3tYrZV7435nPT3N6XVQfjIjNOMkRJ1en6eO43dZ2b5m7MdVMcbtf7sWVJqqS0kZieDkt2vHTvPsL/N1iACRijBN13xKb+fz9Mj3mDvVQIwMz4+/gH19c1u3brd4P+7cbc+9yPUBDxcvK994AmNMbfnGxD/0N24UJ/5/vufLRD01UxbDhTthAX8hqMN7L7SlT5/t55/F+YfSgNktV0bMkD5M+/ppxbW37H7zai/zZ7fkZIebaLG2/Fd1Zbbs+AFTLL7hS+lG/Y3WpMILIQSc7kJCQm9/H5u7dq169+GePtV9M8111zzLSUUK/x/MSjhgb/xuFL/ghi0B5ZsbhMYw5//+39gSVJ3z1truT2XTp+DBfzTu6sst8dpuFjbCPPPmb3VlttTtRZ3wfH7dz+03B6n4UgR7qT2Hz76veX2bM5cCLFl2kOvGG4bUI4IrIb3EXAfv58vBntffHz8o+p3k70/Xq0E4B8C36MGWCNi0K5Jm8t+pas7Tx8+BQuQB9aWd3jFSDD7DkFrC25j/vY5a9j9pSt9/t6/EnfgqPHYWcvtOlZeBbOH7l5x+82ov7nvAFK6MIRvsu8fyGJP2fz1sPF2vqHVkL9BUkTAASXqbqa7gPR9XFyc0nWJG+h7JQrj/d+nBOBd6ve/oO+vv/76H6r3bQ38W55k9xbEgKXb1tx7XXTngbW7YAHl1MGTHe4ZIdBXs22iAu0Ie1aP0ntjPid9/kYlT6b0P5QGyGq7musvwuaP0Y35dvA3Yn5HwoL+mRDfUN1xDnuqSith461mZ/Q5NMnPVugSgYVQYs+jROCT3j1+lN7lKiXwGtTr3w543wt0t1D9bmzgKWCCx5U6DTFgpz38Knug051UyxLhm86SpCIXiEUDQRvzU60/ZeoU+vwNK5/2NE/5NNqYn43amD/O2MZ8O/ibWwCiTmlT3XEOe87W4ra47C7cYsjflgkTgV5I754yADVoLzRLjVYjXD58OsQvuU90nCQVuUCgNuabkTE/Vunz98xewyG+Wf7GdDbb6G4QwiYq/cXtN6P+5hSAyDyNO+auY7EJmdbGSHUtEYCCkEi/xX0vaiLWVdSyBzudiUqcvOS1yZ0GDNQCQfVgUeONcnFx+0xHkp//989/bsu843mIX0qmLWezreiduRCbpmr8hMMOApDWBlQcOLxpP5tdeSnvQGwq6J9hyN/cOkNgU4x3Pf0D1ESsKCpnD3a6Elk6rXjS4k4DBmqBoHqwqPFWU3aE3W86sn2zeBNuvxxnHNiRh9uY39J0md130fqbWwBWrC6D+aWhppHNLkoSjrCJ8nMa8Te3zhDYFGldulytBtifEIO2NGcle7DTlRTEUAFy3/LtnQYM1AJB9WBRdtHdRW6/6Ujy86nywzC/nKysY7PtyJYDMLuO765h9120/uYWgNCk8CEqHFlBKhOIGm8Xmq5E7W9unSGwMTyu1OOIAbvyzRnswU5XUsF5VCCp3Xu804CBWiDaM+b/qj/ELiP7ZGKZ5Od9BRsx4+22Pm2tLe+z2dZ4ogk2j/Yu3cruu2j9zS0AYWUhn3yTtW/p8TNqvJ3Ycyxqf3NrDIGN4Ul2FyEGLO2H4A52uhJ6JXmu48M56AWCTuwi7KLSX9x+05Hk5w1jMXvlZjw2lNW2K5c/bpt4V1+IbcVZhey+i9bf3AIQtb952dCprH3bUHMWFrejveAQASjoEEoAZiAGrJzMjJ6ovSTTewwOK2AgF4jVo2ZjbHt0CLvfdCT5eeHzYyA+KRyUxW7f3OdGQWxb/MpEdtui9TenAETub948ZRlr30L3bkd5wSECUNAhPK6UVMSAJVIyVu6ApyOp4DzCH5R8NZyAgVwgts9ZC7GNePH8e+y+04+/a5t8DyZ9xcYJBez20VYUhG3cdzejJbcAbDiGu0u2f+UO9v6d88zbENsKo7zgEAEo6BCeW1OSURPyWHk1+4TUje35pEALcjj75NALBHJ/o6QeipxNdc0wf+xeXMJuX2nuKox9zPsboyW3ADyypQI23mr3n2Dv3xUjciC25fzm9aj9za0xBDZGmuu5f0ZNSF03SnOyqe48bkEOI6M8eoE4U90As4/SS3D7TzdWbzsI84cdLgAr1++G2XeyMnRJRbuSWwAiU/PYofhA6QzcBUc0TzhEAAo6w1UZrtSPEYN2Uyc554RfZfVW3IIcTk1J9AJBaRooXQPCPkovwe0/3bhzIegEcDIVsb/Ebt/pI/Uw+3TMdcotANekYQ4cGcmVZyaRFxzRPOEQASjoFB6X+yBiwC4dMoV9QurGsvkbYAGk+UxrWAEDvUBQugaEfZRegtt/unHduHkQX0x5YCC7bcRLFz9sy7zdeVVOoiW3AFzw4niILwpejr5ahpmsB15wRLPHUQSgoFMoAbgYMWC58zLpyLVj8lgXZCsWiGWvT4HYOPupkez+041U1xbhC1rouW3zEVbnWMMLDm4BOOXBQRBfrBu/gL1viZdbP4KVVdycvTQqf3PrC4HN4UlOGY0YsHQkno7Gc09KnbgQdIUc7oJsxQJB6RoQNn5WCUDGWySc+tArEF/Qoz5u23xcOiQbYqOOFxycArCl8RLED8Ty/GL2vvVx1m9HQGykcRyNv7n1hcDmSHe5n0RNTMrGzz0hdSLdqYMsyGPywg4Y6AWCHmWgxhslY+X2oS5sOXsZ5oeyeevZ7fNxc/YSiI3cpceiIacApPJ5qPFWve0Qe9/6SAmpETbO7Dk8Kn9z6wuBzZF+a+rPUROzautB9gmpC883tOIW5Pkbwg4Y6AWC0jWg7KRyTNx+1IXIBbmqpJLdPh/3AS84zhxtYLcvEnIKwL3LtsL8QNkTuPvWR1St48zb+7TvaY3U39z6QmBzvJHc41uoiWmnW/N2J6XNgC3IYQpxKxYISteAsnPH3HXsftSFyAXZTnf+5YLjC3IKwOJJiyE+mHh3X1tVnaoo2gkbb6cOnYrY39z6QqABPMnuVsSADSf5sPAzUp4+VOA4W9ccdsCwYoGgsnQIO4vemcPuR11YPLEQ4oOsX77UXoeX2z4fLza/B5tXVNmG275IyCkAl7w2GeIDKvfH3a/+pPyQqPF2YO2uiP3NrS0EGsDjSi1HDNhFAyewT0hduCEjHxI0Jt3dL+wrZKsWiIL+GRBbFzw/lt2PunDxq5MgPpjz7NvstgVy+q8xFxyrR81ity0ScgpA2sOG8AGV++PuV39ShRh6XIuwtWT6ioj9za0tBBrA43LPRQxYXWtmcnDRgAmQoJGX8k5EAcOKBWJ9+gKIrdn3DbDV4yA7M/eJYRAfUDksbtsCiZpb81LT2G2LhFwCEJmPkapvcPdrIGc8jplbkaYeEgEoCAue7qlDEQOWSthEunE1Vom6S7HqrZkRBQwrFojygk0QW4nhJLyOdbZe+AB2l8KOCzLs7vq9L2t1wcElAJEJkisjfCxqBVGPu+c881bE/ubWFgIN4ElO6YGaoFSOiXtC2p3IgxHbZhVFFDCsWCCObj8Ms9cONWjtTtpMHksLMnJ/bdOpFnb7wiWXADy4YQ+s/yM9GGEFN6EOvNwV2YEXEYCCsODp7r4BNUEPbtzLPiHtztp9x2EB8lDxvogChhULBC2aKHt3Ly5h96fdSSItlhZkqoONsvfodvvkoOuMXAKQLkIh/X9bn/a72dz9Gsh9y7fDxlvTyfBT3ogAFISFtBt7/rXHlfoXxIDV7aQcB/evKoMFjEhylVm1QNBV7KR7+kHs3ZBZwO5Pu7M0ZyWk76PJVWYFaVsAan7plOqKSwDSNhRE39t1j3ntXtwFfU3ZkYj8za0tBJrA43I3IAZs0Tv2KQtlV9LpLkTfR1qtwMoFYp47DWJz4aAsdn/anXRQA9H3dLCE27ZgpAsOOiCEsHnduPns9oVLLgEIm+uvTGTv02BEVtmJ5AmHCEBB2FCDazNiwC60UWF4u5JSGSD6fvbTkdUrtXKBiLW7AnYipWpB9D1tfue2LRQpRRDC5vy+HnbbwiWHAGy/23/vy5C+3zjBvnf7s+/HlPWk/J2R+JtbVwg0QYbLPRUxYKc+/Cr7ZLQ7KVULou+XDY08bYBVCwR0X1DL++w+tSspSTMla+ZenKwmPYlA2Eyn97ltC5ccAvBcjO73nZc6BmLz0iHZEfmbW1cINIESgP1RE/XCuXfZJ6SdORn0eGpz9pKI2mHlAoE8GUjZ+Ll9aldSmTZUv1N5OW77QnFH3nqY3bpccHAIQNqzhup3O5/4Rz3hmPXkmxH5m1tXCDRBxq2970FN1LqKWvYJaVeeb7hkmwXZygWivuoMzO4Da8rZ/WpXVpVUwvr9+O4advtC8ciWAzC77XjyORg5BOCuRZth/W7nnJ+UDxNhcySlFkUACsJG2k29v4+aqFQgm3tC2pUn9hyDBchIr5CtXCAut37UlnkHpjpASU5kJZNiiXRqFTXeWpous9sXig01Z2F2091sbvvCIYcARCXhtnvVn4qicth4O1t7Lmx/c+sKgSZI69Llak+y+4+yIFvLfSt3wALFudMXImqL1QvEzF6Y+qArhtuvHJlduN6zENLndt/rS6fhURccuqS64hCAVA8e0efzbV73m556oeJ6uLknRQAKIkKGy30MMWDtVrDbTtwydTkkSEy6u1/EV8hWLxC0oRlh+9znRrH71a6kNDmIPl/4Ujq7bZ1xZk/MBceaND1SXXEIwJxHX4f0edHo2ez92RFp3zvCbiI9Vg/X39yaQqARlABcjRiweSmj2SekXUl3q+wigqxeIDZNXgKxPRrxGyvMfeKNmBVBi1+ZCLE9v6/9xS/R6vlNh2NQIkiHu65THhwEsT3c9DciAAURIT05xQNZkDUrmm4l83qPhgSJ5W9Mj7gtVi8QyJJJzfWRPf6OBcb6Y1DUfrRpPV5jty0cWj2/T1bWweb34U372fuzM6JyT4abb1MEoCAipLvcblmQrSMySermKcsibo/VC4SdDsDEAhtqGmH9rcNBiPL8TTD7dUgFY/X8PgCsOR1JiUsurh41C2L7zF4jwvY3t6YQaITx3VNdsiBbx+b6i7AASXfXIm2P1QsENAXO8m3s/rUbkSlgdEiFUrX1YEzbb/X83pq7GtLXkZa45OLWmUj7O08FIwJQEBHSbnrqGlSA3LO0lH1C2o2UNw3V39HkZOPYJI5Lgr2U3b92486FuBQwOtwBazyOS4J9cL3974BaPb9Rd8AiSYbMyUrgHVAay+H4m1tTCPTCVRnJ7g8RA7Z40mL2CWk3QvfARZEklUMAosrgLR8WWRm8WCAqBcz0HnqUQ6O7RnT3BNEH22avYbevM1o9v1F74CIph8ZJ5B5Iupsdjr+5BYVAM3iSUw/E8qS1krRPD9HX0R664RCAlCII0QeSCuarRKWAye/rYbctXKJyTxa9M4fdts5o9fye+tArkL62c81pf15sfg9iP5H2s4bjb249IdAMHpd7EWLA6nLb3krSSV1EX9PJ4mjawyEAS6bZJw+i05n7xDBIX68Zk8duW7hc/OokSB8sfHE8u22d0cr5jcyDt3txCXtfhstpD78K6QM60R6Ov7n1hEAzeFypbyMGbLgbV2OJdJcK0dfRVsLgEID7gZVQ5OT5F2wvvXd77KaA8XFDZgGkD6Y9Yv9UMFbO77oDuMefR3ccYe/LcEkXBog+KHxlYlj+5tYTAs2QfmtKL9TEDWfjaqywPQXM3f0g/UzVRaJpE4cAPLFXUsFYQWgKmI172e0Ll+UFuFQwF8+/x25fR7RyfiNTwJyta2bvy3BJWwMQfUAJ3cPxN7eeEGiGdJf7Z6iJW1VayT4h7UKq04vqZ6ovHE2bOASgpIKxhke2HID18+nDp9ntC5fVwFQwJytPstvXEa2c36gUKFm/fKntymV9niTR4SBEP1BC985S4YgAFESMtBt7fhMVICkNBfeEtAvp7hSqnynBcjRt4hCAREkFg+fOBRth402HFDA+Np7ApYKpXLeb3b6OaOX8jvUUMD5SeiDUeGuoOdupv7n1hEBDeFzuC4gBuz59AfuEtAv3LtsKCwx0Vy2aNnEJQEkFgycsBcyv9UgB4yPtQ4algplVxG5fR7Ryfi94YRykj3XLJkEJwlFxnhK7d+Zvbi0h0BAeV2oZYsAuGjCBfULahZuzl0CCAt1Ni7ZNXAJQUsHgWTgQlAKmnz4pYHykUlqIvigaPZvdto5o5fyGpYDJ0iMFjI90dxzRD8TOnqiJALQBEhIS/oa7DZHCk+yejRiwOb95nX1C2oXLhk6DBAW6mxZtm7gEoKSCwXPG45ICxsclr02G9MUCm6eCsWp+X2iWFDD+pETpiL6gu/qd+ZtbS8Q8kpKSyrjbECk8LvcQyAS+rU9b64UP2CekHTjnmbchQYHupkXbJi4BKKlgsESmgNkxdx27fZFy44QCSF9MffhVdts6olXzG5oCZvth9n6MlJQoHdEXdFe/M39zawlHIzEx8VPFv3TA9t9ztzNSeLr3fhg1gXU6MYgi3ZWaeHdfSP+WTF8Rdbu4BKCkgsHyzNEGWP8e2riP3b5IuWvRZlh/0N0vbvtC0ar5jayBq1MKGB/pLjmiL+iufmf+5tYSjoYSdxXXX3/9D0KxmwK9h7udkcJzc+8k1ATWKWcYik2nWmABcv+qsqjbxSUAoalglm1l9zc3j2ypgPWvjhd01dsOwfqD6r9y2xeKVs1vSQHzZdJdckR/0F19urvfkb+5tYSjkZCQEG/Ge+yGl2666esZye7/RQxanaoGoFhTVgVbgGr3Ho+6XVwCkCipYHCEpYDRdEtH44lzsPlHd7+47QtFq+b36lGzIX2rWwoYH+kuOWq8nalu6NDf3FoippCYmPi44gbFTd26dft7Jf48Oh4CIWS43PWIAatD0XQ09ywphQWElrOXo24XpwCUVDA4UvolRN9Of3QIu23RkO4iZd35IqRP6O4Xt32haNX8RqWAWTJYrxQwPtYfqYfF+8ObKzr0N7eOiBko0fdGUlLSISX4RtBXek19P0B9P4+7bdHA43JvQgxYu5+Us4LFkxZDgkH2/QMNtYtTAEoqGBwXDZwA6VsdU8D4SHeTEH1CCZC5bQtFq+Y3HYZB9O3GrEXsfRgNL138sC3z9j6QPimbv6FDf3PriJiBEnp71Jev0/dKDO70e30HW6MMwJPsnoIYsJQfintCcnPZ61MgwWBe6hhD7eIUgJIKBkdUCpi1GqaA8ZHuJiH6hO5+cdsWilbMb2gKmMIt7H0YLSkFGqJP1o2b36G/uXVEzEAJvb1+35f5fb+Pp0XG4HGlvIyayBearrBPSE7OfnokpF9Xjsw11C5OASipYDCEpoDJ0y8FjI90NwnRJ3a+wLViftMhGNQ8Prr9EHsfRsuC/pmQPqG/25G/uXVEzCAxMXGW4tL4+Pi71NcDird4X5vJ3bZokN495W7URK7df4J9QnKxff/RL1+C9GtpzkpDbeMUgJIKBkPaJI7qVx1TwPhId5NQ/XLhnD1TwVgxv6EpYGrPsfdhtKQ7dYg+6ai4gghAC3Hdddd9Q4m92YqfePP/fZKUlJRLr3O3LRqM/0Xq91ATuWJ19KlKdGdT3XlYgKwo2mmobZwCUFLBYAhNAXOknt2+aEkJhVH9UldRy25fMFoxv6keMqJP6dCOjilgfKS9eoh+ob2FtMcwlL+5dUQs4qr4+Ph/pq/cDTGCtC5drs5wuT9BDFojyYp159EdR2ALj9E7q5wCkCipYMwnauHRNQWMj5RQGDUPD6wpZ7cvGK2Y35ICJjjptC5qvNWHuBATAWgx4uLi/jUxMXG84nz6qoTgv3C3yQg8ye4axIBdMSKHfUJykWpZogKB0b2V3AJQUsGYz3XjJQVMMCK3YmzNtWcqGCvmN2V5QPQp1W/m7j8jhG7FKA6+FUMEoIVISEh43vv4t1RxieJWxT8opnK3LVp4XKmrEAM2r/do9gnJxeKsQkgQmPLAIMNt4xaAkgrGfKJSwBS8nMFum1HCUsG8bc9UMFbMb0kBE5wch7FEAFoIJfSOU+k3/9eSkpLi1OsnmJpkGB6XOx0xYCfdE7upOVDpJ+Y/P9Zw27gFoKSCMZ8zHhsK6dO1Y+ex22aUS4fYdy4iiJ7fF5vfg/Qnkeo3c/efUVqdjkkEoIWgO37BXtc1DyDBc2tqCmpCnzsdm6k57HzXgVsAIlPBxOJ4Qyag1TkFjI/FE+17Nx5B9PyWFDAds3BgFqRvQiVkFwFoIRISEvoovhAXF/d/6WcqBadEYT/FQdxtixYeV+/uqAlds7OKfUJaTWQJqtLcVYbbxy0AJRWMueTYd6QT7bwfF0H0/K5ctxvWn1S/mbv/jHK9ZyGkb6b/enBIf3NrCEfDm+7lL15+GvCz77W/cLczWnhu7v1PqAlN9XC5J6TVpDxWqP404+QhtwCUVDDmkuPkoU5Ensi3YyoY9PyWFDAdc+fCYth4a215P6i/uTWEo6HEXcX111//g1CkPYH0Hu52GsGUBwZCBiw9fuGekFaTHmPYecHhFoBESQVjHiUFTMfE5uS0XyoY9PwuGg1KAfPbEex9ZwarSiph4+3UoVNB/c2tHxyNhISE+M7eEx8ff5MVbUGh4CXQsf7B2ewT0mrSRmZUAKAanEbbZwcBKKlgzCMqBUzOo6GrD+hEaFWeGca3ZJhN9PyWFDAds6HmLCz+H9ywJ6i/ufVDzKFr167XxMXFfd/HxMTE/dxtMoKN4/IgA9YpV3WRcOOEAkhfmlV/1A4CUFLBmMdFA0ApYPrrnwLGx9lPYepyr3prJrttgUTP72moFDAqbnL3nRm8fOmjtsw7MKlgts9ZG9Tf3PohZpCQkHBrUlLSuYD9gFrvASTsy8c8PNEkqgAAIABJREFURprwHy+oCaH/vo5ISFeyiL5c8MI4U9pnBwEoqWDMo6SA6ZxLh0yB9NH8PmPYbQskcn5LCpjwOLPncEgfFb0zN6i/ufVDzEAJvZ3ePX87vS99PT4+/lH18zjWhhnEyR0HYRO74dhZ9glp6eTvNQLSj1R+yYz22UEASioYc4hNAbOe3T6zWDxpMaSPaO80t22BRM7vk5UnYfO2epv+KWB8XPzKREgfLXwpPai/ufVDzEAJvW3er7sCXt/E0yJzcLm+GTaxaVMs94S0inS3k+56IvqRTt+Z0UY7CEBJBWMO66vPwPrx8Kb97PaZRcpGgOqnlqbL7Pb5Ezm/JQVMeNyQmQ/po2mPvBbU39z6IWZACZ8TEhL+Rn3drPik+v7b8fHx96vvz3K3zQj++5M/wSb2zgUb2SekVWw80QTrx8q1u0xpox0EoKSCMYck0lD96IQUMD7WlOFSwdTuO85unz+R8xuVAsZpW4XKCzbBxtvF8+99xd/c+iFmQImgldh7UX3tnpiY+JF3L+CfqEYwd9uMgALG9B6DIQOWTilyT0irWL0V9yidMvCb0UY7CECipIIxTlQKGHqsTI+Xue0zi00ngalgVpex2+dP5PyWFDDhEbsOnPyKv7n1Q0zimmuu+VZcXNy/K/F3LXdbjIICRkE/D2TAFvTPZJ+QVhF65df8nilttIsAlFQwxrlu3HxIH+b8xhkpYHykg0ET7+oL6avSnJXs9vkTOb8XSgqYsAh9ErRu91f8za0fYh6JiYmzuNtgBBQw1o6bh1lMHJJPLBzC9n48/KppbbSLAESlgpnz7Nvs48Aq0sUVog+dlALGxznPvAXpq5Ujc9lt8ydyfksKmPBo5V5wEYBgJCUllYXBD7nbaQQUMMrmr4cMWKdUFAiHsNNf6srbrDbaRQBKKhjjhKWAGeecFDA+LnsdkwpmXmoau23+RM1v2nsGWR+SnZUCxkd6rI3oq8BsECIAwVDi7qRiSigmJia66T3c7TQCChhHtuBqip4+fJp9QlpBXP6nOaa10S4CUFLBGCMyBUzZPOekgPFxEygVTPZ9A9ht8ydqfksKmMgIywf7/Niv+JtbPzgaSuA9bsZ77AwKGA01DbAJHqyEjdNIGeBht/1nrzGtnXYRgJIKxhjrqyQFTCTcsxSYCqbxErt9PqLmd+V6ZAqYJvZ+M5sbsxZB+mrKA4O+4m9u/SDQHBQwrgBL2JgpYOxKSniNCpAH15snoO0iACUVjDFCU8Aoccltn9ms2VkF66/avfZJBYOa35ICJjLuXlwCG28tZ7/IPSkCUGAYvoABe4Q52pwqFnZmVWklbMKfOnjStHbaRQASJRVM9KTHtIi+c1oKGB+bTrXA5uf+VfZJBYOa37QNBdF3VDmJu88QhOae9LvgEAEoMAxfwFj86iTIgDWrjq2dWZ6PSwHT2vK+ae20kwCUVDDRE3Zq32EpYHxsTwVzNyYVTMn0Fez2+Yia35ICJjJCLzhW7viSv7n1Q8wgLi7ubis+JyEhYXhiYuJjVGNYfX+d0fd1Bl/AoOP4iAE75cFBbBPRKm7IAKWA6fHV8j9GaCcBKKlgoicuBYxz83bOeeZtSJ/ROOa2zUfU/KYyZIi+25DprBQwPiIvOLZMXf4lf0e77gsiRFJS0kXF3l27dv1b1GdQlRH1GXnez/uuEndFRt4XDnwBY3fhFsiAJdqtZqbZRKWAye/71QLgRmgnASipYKIn3alD9B0ll+a2DcVlQ6dB+mye2z6pYBDzW1LARMe5z42C9Nny4dO/5O9o131BhFAiaz/VACaxpb7OUyLsTrM/Q/3dkervvuD3mS1G3hcOfAHj6I7YqZlpNnEpYOaa2k47CUBJBRMdJQVMdNw0eQmkz+yUCgYxv2kPMmqeUtk07j5DkYQaos9IWPr7O9p1XxA5rvZ9Q3fdFN/0isIxinFmfID6e9MVn/L7+fy11177zWjfFw4oYLz//u/bzp3C1sykwepEXrmMSwGzfc5aU9tKfvb5m7vfavfhUsEc31XNbh+KZ6pxKWCObN7Pbh+KdDoc1W8tZy+x20dEzO+DwBQwZ080sfcZiqgnHPRo+d13f/e5v6NTGoKIkZCQ8Cv6+p3vfOfvKAG04i7FPyquVpyjuD4uLu42I5+hhGSu+pxefj+3BnvkHO77wkGbF59++mnbJNC+hd3z1rY5FR9dfBcWIE+VH+Y2D4ZPPv5PWL/VFO/mNg+G+j3VsH57v7mV2zwYzh89Deu3i7WN3ObBUFGIOeBGF81/+d+/cJsHw/ESXKqm37/34eefE53SEEQMqvihRFeB+vpfiocUB1533XX/6Ps93YFTIrDS4GfQo90+fj9fNPK+cECDyHfFOPdZzEbpFSNy2K/IUKTHGKiJfvrQKVPbaqc7gMRsWCqYJey2oYhMAXO59UN2+1BsPo07mWmXJxyI+Y1LATOcvb+QpG1PqPFGaWZ8/o523RdECCXufqc4UQmvG4P9Xr3+CD2KNfIZSsjdTHf36Pu4uDj15xI3eP92fDjviwYUMGgwte9beAO/b8FpLC/QIwWMb8+Iv7+5KalgIicqBQzVFua2DclYSAWDmN8LX0qH9BmlHePuLyQpYTNqXaBE0z5/G9EbggigRNiAjn7//e9//x+6dev2/0z4HA8dNlHMjI+PT1AvXaUEXoN6/dudvC8q+AeMLVOXQQask09mbsjUIwWML2DYSQBKKpjIWdA/A9JniwZMYLcNTaengkHMb1wKmHz2/kKTSrch+o5Kzfn8bVRvCGIc/gFjH/Jk5qkW9gmJICqBNl15m91WuwlA5EZpp15w5DwqKWCipdNTwZg9v5EpYOjJCXd/obng+bGQvvMl0BYBKDAM/4BxYi/uZGZNWRX7hESQ9rIg+svsFDC+gGEnAQhNBePACw5KAZNxGygFzPwN7PahSXtDEX1nl1QwZs/vk5W4FDBVDk4B4+PqUbMhfUdrjs/f3PpBoDn8A0ZL4yXYhPftW3ASqZA5KgXMttlrTG+v3QQg8oLjWHk1u31ms/5IPay/Dm+uYLcPzb1LgalgVOzkts/s+V0JTAHTeLyJvb/Q3DarCNJ3mXc8r9aej0QACowjMGBMeWAgZNAWZxWyT0izSUEMFSAPrt9jenvtJgCRFxy02HPbZzYPFe+D9Vd99Rl2+9CkiwJU/9Xu5U92b/b8RgkYumgmAcPdX2hSDEeNt4aaRhGAFuPqpKSk1xMTE4+rrzXf/e53/0l9v9Q/FYyOCAwY81H7FgZns09Is4lMAUMZ+M1ur90EIHEyKBUMVX7gts1s7sjDpYChx8vc9qFJ2wJQ83X/qjJ2+8ye30WjsY8wnc5Th07BxtuRLRUiAK1EQkLCJEr27C0HV0Gvqa8PKa7ibpsRBAaM1aNmQQbsrCffZJ+QZhOZAoY2YJvdXjsKQNpAj+i/ZUOnsttmNteOlRQwRuj0VDBmz+8FL46H9JXTU8D4SGm8UOsD7dkVAWghqPKH73slAsv8vt/O0yJzEBgwts5cDRmwWXe+2Hbl8sfsk9JMbsgsgPQVpV5AtNeOAhCWCuYZ56WCKXhZUsAYpZNTwZg9v6c+/CqkryhucveVVZz+6BBIH1I+UBGAFoLq/nbx1gP2E4Bf890N1BWBAaNy7S7IgCU2njjHPiHNpE4pYIh2FIAlOSsgfejEVDCwFDDjF7DbZhWdnArGzPl9oRlX4nLXos3sfWUVUXk76WJQBKCFSEhISFdibzeVYFNfj8bHx/9Wfd2oOJa7bUYQGDBOVtbBJn71tkPsE9JMzuw1AtJPVH4J0V47CkDaO4Uab00OSgXTeuEDSQFjAp2cCsbM+V13QNYBM0j5NRF9OP3Xg0UAWoyvKfE3Iikp6bQSfZ94v75Br3M3zAgCA8bFZlzyTydd+emWAoZoRwFIpydR481JuSdPSwoYU+jkVDBmzu8D8iTIFNLFFaofL114XwSgwBiCBYxpsvejUzaewKWAofxbiDbbUQAia2buWVrKbp9ZRKaAOVPdwG6fVXRyKhgz5zdqL/hnKWCctRe8Ix7ZcgA23k4dOikCkBv+B0J0RLCAsVBOf3VK3VLAEO0oAInZ92NyT26atJjdNrO4I28dpI8yb38+JlLA+OjkVDBmzm9YNojfjmAfA1ayoeYsbLwdXL9bBKBVUELvwcTExFrFPyn+xctP6St324wgWMCgPWiIAeuk/E/0OBs1sREpYIh2FYDzUsdA+nHZ61PYbTOLa8fkQfooVlLA+EgHgybd3Q/Sl9ypYMyc3+g6trFCSngN2yo0c7UIQKughF694uPx8fEJ119//Q+I3RScdgqYSHvQEAPWSRngdUsBQ7SrAFw5MhfSl7OfHslum1mEpYAZGDspYHyc86wzU8GYOb+nPDgI0kcbsxax+99qog4Lrn57lghAq6CEXnGw1xMSEq6zui1mIljAgJawOXaWfUKaQbqSRfQPPX5HtdmuArA0ZyWkL7N++ZJjUsGg8omtT4+dFDA+OjUVjFnz+8I5XAqY3YVb2P1vNVFrxfw+Y0QAWgUl9O5TIrBffHz8v8TFxX3fR29+QG0RLGAgS9hUlVayT0gzqFsKGKJdBWBF0U7YeGs6eZ7dPqOUFDDm0qmpYMya33UVtbD5eHT7YXb/W83irELMeLt/oAhAq0DiT/EP3n1//nTcHkBkCZvy/GL2CWmU0BQws4pg7barAKzdfwI23mrKjrDbZ5TIFDBUU5TbPqvp1FQwZs3viqJyWP+crWtm97/V3L24BNafnpt7/xO3hogJKKF3JiEh4eddAvL+JSUlbWZqkikIFTCm9xgMGbDrPQvZJ6RR6pgChmhXAdjShEsFQ8GX2z6jPLQRmALmaOykgPHRqalgzJrfpTNWQfqmfUuGw8qBhkPKR4oab+Nvcd/KrSFiAkrorQ32elxcXKLVbTEToQJGfl8PZMAWDspin5BGSZnsURP6ZCUmBQzRrgKQOOUBTCqYYgekgtkxF5cC5nKrMw5lRUKnpoIxa36vemsmpG9mPfkmu++dNt7Su6f05tYQMYHExMShirMUH1a8w49V3G0zglABYw0o7UTuE8PYJ6RR6pgChmhnAUgbmhH9uXSI/qlgYClgHtd/LkZDp6aCMWt+4+ZiNrvvnTbe0l2p47k1RExACb0/JiUlNQWSysJxt80IQgUMuesQmhsnFED6hiqwINttZwGIuusw+yn9U8Hk9wPdjR+o/934aOnEVDBmzW/Y3fiJhex+5+Lc50ZB+jQj2b2SW0PEBJTYWxfsdSUAl1ndFjMRKmDIvqPQ1DEFDNHOArA0V/YdhSIVfkf0TSymgPHRialgzJjfsh8XwxXDc1D9epRbQwg0RqiAIScPQ5PKGSH6pWj0bGi77SwAkScPm+r0TQWDPJG/c8FGdvu46MRUMGbM79p9x2HjzQkn8qNlybTlkD71uFL/kNaly9XcOiIW8LXExMRRSUlJ5xT/x/v4960uAaeCdUOogCG5x4JT1xQwRDsLQGjusR36LjynD5+G9QsVque2j4tOTAVjxvyuWF0G6xcn5OSMlnQ4CNWvabc8o3UxCi2gBF+mEnzbEhISnlFf71Vfn1Vft9Lr3G0zgo4CRs6jr0MG7Lrx+j56ajxxDjaRK9fhUsAQ7SwAodUHNH70dHDjXli/6L4VwwidmArGjPldkrMC0icT7+rrmKo80RB5Z3WcK/Uubh3heCiht7fLV+/2fU29vo+jPWaho4BR0B9Uf3SAvvVHdU0BQ7SzACSi6o9SJn5u26KlHMbC8NzpC7B5zJUKxoz5TYdYEH0y55m32H3OSeTeyoxkdz9uHeF4eAVg2K/rgo4Cxtpx8yADdsZjQ9knZLSEpoBpxqWAIdpdAC54fiykX3VOPyHpmDB0YioYM+b3vNQ0SJ8sGzqV3efcRF3gZnRPzebWEY5HYmLiTMUlCQkJd1I9YMVfKvFXqJjL3TYj6ChglM1bDxmwmbf3abt08UP2CRkNdU0BQ7S7AFz99ixI3+qcgBaWkD2GU8D46LRUMGbMbzrEguiTTQ5IyG6UC14YB+nbDJe7mFtHOB7XXXfdN5QAnE15/7w1gD8h8Uevc7fNCDoKGIc37ccMWMX6qjPsEzIaolLALACngCHaXQBuzV0N6VudU8HAUsA4oCSjUTotFYzR+U2HV1Dxfs/SUnZ/c5OyPCD61pPsPs2tI2IJV8XHx/8zfeVuiBnoKGDUV5+BBYRDxfvYJ2Q0pLtJiP5Ap4Ah2l0AHli7CzbeztaeY7cvUkJTwCwsZrePm05LBWN0fp/Yeww23mp2VrH7m5vbZq+B9K0nOfXPL91009e5tYSjcf3113+HSr+pb69OSEj4G8XRSUlJY6655ppvcbfNCDoKGPSYlh7XIgbtjrx17BMyUtJdpKw7X4T0BzoFDNHuArDuQB1sATq6/RC7fZHy1KFTsP6I5RQwPjotFYzR+b1/5Q5Yf1A9XG5/c/Pghj2w/h13izuRW0s4Gkr8LVWcor79uhJ+Ger7CsWF6vsV3G0zgs4CBh3YQAxYqm/KPSEjJd1FQk1gdAoYot0F4IVmYCqYwi3s9kVKZAqYhppGdvu46bRUMEbnNypZMR22ieUUMD4iL+jSXSkPcWsJR0MJvTLvt1cr4dfSrVu3/+d93bFpYIiLBk6ADFiqb8o9ISMl3UVCTeCTlXXw9ttdABKnPvQKpH83Zi1ity1Sbp+zFtIXmXc833b5UuymgPHRaalgjM7vFSMw5crosA23r+3A9i0doOIK6ckpg7m1hKOhRN9u+pqQkPAr9f0m3+tKAG7na5VxdBYwqF4oYsDS5nbuCRkp6S4SasFAp4Ah6iAAUSfl6PAOt22Rck3aXEhfxHoKGB+dlgrG6PzOSxkN6Yvlw6ax+9ouRBVXSO/unsWtJRwNJfqmK7G3RX09HxcXdzed/lVicLD6eQN324ygs4BB9UJRooeuiLgnZCSku0iIfphqQQoYog4CcPUozEk5qt/MbVukhKWAGSQpYHx0UioYI/ObxPDke/tD+mJz9lJ2P9uFBf0zMeupy72DW0s4HXT6934l+G6hH5T4+7YShClKDCZxN8wIOgsYtFkcMmAVaU8E94SMhEsGZ0P6wYoUMEQdBCAdhkH0MdVvpjrO3PZFwuk9JAUMmk5KBWNkfp9vaIXF+b3Lt7H72S6kMqiQfnaltnBrCYGG6Cxg0GZxVGCgU1HcEzISolLA0F0vK9qvgwCsBKaCoTrO3PaFS0kBYw2dlArGyPw+vrsGNt7osA23n+1C5BO1oT957u+49YRAM3QWMKheKNUNRQxY2uTOPSHDpe4pYIg6CEA6DIMKkFTHmdu+cIk8MVhVUslun124d5lzUsEYmd/7VmyH9UNz/QV2P9uFNPdQ/Tz25md/yq0nBJohnIBBm8YRA7bonbnsEzJcQlPArN1liQ06CEA6DIPqZ6rjzG1fuETmDGuoOctun13opFQwRub3lqnLIH0w6R5JAePPhmNnYeMto7u7J7eeEGiGcAIGbRpHDNiFL6WzT8hweXT7YdjEtSIFDFEHAUikusiIfqY6zty2hUtJAWMNnZQKxsj8Xj58OqQP5j43it3HdiLtQ6b9yJAx50p5i1tPCDRDOAGDNo0jBuy0R15jn5DhEpkChhIgW2GDLgKQDsUg+lmnVDC4FDBvsNtmJzopFYyR+U1CDdEHJCy5fWw3UkYC0FpSwK0nBJohnIBRnl8MEz8Xz+Pz35nB4qxCiP1WpYAh6iIAUUXTZ/bSJxVMft90SB8UvjKR3Ta70SmpYKKd3+0i+B6MCKZHy9z+tRtR2SQykt0V3HpCoBnCCRhVpbiNqycrT7JPSM5JS4mPrbJBFwEoqWB+3zatx2uQPpAUMF+lU1LBRDu/m+svwuI7HS7h9q/dWDwRczPB40r9gFtPCDRDOAEDuXHVihq4ZhB1296qFDBEXQRg5frdsPHWeKKJ3b7OiEwBQ3fzue2zG52SCiba+X1811HYeKP0Mtz+tRv3LCmF9bfn5t7/xK0pBBohnIBBm8ZRG1etSoFihJQKB2X/1pmrLbNDFwF46uBJWICs3nqQ3b5O7UemgCmVFDCBdEoqmGjnNyVqRtnffKaV3b92Y83OKlh/e1y9u3NrCoFGCDdgzOw1HDJgrbwDFi3PVDfAJqxVKWCIughA2heK6u/ygk3s9nXGg+slBYyVRKaCObH3mGV2RDu/qVQbwnYqLScpYL5K5Mlzz62pKdyaQqARwg0Yi1+dBBmwVu6Bi5aHivfBJqxVKWCIughAIp0QR/T3hsx8dts6o6SAsZbIBdnKPXDRzu/lwzB7IPNSRrP71o5EHrrxuNzp3JpCoBHCDRgbMgsgA3bqQ6+wT8jOiFqQM27r077fyyo7dBKAlCMS0ed0IcNtW2ekBOkI22f2HM5umx2JTAVD+wutsiPa+Y06Bb1iRA67b+3KvN6jIX3ucaWu4tYUAo0QbsCgKgoQEaR44Zw1efCiJT2mRtid85vXLbVDJwEIE0G97C+CUOJXUsCEJkoELR0yxTIbopnfJH4n3t0XYnvJtOXsfrUrSRwj+tyT7K7h1hQCjRBuwKA6qogBS6yrqGWfkB1xfp8xmAV5YJaldugkALfNXgPp889Swdj7MSjdFUfYviHD/o+/uYiqhGFl7slo5ve5Uy2wuL5/5Q52v9qVlCQc0u8u9ydpXbpcza0rBJog3IDReAJXC/fAmnL2CRmKdIU8+b4BmAXZ4v1oOglA6EGIY/Y9CNFy9jLM7vJ8+x+A4SJqQW7fd9lqzQVHNPPbKQdgdGPF6jJYv4//Rer3uHWFQBOEGzCuXP64LevOFyEDtjR3FfuEDEVkklQqL2elLToJQGgqlBL7pkKhvGkwuyUFTEhWFJXD+r2++owlNkQzv/cudUYKHN1Yu/8ErN/Tu6fcza0rBJogkoAx68k3IQN21Vsz2SdkKCJzNtWUVVlqi04CEJkMuWzeenb7QhG5INNdfG777Eo6jY/q94Mb91piQzTze9NkZyTB1o0Xmq7AxpvHlfIyt64QaIJIAgaqHBrtseOekKG4e3EJbKJS+gkrbdFJABKn9xgM6fc1aXPZbQtFVM3piXf1bb+Lz22fXdl+wXFbH0jfW5XsPpr5vWzoVIjNVpfB05Govb6eZPcUbl0h0ASRBAzU4jTlgYHskzEUUelvOJKk6iYA8/t6IH1v59yTqHybc58bxW6b3Umn8hF9v/rtWZa0P5r5PfupkRCbV745g92fdueCF8dD+t7jcm/i1hUCTRBJwEDeDWtpusw+IYOxcFAWxN55qdZfIesmANeOmwfp++z77XvBMePxYbIgM5FO5es81yOd38gSnyU5K9j9aXcWvTMH0vceV+oZbl0h0ASRBIyjO45ABiyxdu9x9gkZjDMeGwqx16q7Av7UTQDuXFgMG2/nG+xXo7T1wgdtmbdjHkOWzrDvQSu7kE7lI/p+0r0vW3K3P9L5jSxxSadcuf1pd8IKDCS7/zftxp5/za0tBBogkoDRVHceFjCsLJkULp2wL8ifuglAZO5JSn/BbV8gkSefK9ftZrfP7oTu9z3VAm9/pPP70EZciUs65crtT7vz4AZcqqtxyc/+kFtbCDRAJAGjPRXML1+CDFg6jcY9IQN56uBJ2AS16mSgP3UTgE0ncRcctNhz2xfIA2t3wew9ffg0u312J/LEPz09Qbc/0vlNF6Eoey82v8fuT7uT5iSq/8ff6n6EW1sINEDEm4afxmwaXvLaZPYJGUjkglxfZU1uMH/qJgCRRdOtTsIdDktzVkJspcfKly5+yG6f3YnM+UmlNNHtj3R+U/othK3THx3C7ksdSFs+UE+Y0l0pr3NrC4EGiFQQLB82DTJgc58Yxj4hAwlbkC2sDuBP3QQgkdJJIHywaOAEdtsCuWI4pj5obs832G3TgciqP+s9C+Htj3R+56WMjpm5ZVeiTp5nuFLncGsLgQaIVBBQgW+IKLq9T/sVEfeE9CeqYPfMXsNZ7NFRANJhGYQP7HiXYs4zb0NstePddbty/vNjIT4o6J8Jb3sk85u280y8uy/EVjveXbcrFw2YAPFBRrJ7J7e2EGiASAUB1e3FDNjU9j133BPSn5Q7DbIgD85msUdHAbht9hrYeLPTPiXo/tpJi9nt04VFo2dDfDD914PhbY9kfp+txdV2t+P+WrtyffoCjB9cqRe5tYVAA0QqCJAnFakeJ/eE9LH9CvkuzBUy14KsowA8VIw7qVhXUctun4+Nx5tgdu5bvo3dPl2IS82Bv+CIZH5TXWiUnXY8YW9XIlNdpd3Y85vc+kJgc0QqCGgzOSpXGT1e5p6QPp6ta4ZNzL1MC7KOAhCZq2z/yh3s9vl4ZMsBmJ21e4+x26cLD2/aD/MD+oIjkvldNn8DzM7zDZfY/agLkUJ8bPfe/8atLwQ2RzSCIPeJNyADdtnQaewT0sfqrQdhE/PEnmMsNukoAJHVCjZnL2W3z8cdeeth4+2CTavs2JENNY0wP+xfhU2OHMn8pnrYCBunPDCI3Yc6EXnnX/G33PpCYHNEIwhoDxtiwM568k32Cekj8tZ8y1meBVlHAUikcYHww9IhU9ht87HoHcyCPL3Ha9r5m5PIC44tU5dB2x7J/KZ62AgbF76Uzu5DnXj50sew8ZbR3T2KW18IbI5oBMHm7CWQAcuVHiUY142bD7Fx6kOvsNmkqwCkO8MIX8zsNYLdNh9RC/KSQRO08zc3URccy4ZOhbY73PlN6W6yQelu1o6dx+4/3Ygabxmu1EJufSGwOaIRBPtW7sAM2GSeBMnBmN/PA7Fv4Yvj2WzSVQBumQpKPWSjC47s+wdCbCydtEg7f3MTdcGBfsIR7vxGJrzeuWAju/9049IhmCdqHpe7kltfCGyOaAQBbWZGBZCD6/ewT0jitEdeg9i3Zkwem026CsCKop2w8VZ/pJ7dvvMNrTD7Dq3app2/uUmPahGJzH82AAAgAElEQVS+oEd99IgZ1e5w53dNGa7kHdXv5vafbiyetBjiC0+y+yO1xF/FrTEENkY0guDi+fdgAaQ0dxX7hLxw7l2YfWXz1rPZpasAPFlZB/OHHS44KG0Gyr6mgye08zc36bAGyh9njjbA2h3u/KaydLDxdvI8u/90456lpTB/eP6t57XcGkNgY0QrCHIexZSwWfnmDPYJWbvvOGxCUroPLrt0FYCtLe/DamZuzV3Nbh8lzkWNt99d+UA7f3MT+YSD0syg2h3u/KaydAjbqG437S/k9p9uRF4Aju+e6uLWGAIbI1pBUDgoCzJg5zz7NvuERO5xpGP/XHbpKgCJMx4bCvGHHS44NmQWwBbkTz/9VEt/c5ISNqPmPyWaRrU73Pld0D8DYtu81DR23+nI5voLsPGW7nK7uTWGwMaIVhBszFoEGbBUDouOxnNOSMoP50TbdBaAha9MhPiEyv2x2zYQczE1z/2Otv7mJpVuQ/iESs2h2hzu/J7WA7O/efWoWex+05F013TSvS9DfJKenOLh1hgCGyPaBQK5b6Hh2FnWCbns9SkQu+Y88xarXToLQNQFB5X7o7J/nLbl/AaznWLVWzO19Tc3C/pnQnwyv88YWJvDmd8Xmq7A4jby7qbTmZcyGuMXl3s1t8YQ2BjRLhDHd9fAAglyn0w4ROVlWv7GdFa7dBaAyAuOxhPn2OxC7m/cNqtIW39zE7VPbvJ9A2D75MKZ3yf2HnNs3NaZtBUF4heX+xi3xhDYGNEuEC1Nl2GBhPNKElkJgLvWsc4CEHnBUVVSyWZX3QHcCedDG/do629uIk/KUh4+RJvDmd9UhxxlV0MN75MbnVmSswLiE0+y+49pXbpcza0zBDaFkQUClSuPcy8JpWlABUjKZ8cZZHQWgFQ+D+UXztQ8yByHZ6rPaOtvbh7dcQTml5qdVZA2hzO/iycWQmzKuvNF9r3bOhMZB9Ju6v19bp0hsCmMLBAFL4NOk7n5TpPRYwzURKS7PZxBRmcBSKQyegi/rEmby2YTssrJlUsfae1vTp471QKLA7sLt0DaHM78XvzqJIhN3PubdScy9VDGrb3v4dYZApvCyAIByyd1N18+KXr8jJqIlECbM8joLgCp0DzCL1SHl8um5cNwdY519zcnkSczN2TmQ9ocjr9nPD4MYtOK4TnsPtOZyOIDGS53f26dIQgTCQkJwxMTEx9THKe+v66j9yYlJf1Uffnatdde+834+PiEaD7PyAKB3Cdztq6ZZSJSmgaEPdMfHcIeZHQXBFRoHuEbqsPLZdPsp0ZCbFo6ZIr2/uYm5bVD+IbS/iDa25m/kQeOSnNWsvtLd059+FXMeupyT41KjAishRJ83ZWoy6Pv1dfvKhFY1NH71e+r1fveV1zbtWvXa6L5TCMLBLKmZNXWgyyTcP7zYyH2LBowgT3A6C4IqNA8arw1n2m13B7kgaPN2Uu09zc3V789C+IbqqKEaG9n/j5ZeRI2fyrX7mL3l+5c+OJ4lH82R6MNBBZDCbmRSgS+4PtZCbyWTt7f2+hnGlkgaNFEBZSy+Rssn4D02IfSNCDsocfl3AFGd0FQrS4KUOONyjFZbU9DTSPMHqpmo7u/uUlpdFD+obtxZre3M39XFJXD7Dl9+DS7v3Rn0TtzIb7xuNwNRnWCwAIowTdd8Sm/n8/T491Q71cCMDM+Pv4B9fXNbt263RDNZ1LAeP/9z4JHNJzywEDIoKWN+dG2KVqeb8AJWnpcbrU9gSQ/G/U3J8+dPA/zz57FJZbbAz1wtP+49v7m5qGNe2H+OVVZZ3p7O/M3paFC2JJ5+/Ntl1s/ZPeX7kTtP/e4Uv+SdmPPv45GHwgshBJyuQkJCb38fm7t2rXr33bwX66if6655ppvKbFYEc1nthnE4gGYk8CFL3uMNi1inD96Ghbwmw7XWW6P00B1bSeDNuZvm7bUcnsOLMHtof3THz6x3B6n4f1m3AVh7bYDltuz5q1ciC1znhxhuS1OxOlduNRDnu7uqG4QCUyGEnW3k1hT3B/AIrqTpwRgH7/3Xgz1d+Lj4x9Vv5/s/fFq9f//EE17aOAZuUOwdmweZMBm3zeg7d13f2fpFdieJSWwCXjudAv7FaYT7ghRfVuEfwoHTrDcFtiBox6DHeNvTlIaHUqng/BRyfTlpre3M3/PfgpT4WjpkGx2XzmB9VX1sPXHk5zSIxp9ILAQStDdTHcB6fu4uDil6RI3+H6nhGG8/3uVALxLvecX9P3111//Q/XerdF8JgUMGnzR7luAbsyvv2DpHoyNEwogdky6hy+tjT/Jz0b9zU2qb4vwEccp7XmpYyC2FPTPcIy/uUnpdBA+QpSF7Mjf6ANH3H5yAi9d/BB2StvTPXWoEW0isAhK6HmUCHzSu7/Pl9rlKiXwGtTvvh3w3hfojqH63ViOU8DE6m2HIAOWWFN2xNIJWPjKRIgdeSnvsAcXohMEAXJj/sVm6/I0th84+lV/iB2+A0dO8Dc36e4WwkeIxMkd+bu++gxs3tCBI24/OYUzHhsK8ZHH5Z5rWJwInAejC0QTcGN+ecEmR0w+umvFHViIThAEhzbug403ysZvlR3nTl+Azxsn+JubdHcL4SNE6bSO/H0QeKDFynnjdC4aOAHiI48rtZxbawhsCKMLBDJj/rrxCyybeK0XPoDdft86czV7YCE6QRCcqcbVat5v4Z0MuruNsoPq2DrF39zct2I7zE8Nx86a2taO/A29c85c4chJRFXX8iS7W7m1hsCGMGOBQO1lyu/rsWzinTp0ChYgD67fwx5YiE4QBNi9TEstswNZRYfuLjrF39ys3Xsc5qcjWypMbWtH/l45EnMC2A4VjpzE8vxizHhzuT/l1hoCG8KMBWL1KMxpRiqNY9XEo0z2qEB/+kg9e2AhOkUQzHoSdZpximU2oK70J9/b//MDR07xNycvNF2BxYUdeetNbWtH/s7rPRpiAz2y5PaRk1gFTHbPrTUENoQZC8SOuetgg7al8ZIlE68kZwWk/ZQklU53cQcWolMEwbKh0yC+ohOfVtlQ0D8TYgPdjXeav7k57ZHXIL6iyg9mtjOUv69c/rht4t19ITZsyCxg94+T2HiiCbaWcmsNgQ1hxgJBjzJQg/b4rqOWTLwlgzGn/XKfeIM9qPjoFEGwZSqoosEdVNHgI0tsoFx9CBtWj5rlOH9zM7+fB+KrBS+MM7WdofzdeOIcLD7vXlzC7h8nkQ4GYfbUuz/s4i0cIRB8DjMWCORVy54lpZZMvOm/xizIS16bzB5UfHSKIKhYXQYbb/UWPK6/0PwurP1UTspp/ubmunHzIb7Kvn+gqflBQ/m7qqQSNt44amg7nZQj0mw/eVzuZdxaQ2BDmLFAtD9iuEvfRwzIGsDFEwvZA4qPThEEdQfqYP6y4sBO7f4TsPZTfWGn+ZubOxeCNuYrnjvVYlo7Q/m7bN56WPvPN1izRSeWSNkIzPaTEoDPcWsNgQ1h1gIx97lRkABjxSbjauDG233Lt7MHFB+dIghaW97HpezJxafs2QcI8D6eOdrgOH9zE5nsvqq00rR2hvI37TVEtH3Kg4PYfeNE0r53c5PEuz9M697zH7m1hsCGMGuB0DnNAD02QwV4Si/DHVB8dJIgyPnN6xB/rXxzBrztmyYthrSd0uNQmhwn+puTTXW4ZPf+j+yNMpS/Fzw/FtL2hS+ls/vGqdy7bKtpfvK4UlK5dYbApjBrgaBkx6ggSXumkJNtxfAcSLvbs/1bdKggHDpJEBQOyoL4jO5kw9s+ENN2So/jVH9zsj3Z/T39ID4z84IjmL/bSw7eNwDS9rXj5rH7xqkkv1FNb8N+crl3dJHDH4JQMGuBQJYaqt13HDrZZvYcDmm3XWoA++gkQbBxQgHEZ7SX1ewSXYGc9vCrkLZTehyn+pub80F30WY/NdK0Ngbzd3M9ruQg7Y3k9ouT2XymtW1+nzHR+8jl3pd201PXcGsMgY1h1gKBLNGF3EfXfiITtJ9szZg89iDiTycJAjodjhpvNJZR7W6uvwhr95apyxzrb27S3S6Ezyj1kFl5QoP5G1lykPZGcvvF6aT9ztGdCnavHNy95ze49YXA5jBrgUCW6KI9U6gJRmkMUAGSyn1xBxB/OkkQUH5IlN8OrN0FazfywFFlQLud5G9uIkv30al2M9oYzN/IdjeZeIJZGJqUZYPm9jx3Wqc+8SSnHhjfvfdv0rp0uZpbWwg0gJkLBD3OQAQaZC49ZIoHqiPKHTz86SRBQCflUH7bnL0E1m5k1ZzAO5dO8jc3j++ugfnNrCccwfy9dkwepM2UrNjMHIbCzkn9TTcsSqavaN87Oi81rc3jSj3kcbkXe5JTRo93pdzRRfb7CSKBmQsEIoElccbjw2CTClXHmErA0e177qDhT6cJgqmgvXR0wATVZgrciDYH27voNH9z8mLze7CtImblOg3m73DuGkVDEh/cPol1kp+59YNAc5i5QKDq6VLgpQCMmERznnkb0mYzN3ebGTCcJAhQp2npkAaqzai75P41gJ3qb27mPjEM4ruClzNMaV+gv2lbTtYvX4K02b/koJCHIgAFhmHmAkF7pyACMBlTE5g2X9MmbER7V701kz1ABAsYThIEmyYvgY03Oj1pdntbL3wAG29rgxw4cpq/ubns9SkQ3015wJyScIH+Pn2kHjY/zMxfKIze39z6QaA5zFwgKOkxKuCU55ufcqCuohbW3rL5G9gDRLCA4SRBcGBNOcx/VVsPajXegh04cpq/uVmasxLmPzMOVAT6e/8qXM3sasD8EEbub279INAcZi4Q7XfUbsfc4aC9emZPIGQqkZqyKvYAESxgOEkQ1FefgfkPcYfDzOz+gaRDCk73NzcPbdwH819VifGScIH+3pi1CNZeylHH7Y9YpwhAgWGYvUBQNQJEwJnz7NumT6B14+bDAuSFpivsASJYwHCSIKBDDxPv7gvx34oROaa3d0NGPma8hdgj6zR/c7PxeBMsXmybvcZw+wL9TXsLEW2d1uM1dl8IRQAKTIDZCwTtfUMEHTMTpvpIG+cRbUWeWjYaMJwmCAxlyu+As347wvS2Uu1URFvpcEKs+JuT7SXh7n0Z4kMzLjj8/U1tzQaVgFv86iR2XwhFAApMgNkLRNm89ZCgQ6Q9VGa1s/3u0V2Yu0eBJbnsQicKAliFhtv7mJrGp70m66/6WzrenOhvbi54YRzEh4F1nKOhv7/P1p6DxeEtU5ez+0EoAlBgAsxeIGjvGyrw7Flaalo764En5LbNKmIPDqEChtMEwe7FJTA/mpnIG7kgl+auihl/c3Pd+AUQH7bnDb3wgaG2+fsbuV/x4IY97H4QigAUmACzFwja+4YKPLRnz6x2Ik/ImbGhGxUwnCYISKSh/Eji0qx2Ht60H9ZO+tux4m9uIi84jD7h8Pc3LCerYuOJJnY/CEUACkwAYoGgPXCIwEP7vcxqI/SEHCCHnFkBw2mCgB7T0uNahB/p8bJZ7SydsQo23s7WNceMv7l5Yu8xmB/3Lt9mqG3+/l4yOBvSRtrGICXg7EERgALDQCwQtCcJEXyClbuKlvl9PZA2TnvEvifknCoI6MAGwpdmXnAsGzoVsyDfNyDkguxUf3Py4nlkSbh8Q23z9/f0R4dA2pjfN53dB8Iv/M2tHwSaA7FA0B44RPAh0t49o+1Dbshf/MpE9sDQUcBwoiCgE5QIX1KKGbMuOFBlxOhCJtb8zc3cJ974/9s7E+gorisNCzN2JomznAzEc2SSAS3MnFmTYRIjsQyxYxNiJ+PgQPBgoxZesFnsAWPjFQuDGrGD2BGYzaxmEztiNQjEKiyzamGTWGQPjjNnjh3HGVtzb9Ntl4RaXdXVt2911f+d85+u6qru96ruq/tuVb0l7rY0o5C9a85fE/O/sZq3GLIvBIDANhIVBLeBk3JA3HbPbv64DYtU/pzcQ86tAQEP2ixlz8rjVbbzd/nSB4IVcvinRm61t7ak3nDwEDPv10Z/wxGyd9nOo2Llbf/KnernH/rK3trxA0hwJCoIbgMn5YC47Z7d/B0u3CeWPyf3kHNrQMDTtknZk+e3tps/nqVDKn9NtRtzq721xb2upexp5w1HyN47C9aJ5Y+n+9Q+/9BX9taOH0CCI1VBcFs4CQdk9zUJa8vkZWIO8tzJi+qOoSmH4caAQPKGY/PEJbbzx/NCS+XvzKHTnrO3to5slBtiZf/yHVHnK2Tvt1+eLpK3sV2eqKu9+pH6+Ye+srd2/AASHKkKgkeLl3BCseiFtviZcTJ5a6JBvhPk5oBgygPPith08cCxtvO2YphMG8VIs+O42d6a4ps8qQDQzlBXIXvPelhmOs6CrOHq5x6qb2/t+AEkOFIVBLeFk3KSPCennbxJBQs896a2U4jkMNwaECweNFbEphN/MdB2UD+t+1CRvM3u/Ypn7a2pwDRrVC6cFmSxnT/79E+BQaUl8rYmZ476uYfq21s7fgAJjlQFcXhDsVgAyG34os3XxXK514Ubxy5WdwqRHIZbAwJ+VStl16qyc1Hn61LFFbF88bzbXrW3tqRuOMb8++NRzwjCdr5y6pxYeduzcJP6eYfq21s7fgAJjlQFIfmahNvwRZuvY1sOiuWrZJX9HsrSDsOtAQF31pCyq52ej5IzgHDbQq/aW1tb8+Vm2ji5772o8hSYAu7t7WL54s5M2ucdqm9v7fgBJDhSFUTgNUnXASKOiO++o81X0YxVYg6yorRS3SlEchhuDQh4uBYpu9ppl7V5klyHo0iBgpvtrS3JG8ndb26IKk9s58LXZ8nkq2PfwCDY2ucdqm9v7fgBJDiSFQS3iZNwRhxYRjteltSMDLGcpUTSYbg1IODywOOoSdh2zqOvRX8N9Je5Bsy8KnSzvbVVXXVVLABc+dK0qPLEdp7+kEx70xk9X1Q/59DN9taOH0CCI1lBbBy3WMxJRjtellSD/HmPvaHuEMw4DDcHBFLBFjeqj+bph2RQWpD1uuftrS0pX8KzxkSTn4vlNWL+lmfb0T7fUH0hAAS2kawgSlbvFnNI+5Zss5yfmgu1YvlZN+pNdYdgxmG4OSCQHN+xbHep5fyU002KVH4KcyOXN7fbW1tSUxCyas5ds5yfw4V7xfKzc8469fMN1RcCQGAbyQqi4nilmENa9dosy/kp23VMLD/FS4vUHYIZh+HmgODYlhIx+26ftcZyfoqXFYnlx8yUiG63t7YkB/gu3XbIcn42jFkolh90AHGeEAAC20hWEJKvwGb0GGY5P7vmFoo5yNMHw8/I4BS5PSCorromZt+lQyZazs+aEQVi+TEzNI3b7a0tySn+tk1daTk/8/qOEMmLnaFpIDkhAAS2ka4gFg0YI+YkL1VetZSXlUJTJLGDbGpGBqfICwHB9N++IGLjyfc/Y3lA6Nm9XxXJi9nBqb1gb01drbkemI1FwsZvPTPOUl7Y/7AfksjL3OwR6ucaulkIAIFtpCsIvpOVCgCPbNhvKS8ze8lMkWSnl2i8HYbbAwIeHFmqvJ07aX4GGu40ktepr0g+zA6D5AV7a4uvfQkbT+o2yNINh+TTSH61rH2eoZuFABDYRrqCOL79iJhj4l7GZvMRuFsXmiJp9XDr7RG1HIbbA4J3Fm0WK28lq/eYzkfZrlKxfJh9PegFe2tr7Rtzxexs5YZjZ8E6sXwcWrdX/TxDNwsBILCNdAVx+dIHYk9C3rQw9IpkB5A9CxJjiiQvBARnDp0Ws3Ohf77pfOyYvVYsH2Y7CHjB3tqS7OhzcI35Gw6p8U1ZF87WqJ9n6GYhAAS2iUcFIfWaZGyXJ0y3vds6ZbmYg0yUHnJeCAhqr30UGJRbws5zfTmm87F0yCSx8lZzvhb2dojKj5aL2Xl93gJTeeBXxZMfeFYkD/kPDlE/x1DjQgAIbBOPCoLHLNMOvt58YpRMHhJoiiSvBATzn8wVsbWV3pBTfvVfInmY0dN873ev2FtTPPvP+J8/JWLr2Y+8aioP/KpYyr+uGIYBoJ0qBIDANvGoICQHhOZXbZHS5/Z/Uj3kEmmKJK8EBJsmLBErb2ZuOCQrZO7kAns7Swv6+cXszVPORUpf0r9GOy8xJC8EgMA28aggzp+6KOaglgyOPD6bZEeURJoiySsBAfcOl7I3N7aPlD7PUiOV/p6F5tubesXe2to0/i0xex9a+07E9CXfsJw6cFL9/EKNCwEgsE28Koj8Xw8WcVBmhkvYPHGpmIPkXqfajsCKw/BCQHCp4rKYvd96dnzE9JcPyxdL/3TJKdjbYTq8fp+YvbmXcaT0C/oMF0l77M+erKu9+pH6+YUaFwJAYJt4VRCSlWLlu1VNpi01Qj6rorRS3RFYcRheCQimdR8qYu9x9/RrsuMRz34zqdtAR1TIXrK3pi6cqRbzLzyweVNpX7n032LDW81/YpT6uYXCCwEgsE28KghuSyLlJIuXbw+b7o1haGQcJPe8szo7hLbD8EpAwK/mpcobDykULl2eElAqXSvDHnnN3tqa/tvnxex+/vSlsOke2SjX3IFfbWufVyi8EAAC28SrguBXV1KOqqmG8ce2HBRLN5Ha/4UchlcCgt3zN4rZffPEJWHTlRz/b+NY8wOfe83e2lorOO/z/uU7wqc7Um4gag4utc8rFF4IAIFt4lVBBMZnu0dmfLZAO8DaPzSaLs8WIuUg9761Vd0JWHUYXgkITu0/IWb3pqb+W9g/Tyzd0q3mBoD2or21xZ01pOwe7gaX3z5M/c1zYulanWsdiq8QAALbxLOCWPCU3HAJp4pPNJpmQZZMA2lWVdl5dSdg1WF4JSDgdnpSNxzhKkceI5Db6Umkx8MYWR1v0kv21haXB6myxmNKNtbUpOJ4pVia/Epb+5xCTQsBILBNPCuILZOXiTksnumjYXqXL7wvNg1d/n8MTqj2fyGH4aWAgHvsSpW3klW7bkrv3R1yww0t6JcLeztcs3u/KmZ/DvYaprdr3nqx9KyMNwnpCAEgsE08Kwh+hSXlsHgohIbpHd10AA6ygcPwUkCwZ4FcO8BVr868KT3J8eCKZqyCvR2uDWMWitm/sfEfFw0cI5ZeUx3rIGcIASCwTTwrCMkncqyL5Zfrpbc+T84hJ6KD9FpAUHm8Ssz+UxrpAS41HhsrXBMH2Ns5OralRMz+y56bVC8tnt1IqrlBwJeerVE/n1DTQgAIbBPvCmLeY2/IBWXLiuqlNes/XxZL69zJi+oOIBqH4aWAINBI/kG5RvJnj5z9Mq3qqmuBeaEl0plwX//AnLOwt7MVGHKqs8yQUxO6DqjX0U1ydAOzcxBDukIACGwT7wqiaPoqMce1bOiUL9ORbCDNgwxrX/zROgyvBQRrBIfnME4LJ9kLtOHTH9jbuZK8wTXOAlPony+WDs+lrX0eochCAAhsE+8K4swhuYFyx9/79JczJWyb/rZYOquHz1K/+KN1GF4LCA4V7hUrB4sGjPkynTU5c8TSiXa6QS/aW1tbJi8XKwfG8Sd5hhCpdMp2l6qfRyiyEAAC28S7guDXcjysgZjzCs7SMOthude/B1buVL/4o3UYXgsIas7XirU75TZY3BaLx7jkWWGkyltV2TnYO0FUtqtUrBzwmH/sP3n4Kak0xv/8Kcz/myBCAAhso1FBrH5d7mkJz5ZQfqxC7P9ZPPen9sUfrcPwYkAgORf0kQ3760q3yfVuD1X6sHdiiMeflOyccWJvWaBHsNT/Lx0SXXMDKP5CAAhso1FBHN5QLObAZv7uxbqtU1eI/X+kydmdLK8GBFvz5crD0iET61a+NE3s//lmCfZOLEnOBsNt/ySHf0m02Y28LASAwDYaFQT3luOZDaScmOR/85yf2he+HYfhxYCAn5pIlQdpHVz7DuydYNo+a416uYlW509fUj9/kDkhAAS20aogFvYfre7sohG/7tO+8O04DC8GBNxGb8K9/dXLjmV17FtXXRX9fKxetbe2Th04qV92otDMXi+pnzvIvBAAAttoVRC75haqOzyrmth1QEI3kPZyQMBDqWiXH6ua8+hrsHcCisdsnHz/M+rlx6o2jF2kfu4g80IACGyjVUFIztIgJTvtsZwgLwcE3LZJu/xYFU8tB3snpiTH6ZMSz2Wtfd4g80IACGyjVUFwz8ZpDz2v7vSs6HjRYfWL3q7D8GpAwDO3aJcfq+IxM2HvxNTJfe+plx8rGnd3v0APZu3zBpkXAkBgG80KIpHukid1GxhoS6Z90dt1GF4OCPiVqnY5MitujxXt8C+wt74CN7jdh6qXI7N669nx6ucMsiYEgMA2mhVEadFhdcdnVonc+9foMLwcEOyat169HJkV9ySFvRNbPHOHdjkyq31Lt6mfL8iaEAAC22hWEPzKgadv03Z+ZvTujqPqF3wsHIaXAwLuUSs5RFDM1LFv3YXT9gcb97q9tXX2yFn9smRCPHB1zYVa9fMFWRMCQGAb7Qpi9euz1R1gJE365aCEf/0bchja9tZWIvQGXvCUH/Z2iSSnpIyV3n5lhvp5gqwLASCwjXYFkQhjZq0dOVf9Yo+Vw9C2t7aObjqgXp4iqXj5dtjbJdo+c7V6eYqk9/YcVz9PkHUhAAS2cUIFUZA1XN0JNiWe4F37Yo+Vw3CCvTXFT3KdPEYbv47jmXJgb3fo3IkL6mWqKfHUmXY7G0E6QgAIbOOECqJ4WZG6IwynyQ88GxjYVftij5XDcIK9tbVx7GL1chVOK16cCnu7TPP6jlAvV+G0s6BQ/fxA0QkBILCNEyqIqzXX6yZ0HaDuDBsTD1WjfaHH0mE4wd7aKj9WoV6uwunYloOwt8u0e/5G9XLVmLhDlJ2pBiFdIQAEtnFKBbE+b6G6Q2xM5UfL1c9NLB2GU+ytrbm+HPWy1VD8ajqWnY1gb2foUsXlurxOj6mXr4ZaPixf/dxA0QsBILCNUyoIJ04Nt3jQWPXzEmuH4RR7a+udRZvVy1dDrc9bAHu7VCuGTVUvX4aQ1G0AAAq4SURBVA2Fqd8SWwgAgW2cVEEs7D9a3SkadbrklPo5ibXDcJK9NcXjnnGHC+0yZlTF8UrY26ViX6JdvoziWUrer3VH22avCgGgC2nbtu2TKSkpHSPtl5aWNiw9Pb07aSQtt4o2PSdVEIfX71N3jCHxeHHa50PCYTjJ3tpakzNHvZyFtHTIRNjb5XLSU0Aenkb7fED2hADQXdxGgdwACgCPUFDXuakdab8M2q+Al+nzTtp/dbSJOqmC4PZP+b8erO4ceSYGN7X9MzoMJ9lbW1Vl5+vyOjujbdbZw2dgb5eLh4Rxwkw04+7pV1dddU39fED2hADQhVAwNz9SAEhB38sUBD5u+E1NtOk5rYJwQo+5lS9PVz8PUg7DafbW1rpRb6qXt+XPT4G9PaINYxaql7fNE5eqnwfIvhAAuhAzASBtzyc9bFivbtmy5e3RpMcVxPXrNwqTE3TtyoeB9ilazpF761W9d079PEiI7ew0e2vrUuXlwBMRtQq5Y9+6imPlsLdHVHP+Wt2E+/qrlTce1/RK9Qfq5wGyL76uo6nzgYMx+QRwelpaWk/D+tXk5ORvyOcuPuRmZt2v5SD9mb452scP4os/I3uEWnnr4JulffwgvpB/e06rvOVm+nzaxw+AJ6FArRMFdyWkAwaVGNvwWXgF3NewfkUy3xqQs1qjUBn/Maddnx9qHzuIL4MzenydAv+quFfImdlXcjJ6fE/7+EF8GZTW7WujM30X4u7fMrOP5CQl3aJ9/ACAMDQWAFKwl2pcp4Dvp/wUkJdTUlJo9/T18cxjPBj1k+wfUAX5hzjfHQ/SPm6gw6i7+nQc3cH3f3Etb3f57tU+bqDDqMysh+IcAH7qv6v332sfNwAgDBToPU3B3EnSAlruEvy6Ga1X0fq3G+zrpyCwFykvNTU1Lf65lWdURp/fxO/u2LcjB3fHnsafmfVCHMtbvvbxAl3oBnd23MpbRnY/7eMFAABLUKU8Mg6VcVVO5qPf1z5WoEsO3QD4M7ML5Stk325+Dah9vECXQNODDr4ycf/WIWuq9rECAEA0NJO8U/Z3yP5gdMYjrnyCCqyT0+5X36AgcJfczUb2iZwf+b6rfZzAGeTc1buVaPvTTN/GnKQuf6F9nAAAEBU9kno0Jye5SCL4y830/Uj7+ICzGPrPj35TIgik8nbQ/+MeLbWPDzgLbu8sEQT6O/gWPNmu3a3axwcAALbISUq6ZXSGb2wMnWOZP8P3d9rHBZwJv6KlMjItdk/+fGv56aL2cQFnwk1QRmf69seqvOVmZo+iv22mfVwAABAzqFLuNLqD76SNVyKfkF5HGyxghtz2WT39mdm1NirjT0dnZA9MQmUMIpDT2veX/g5Zw6m8fWzjRqNqZHtfF+1jAQAAEQKvhNtnZ5GzO2Ml8ONBnvl1i3b+QWLBbfao7EygivlD8xVx9oe5HbL8OR16JWvnHyQWXGb4bQeVuf8x79+yr/gzs57hjiXa+QcAgHjQzJ/ZJ4NnU7jx+sR3iRzhZ+Q4/xQYQzAzu9TfIXsFO0Y0vAd24fZUuRnZXalcjacyV0y6yuUtGPB9TDrAr41z2/fplvMPPW7Tzi9IbKgM3e5v7+tOvm0+lbMaDgjZt5FP+zOVs2pa3ktlbow/w/cgPz3Uzi8AAADgJZoNa9fjO/xUWjsjAAAAAAAAAAAAAAAAAAAAACQF5hV+MiUlpaPxu7S0tGHp6endSSNpuZVW3oAcZPd/oY/mLVu2vN2tUwl6GVzD3gLXs3doWGfjWgfRcBsVlgFUmI5Qwekc+pK+y6DvCniZPu+kbav1sgikILseJ/teJ61NTk5uoZ0fEDtwDXsPXM+e4KY6G9c6sAUVmPnGAJAK0ctUqB43bK/RyRmQhOzcRzsPQAZcw94D17N3MNbZuNaBLRoGgLScT3rYsF7NrxV0cgekIMeRl5qa2o0+X2rdujVmRHERuIa9B65n72Css3GtA1s08gRwOt1R9DSsX01OTsYUVu4jMDNFixYtvkX2L9HODIgduIY9Ca5nj9DgCSCuddA4VBg6sTMgHTCoxNhOIMwr4L6G9SvxzjewTxjbs1anpqY+SNsnBne9hb77WDWzIKbgGvYWwet5QnAV17PLaeQVMK51EB2NBIA/5bsKXk5JSaFN6ev1cgckoArjbrLtT3i5TZs2f0s2LtLOE4gduIa9Ba5nb9EgAMS1DqKD7hyepgJzkrSAlrsYvvdToeoVbFeCIQVcCDcc5jtHsv0b6DXoPnANewtcz96gsTob1zoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOJj09PSH2rZte4a0K9K+aWlpqcHpBb+wmo6d3wIAAAAAgBhDwV+WmQCQadOmzd9QEPd5NOnY+S0AAAAAAIghCAABAAAAAKzTjAKbfNJeDqTocykFO3fwhlatWn2d1mfQ98VB5dHXzXkbLa+jbX8kDaXltfRZSXoqLS2tK31uJFXQ9780pNOctuXS9wdI79DyePruloaZSU1N/RltP0e//V/apzepJ61/EC7IaxgA8pyytL6TfrOdtJvW24e2BYO4L4LzzhaRTtDyY6HtweOdGTzWfbT8QoPfIgAEAAAAQOJDAdcvKNjZElqnIGcSqXNweRZpSXBT82BQ9VpoX/rdBQ6YeJkCqX+l5Y85CAz+9iHSqdC+tP1FDjKTgkEfLRfS758Lk6cf0Lbfp6SkdOQJ4kNpNEbDAJCWn6C0vsbLrQlavxjaZggAHw9tp/VPKJ1/Mhzv0uDut9Jvj/BxGH6LABAAAAAAiQ8FNXeRqikoui/pRnB2a/CTnwx+Qt93Ce3LT+SMAVUwAHwguMoB4hcUsP0jrwQDt08N+5bzkzfDei9+AhcuXxzI0fYq0ioK0L7TxH4NnwBm0PpmfsrITwA5aEtOTm7B20JBnPH/aH0baVToeCnfdxv+i4PW9cbfhj+TAAAAAAAJBAVE91Bws4lUQ8HTaH6CRoHQ940BHUPr99L2z0LrwQCws2H7F/RfP+TlhgETB1ekdzlYC75qLqHPsqbyxfuT5je1jzEAbNGixbdo/484uDSTp+D2JaR5oeMlHQzmb3fwCeCmcL8FAAAAAEhIKNj7Nrd94+XWrVv/NQdm9N3wpK+eiP3MsO8jHPSF1q0EgPwEkP7rd8a077zzzr9qIl/8JK+AdJ3UKdx+xgCQ0v43TpOPKbj51sbyRMf5XUOei4xPAPmJqPH/Q/siAAQAAACAa+AAigKmwaF1fuJG340IbptOWhzc1DwYLL1i+G3YADDYvu4Lw7YXSBuSgp1IaPl+Q3u7egQ7Y6xJutEOL4s7hdxxxx3fbGxf2uYLBYB0HC35tTO3a+R1+nywsTyF2inS71K43WLoKScfr7G9If3fAJK/seMBAAAAAEhYKDhqy+3cKPjZQdpPWsGvUnkbB2LBILA4uO3LXsD0m2XBJ2al9B/pwXZ3n3MvXwqaWqXfGDj5c0P7PA4g3wi++t1Bn2/T/3+vYX44GKPt7/ETQw7QSDmkPwd77P7YuG/6VwNB/97QGeUxWj8ffKU9MpQn+t92oTyRBgV7Cp8kZYf+z9DrmY91J2kuvw43DAQdOJ5QJxMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIC3+H+pyUL8kaNGHQAAAABJRU5ErkJggg==\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Passing extra arguments to matplotlib plot command is as easy as\n",
"# passing them to replot plot command.\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=True) as figure:\n",
" figure.plot(np.sin, (-10, 10), linewidth=20)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false,
"scrolled": true
},
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[(0.9677975592919913, 0.44127456009157356, 0.5358103155058701),\n",
" (0.21044753832183283, 0.6773105080456748, 0.6433941168468681)]\n"
]
},
{
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import seaborn\n",
"# You can also tweak the palette used, either with a seaborn palette\n",
"with replot.Figure(palette=seaborn.color_palette(\"dark\", 10)) as figure:\n",
" figure.plot(np.sin, (-10, 10))\n",
"\n",
"# or by passing it a list of colors as RGB tuples\n",
"palette = list(seaborn.color_palette(\"husl\", 2))\n",
"import pprint\n",
"pprint.pprint(palette)\n",
"with replot.Figure(palette=palette) as figure:\n",
" figure.plot(np.sin, (-10, 10))\n",
" \n",
"# or by passing it a callable taking number of subplots as argument\n",
"with replot.Figure(palette=lambda n: seaborn.color_palette(\"dark\", n)) as figure:\n",
" figure.plot(np.sin, (-10, 10))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false,
"scrolled": 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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# It is not mandatory at all to use a with statement\n",
"fig = replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\")\n",
"fig.plot(np.sin, (-10, 10), label=\"sin\")\n",
"fig.show() # But in this case, we must show the figure"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false,
"scrolled": 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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# NOTE: Passing tuples to the plot function uses\n",
"# the tuples as (x, y) point series, which is not the standard matplotlib\n",
"# behavior.\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" y = [i**2 for i in x]\n",
" figure.plot(zip(x, y))"
]
},
{
"cell_type": "code",
"execution_count": 19,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nO3deXDUZ37n8TizyR+TmUllC8pVjNcxklBS2dRO7U7NZGcDxh6bwVc8hPEwtmdsjyXuGxvMYWMbcwkhISFAgMV93/cpc1kc4hJCCAQI3Ud3C2QEU8luKrvxd5/nAdoyw9HiaenpX/f7XfUKErSlpyqq4jOP6Naf/AkRERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERHFXAkJCaM7derUU5mo3n7C9nFEREREFMGpIfezxMTEHP22+vWHatxttHkcEREREUV4asyNU+Ou95331bCrtXkcEREREUV4ashlKW80e7+mffv233vUxxEREZF3m/oP7/x46v/6/VFlg+uzUCuWmJg4JyEhoVez930dOnT47qM+7u6+/vprISIiosju//7bv8vB7HWS8nSyTP3Hd2XKP/5+d/jWBkVct7+1m9Ts/Xqbx92d/qJqbPyDXLsGAAAiUXHeWcnuNdoMv2lde0tu9nrp++Mf/5n9yqCITQ25n+rbPf12XFxcJ9U2/bYae/GhPO5h6QGov7iuXgUAAJGkvvqabJ2yWKZ2TjLjb8HvP5XLpy+bv7fDvTcoAlNjb4oad68rKfHx8Qnqtx5TA69M/f4PHvK4h8YABAAg8hR+cUpm/fP7ZvilPttX9udslYD/hvkzBiBZxwAEACBy1FYGZOMn883w0xb3nSxlReXfegwDkKxjAAIAEBlO7zwmM/9puBl+ac/1ly+X7ZKGwI0/ehwDkKxjAAIA4Fb1FZ+sHTMreOu3fHCqVFyouu/jGYBkHQMQAAA3GhpuyvFNhyTjxcFm+KV3HyRH1+4zv/+g/44BSNYxAAEAaHuVl2pl5YgZwVu/1e9nSNXlupD+WwYgWccABACg7ejbvSOrciW920Az/DJeGiIntuS16GMwAMk6BiAAAG2j/HyVLB2Y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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# To plot in log scale, you can use the Figure.logplot() method\n",
"with replot.Figure() as figure:\n",
" figure.logplot(np.log, (-1, 1))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Same for log-log scale, you can use the Figure.loglogplot() method\n",
"with replot.Figure() as figure:\n",
" figure.loglogplot(lambda x: x**2, (0, 1))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# To force an orthonormal frame, use orthonormal=True on the plot\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.sin, (-1, 1), orthonormal=True)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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Tx/IfZSLUz6Y1M9n4DkjeOONN9544924d95GAWEoX/lbFMA/FMXv4KHcPZD7cV0cvH2Ct34WvPHGO7937l4BZrguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BwiO6+Lg7RO89bPgjTfe+b3V/QGC47o4ePsEb/0seOONd35vdX+A4LguDt4+wVs/C954453fW90fIDiui4O3T/DWz4I33njn91b3BxDT0dFxXmtr6wkD/f2ui4O3T/DWz4I33njn987ZJSAWH6vVamOLAri2vb39pIHeievi4O0TvPWz4I033vm9cxYKCEhR/u6mAPIHBt5444033j6hAEKWAtjV9d6DySWlL94+wVs/C954453fO2eXgIDkKIAAAAAQi5xdAgLCdwD5ihFvvPHGG2/9LM32ztklICA8B5DnjOCNN954462fpdneObsEBKNWq11QlL9NRWYXt08eyH24Lg7ePsFbPwveeOOd3ztzpQA3XBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8F76HN/r2/T7/7zfr0+z0HrLxdz7vbW90fIDiui4O3T/DWz4J33hzofCe9+vzm9OTtS9I9F92YJnzuvHTD33w3zfj6uEp7u5730bzV/QGC47o4ePsEb/0seA8+O17fk55d+GS678e3pClfvrhe+Loz/qQx6c4x16bfPbq6ct6u592It7o/QHBcFwdvn+CtnwXv/qdz/9tp46r1afnkX6U7zryqT+Erc9s3r0xLx89JLy5fk/bsPFgZb9fzHoi3uj9AcFwXB2+f4K2fBe/GsntbZ1qzeFX9u3yTTxnbp/CVHy+8Ylp6dsGTaftruyvl7Xreg/VW9wcIjuvi4O0TvPWz4H30bN+8K62avSzNueCGNP7EMX1K38xvX50evXlB2vTMxtS5/51Kebued05vdX+A4LguDt4+wVs/C96Hc+DA/0mvr9uSHr/1/jTzrKv7FL6Jnz8/zf/B5PTM/MfSjiN8ly+yt+t5D6W3uj9AcFwXB2+f4K2fxd27LH2b17ySHpk0L936tXF9f7T7pYvS/VfdltYuezbt291VKW/X826Wt7o/QHBcFwdvn+Ctn8XRu6f03TQ/3XL65X1K37TTLktLb5idNqx8qf5ijyp5u563wlvdHyA4rouDt0/w1s/i4l2WvvL6fMsnF6XvKz/sU/qmf/VHafmUe9Pm5zbXP69K3q7nrfZW9wcIjuvi4O0TvPWzVN1764Zt6bFp9/3Rj3fLEliWwbIUDkXpU3sPhzh7q/sDBMd1cfD2Cd76WarovXPL3vTru5elWd/9Wd/Sd/rl9ef6lT/+HerSx3l7e6v7AwTHdXHw9gne+lmq4r1311tp9aKVae7FE/pcsmXKqRenh/73XfXLtTSz9HHe3t7q/gDBcV0cvH2Ct36WyN5lodvw65fqr9Sd9IXv9blkS3nB5nUr1qTOfXleyDGcvKPE2VvdHyA4rouDt0/w1s8S0fvNTdvrz+vr/Qre8SeeneZeNKH+XcC9O9+Su3Le3t7q/gDBcV0cvH2Ct36WKN7lj3ifXfhkmn3+L/o8r2/GN65IT96+5IhvwTZcwnnrZ2m2t7o/QHBcFwdvn+Ctn2W4e5cv2Fhy7aw06YsX9JS+m/7uwrTkulnpld/+Tva8Ps4b7w/yVvcHCI7r4uDtE7z1swxH793bO9OqOY+kO8686vB3+044O91z0Y3puSW/Sfv2/IvchfPG+4O81f0BguO6OHj7BG/9LMPFu/xO3sZV69Oin9yaJnzuvJ7iN/V//SA9OnVhenPTDvn8nDfejXqr+wMEx3Vx8PYJ3vpZ1N57th+oX7Nvxhk/PvyCjpPGpHsvm5LWrXgude5/Rz435413f73V/QGC47o4ePsEb/0sKu/yuX2Lr7m9fsmW3u/O8cRtD6Qdr++Rz8p54z0Yb3V/gOC4Lg7ePsFbP0szs39PV3r54afTrO9c0+vyLWPSry6dkl56/IV0oDP+d/s4b7wpgDBoXBcHb5/grZ+lGSnfj/fhG+fUX73bXfxu/ofvp0enLUzbX90ln4/zxju3t7o/QHBcFwdvn+Ctn2WoUn43r3wO39xLJtZfwdtd/Bb8YFJa+/BvU+d+/Tt0cN54D5W3uj9AcFwXB2+f4K2fJXd2b+tMK2c9VH8+X3fpK6/ht3T87LT15a2V9XY9b7yP7K3uDxAc18XB2yd462fJldfXbUlLfj6zz4s6ylf2Pj13Rc9bs1XR2/W88f5gb3V/gOC4Lg7ePsFbP8tg8t6PedekOReO7/Oijnsv/2XasHLdH71LR1W8Xc8b78a91f0BguO6OHj7BG/9LAPJnp0H06rZy9KtXxt3+O3ZThmbHpk0L23bvLOy3q7njXf/vdX9AYLjujh4+wRv/Sz9yZubttdfzdv7fXnrP+ad92jat7urst6u5433wL3V/QGC47o4ePsEb/0sjWTTMxvTgh/enMafePjVvPMumZjWl9fue9+Peavk7XreeA/eW90fIDiui4O3T/DWz3K0lJdpef7Bp9OdZ/+8p/SVL/B48Pq70hsvb62st+t5453XW90fIDiui4O3T/DWz/L+7NlxMK28c2ma9o+XHb5o899/v/4WbeUlXqrq7XreeA+Nt7o/QHBcFwdvn+Ctn6U75TtyLJs4t8/z++4486q0etHKtH/v7yvr7XreeA+tt7o/QHBcFwdvn+Ctn+W1F15Ni35yaxp/0pie4jf/+zelDStf6tfz+6J5u5433s3xVvcHCI7r4uDtE7w1//2y2K1/Ym26Z+yNPaVvwsnnpgd+PjNtWf9GZb1dzxvv5nur+wMEx3Vx8PYJ3s3973bue7v+I93bv/XTnuI3+ZSxacUvF6SdW/ZU1lsdvPWzNNtb3R8gOK6Lg7dP8G7Of698K7byhR1TT7u0p/jdcvrladXsR9LeXW9V1nu4BG/9LM32VvcHCI7r4uDtE7yH9r+zc8vetOKX99bfpaO7+M0865r65V06979TWe/hFrz1szTbW90fIDiui4O3T/AemvvfumFbWnLdrDThc+f1FL+5F0844vvzVsl7uAZv/SzN9lb3BwiO6+Lg7RO8897v5jWvpAU/mtrzjh3lK3vLV/iWr/RVO3PeeLuEAgiDxnVx8PYJ3oO/r/I7ei8/uTbNuXD84Xfs+ML5aen4OWnbKzvkrpw33o7e6v4AwXFdHLx9gvfA76N8Dt/zDz2dZp51dU/xm3LqRemx6YvS7jf3yx05b7ydvdX9AYLjujh4+wTv/v/e8l05npn/WJr+1R/1FL9pp12WVs1elvbt7pK7cd54400BhEHiujh4+wTvxn/Pnp0H01MzH6y/L2938bvtm1fWr+tXXt9P7cR54433YW91f4DguC4O3j7B+9ifu2vrvvqFmntfyuWuc65L61askb6il/PGG++je6v7AwTHdXHw9gneR/+cbZt3pqU3zE4TP39+T/Gbd8nEtHHVevn8nDfeeH+wt7o/QHBcFwdvn+D9x/9uy0tvpPuvui3d+LfnvHcplxPPTguvmDZsLuXCeeON97G91f0BhNRqtXHt7e2nF7muuP0XA7kP18XB2yd4H/5nr6zelO69bEq64YT3ruE34eRz05JrZ6WtG7fJ5+W88ca7f965OwUEoSh8f93R0TGzvF38+udFCVw8kPtxXRy8feLuffBgeQ2/F9OcC2/o+THvpP/5vbRs0ry047Xd8jk5b7zxHph33lYBYShK35VFCTyn++OiAO4eyP24Lg7ePnH1PnjgnfTaqhfTrO/8rNc1/C5Oj996f9q9vVM/H+eNN96D8s7XKCAUReGbWuSbvT7eddxxx/1Zf++nXJyurvceTC4pffH2iZv3gf1vp2cXPplmfOOKXtfwu7R+Db/9e7rk83HeeOOdxztvq4AwdHR0TK/Val/v9fG+UaNG/Wl/7ycBQCX493/9t7R20RNp+umX9xS/O751Zdq4/Lfp//3Hf6jHA4DM5G0VEIZDPwI+u9fHewdyP+WDyPErJ7x9UnXvPds70+PTF9Xfoq27+M367s/Si488m979z/+srLfreeONd7d3vkYBoSgK31+V3wUsb7e2trYXLB3I/ZSLUz6Y1M9n4DkjeOPdv5Qv4Fg2cW6a9IXv9RS/OReOTy8/ta5+8eaqerueN954v987b6uAUNRqtV8UJfCMIuPb2tpqA7kP18XB2ydV8966YVt64Ocze67hV17S5d7Lb06b17xSaW/X88Yb76N55+4UYIbr4uDtk6p4v/r85rRw3LT6RZvL4lcWwMVX35a2rH+j0t6u54033sfyVvcHCI7r4uDtk+je5duyzb14Qs+Pecu3bVs6fnbavnlXpb1dzxtvvBv1VvcHCI7r4uDtk4jeBzrfSS8+sjrdNebanuJ30ylj06NTF6ZdW/dV1tv1vPHGeyDe6v4AwXFdHLx9Esm7c9/bafV9T6XbvnllT/G7+e+/n56a+VDau/Otynq7njfeeA/GW90fIDiui4O3TyJ479vdlX5997I09bRLe4rfrV8bl56Z/1jav/f3lfV2PW+88c7hre4PEBzXxcHbJ8PZe9fW/emxaff1uYbfzLOuSS889Ezq3P9OZb1dzxtvvHN6q/sDBMd1cfD2yXD03vbKjvoLOSZ+4fye4nfP2Bt7ruFXVW/X88Yb76HwVvcHCI7r4uDtk+Hk/doLr6b7rpyexp84pl76yku6LPjR1LT5uc2V9nY9b7zxHkpvdX+A4LguDt4+UXuX39Erv7M396LDl3KZ8Lnz0oPX3Vm/qHNVvV3PG2+8m+Wt7g8QHNfFwdsnKu/yOXzPL/lNmnnW1T3Fb3J5KZebF6SdbzR2KZeI3urgrZ8F7+Z4q/sDBMd1cfD2SbO99+56K62avSzdcvrlPcWvfHXvr+96uP7vquo9XIK3fha8m+Ot7g8QHNfFwdsnzfLeuWVPWj7l3voFm7uL3+3/9NO0etHK+vX9quo93IK3fha8m+Ot7g8QHNfFwdsnQ+295aU30uJr7kgTTj63p/iVz/d7+cm12V7ROxy9h2vw1s+Cd3O81f0BguO6OHj7ZCi8u1/YMe+fJ/WUvhv/9px0/09npNfWviZ35rzxdomzt7o/QHBcFwdvn+T0Lt+Vo3yrtjvOvKqn+E364gVp2aR5afuru+SunDfeeHuEAgiDxnVx8PZJDu/db+5PT8xYXH9f3u7iV77Io3xhx56dB+WOnDfeeOtnaba3uj9AcFwXB2+fDMb7jfVb04PX35Umfv7wO3bcOeba9PxDTw/6rdqGs3fk4K2fBe/meKv7AwTHdXHw9kl/vcvn9730+Atp7iUTe0pf9zt2bHpmo9yH88Ybb7wpgDBoXBcHb5806r1vd1d6eu6KNOMbV/QUv5u+eGF6+MY56c1N2+UenDfeeOPd21vdHyA4rouDt0+O5b3tlR31F3H0vn7frV8bl1bNfiTt3dm8Czdz3njjjXd/vNX9AYLjujh4++RI3t2Xcbn3sin1H+92F797LroxrVvxXDrQObyf38d544033ur+AMFxXRy8fdLbu/yO3m/uWZ5mnPHjntJXvsBjybWz0pZ1W+Szct544413o97q/gDBcV0cvH1S+nbt3JeW3nB3/Zp93cVv+ld/mFbeuTTt3t4pn5HzxhtvvPvrre4PEBzXxcG7+unc/3Z6Yekz6Z4Lx/eUvhtOODvNu2RieunR5yvxY17OG2+8fb3V/QGC47o4eFc32zfvSo9OXdjnos2TTxmblk24J23dsE0+H+eNN9545/BW9wcIjuvi4F2tlN/Ne+mx59P8H0zu86KOWd/5WXp2wePp3//13yrp7XreeOONNwUQBonr4uBdjex4fU/9LdrKt2Xr/aKOB352R9q85pXKerueN954433YW90fIDiui4N33JRvwbZuxZr0q0vL7/aN6Sl+5St7y2v37dl+oJLerueNN954H9lb3R8gOK6Lg3e8lO/GseKXC9LUf/hBT+mb8Lnz0v0/nZE2rlpfv7ZfFb1dzxtvvPH+YG91f4DguC4O3jGyb8+/pOceWJXuGXtj/RW83cXvjjOvql/P7/3f7auKt+t544033o17q/sDBMd1cfAevim/k7fptxvrF2e+6e8u7Cl95TX8llw3q+e5fVXzdj1vvPHGe2De6v4AwXFdHLyHX7a/uis9cdsD6davX3H4un1FZn/vF+nZhU+mfbu7Kuntet5444334LzV/QGC47o4eA+PlG/Ntvq+p+rvwdv78i23fOWH6bHpi9Kbm3ZU0tv1vPHGG+983ur+AMFxXRy8denc93Z6cfmatPCKafVLtvT8iPcL30uLr7n9A1/QEdnb9bzxxhvvofFW9wcIjuvi4N3clIXud09vSA9ed2eacupFPaWvvIzL3EsmpjX3r0x7d71VOW/X88Ybb7yH3lvdHyA4rouD99CnLH3lCzaWTZqXpv3jZX2e1zfruz+vX7Nv5xv7Kuc9XIK3fha88R5Kb3V/gOC4Lg7eQ5N66Xtuc3rkpvl93p2jzK1fH5ceu2VR09+Pl/PWz4I33njn91b3BwiO6+LgnS/d3+lbPvlXafpXf9in9JUfL59yb3r1+VezPq9vOHgP9+CtnwVvvIfSW90fIDiui4P34NK5/+20YeW69NAv7k5TT7u0T+krX8G7fPL8ovRtlpU+zhtvvD3i7K3uDxAc18XBu/8pr8O39uFn62+9NvmUsX1/vPu1cemRSfPq3wkcDqWP88Ybb484e6v7AwTHdXHwbizbX9udnp73aJr//Zvq77vbu/TNPOua9MSMxWnLui1yN84bb7zxVs/SbG91f4DguC4O3kdO5/536pdrWfHLBWnmt6/uU/jGnzQmzbnwhvqrd7dv3iX34bzxxhtvZ291f4DguC4O3odTvgXbbxc8kRaOm/ZHP9otP77vyunpuQdWpd3bO+UOnDfeeOONNwUQMuC6OM7ee3cdTC8+sjotHT87zTjjx30KX5k7zryq/srd3/3m5fqLPdRzc95444033n/sre4PEBzXxXH0Xr3oqXTP+dfX332jd+Gb8uWL69/le/a+p9KO1/fI5+S88cYbb7yP7a3uDxAc18Vx9O6+MHP5/rtzL5qQnrrjwfcu1dL5jnw2zhtvvPHGu3/e6v4AwXFdHEfvNzduS7s3bEmd+34vn4XzxhtvvPEenLe6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P4CYjo6O81pbW08Y6O93XRy8fYK3fha88cY7v3fOLgGx+FitVhtbFMC17e3tJw30TlwXB2+f4K2fBW+88c7vnbNQQECK8nc3BZA/MPDGG2+88fYJBRCyFMCurvceTC4pffH2Cd76WZJtDdsAAA4ASURBVPDGG+/83jm7BAQkRwEEAACAWOTsEjDM6OjoOLEod2uKrO6V8uPF3Z/DdwD5ihFvvPHGG2/9LM32ztM0ICw8B5DnjOCNN954462fpdneObsEBKNWq11QlL9NRWYXt08eyH24Lg7ePsFbPwveeOOd3ztzpQA3XBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDiKjVahcUOae9vX1+S0vL8QO9H9fFwdsneOtnwRtvvPN75+wUEIS2trZTi3z20O3TihL48EDvy3Vx8PYJ3vpZ8MYb7/ze+VoFhKEofJfUarVp5e3i188UH7880PtyXRy8fYK3fha88cY7v3e+VgGR+Ghra+snyxuHfgw8YaB3VC5OV9d7DyaXlL54+wRv/Sx44413fu98lQLCMWLEiE8U5e+BkSNHfnyg95EAAAAgHDn7BAwjOjo6TizK3Zoiq3ul/HjxoU/5cHH7+tGjR39qMP+d8kHk+JUT3j7BWz8L3njjnd87Q9WAiBQF8dyWlpaR5e2iCJ4+0PspF6d8MKmfz8BzRvDGG2+88ca7ce98jQLCUL7ytyiAfyiK38FDuXug9+W6OHj7BG/9LHjjjXd+75y9AgxxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDBMd1cfD2Cd76WfDGG+/83ur+AMFxXRy8fYK3fha88cY7v7e6P0BwXBcHb5/grZ8Fb7zxzu+t7g8QHNfFwdsneOtnwRtvvPN7q/sDiKjVat9qb2//SpGbOzo6vjzQ+3FdHLx9grd+Frzxxju/d85OAUE4/vjjW4rSt6G83dbW9qXi9tqB3pfr4uDtE7z1s+CNN975vfO1CgjF6NGjP1X+2t7e/pNarXb1QO/HdXHw9gne+lnwxhvv/N75GgVE40/a2tq+URTAO4vbHxvonZSL09X13oPJJaUv3j7BWz8L3njjnd87Y5+AiHR0dJxR5EH1HAAAAAAwSIpSd2J7e/uaIqt7pfx4ce/Pa21tLf5R+7ujRo0aoZoVAAAAAIaYohyeW5S+ReXt4teTiuwpbn5EPBYAAAAADBUtLS0ji9L3nUM//p3Z2tr6l+qZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKkytVrugyDnt7e3zW1pajj/G544rPu/0ItcVt/+iWTMOFR0dHee1trae0MDn/ffil48ed9xxf9bW1lZrwmhDSqPeVTrv/rhEP+9GXat0viWN+kQ/3yPRyE5X7bxLGvGu2nk3+nd2Fc8bMlIsw6lFPnvo9mnFA+Xho31u8QD66/J9hsvbxa9/Xnzu4mbNOQR8rPAZW3isLTxOOtYnF5+zvvjcriJLRo0aNaIZAw4RDXtX6bz76xL5vBt1rdL5lvTHJ/L5HoGGdrpq5/2hfvxZVqXzbvTv7AqeN+SmeFBcUjxQppW3i18/U3z88tE+t3gQXVl+1dHr9+5uxoxDSeFwdyMFsHD/djPmaRaNeFfpvPvrEvm8G3Wt0vmW9Mcn8vkejWPtdNXOu5sG/yyrzHk3+nd2Vc8b8vLR1tbWT5Y3Dn1LecLRPrH4d1OLfLPXx7vKb6k3Y8ihoh8FcHz5lVfx648//elP/7dmzDaUNOJdpfPur0vk827UtUrnW9Ifn8jnezSOtdNVO+9uGiyAVTrvhv7Orup5wxAwYsSITxQPkAdGjhz58aN9TrE804sH3Nd7fbxv1KhRf9qcCYeGRgtgwYfL/zn0/9OaIR5ryGnwD83KnPcAXMKed6OuVTrfkn76hD3fo9HAdwArdd7dNPhneOXO+1h/Z1f1vKGfFAd/YvmgL7K6V9b0ek7Ah4vb148ePfpTx7if8lvKZ/f6eO+QDj5IGvBu6A+P8nkWxX3ddOjDjxSf/3+HdPBBksu7IuddZnH5lX+jLtHO+/00em7RzvdYNOoT/XyPRoM/Aq7MeXdzLO+Knvcx/86u6nlDZooHxrktLS0jy9vlK4a6/3nx4Gl73+f9VflVRXm7tbW1+NT2pc2dND9H+sPj/d7FHyCfL3z/R3m7+P/pvxaf/3gzZxwKGvGu0nl/kEvVzvtorlU+35JGvaOf79F4/05X/by7OZZ3Fc/7SH9nu5w3ZOTQV0d/KB4cBw/l7kP/qvwKY2vxoPovvT+/+PgXxeefceg5FaFfTl++lL5w3FRkdnH75EP/+Gje55RfTRX/7troryLrp3eVzvtILpU87yO4Vv58S/rhHfp8388RdtrlvBv1rsx5H+Hv7Ls+ZHLeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMOD/w/uyKmDNgt4wwAAAABJRU5ErkJggg==\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# To force the limits of the axis, use xlim and ylim\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.sin, (-1, 1), xlim=(-2, 2), ylim=(-3, 3))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## One-liner plotting\n",
"\n",
"You can also make plot with a one-liner."
]
},
{
"cell_type": "code",
"execution_count": 21,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Many plots done with a single one-liner\n",
"replot.plot([range(10), (np.sin, (-5, 5)), (lambda x: np.sin(x) + 4, (-10, 10), {\"linewidth\": 10}), (lambda x: np.sin(x) - 4, (-10, 10), {\"linewidth\": 10}), ([-i for i in range(5)], {\"linewidth\": 10})],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\")"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false,
"scrolled": 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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Another one-liner plot example\n",
"replot.plot([range(10), (np.sin, (-5, 5)), (lambda x: np.sin(x) + 4, (-10, 10), {\"linewidth\": 10}), (lambda x: np.sin(x) - 4, (-10, 10), {\"linewidth\": 10}), ([-i for i in range(5)], {\"linewidth\": 10})],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\",\n",
" palette=seaborn.color_palette(\"dark\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using subplots"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Subplots are defined by `group`. You can declare a group and add figure to it using the `group` keyword in `plot` commands, as demonstrated below.\n",
"\n",
"_Note_: Groups are represented by one unicode character. \"\\_\" is the default group in which go all the plots which are not mapped onto a group. Hence, it is a reserved group symbol which cannot be used."
]
},
{
"cell_type": "code",
"execution_count": 23,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Using groups to define subplots\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.sin, (-10, 10), group=\"ç\")"
]
},
{
"cell_type": "code",
"execution_count": 24,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Applying a grid on a figure, one empty subplot\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.set_grid([\"ab\"])"
]
},
{
"cell_type": "code",
"execution_count": 25,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Applying a grid on a figure, one empty subplot\n",
"# Note that if there is a single row, enclosing in a list is not mandatory\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.set_grid(\"ab\")"
]
},
{
"cell_type": "code",
"execution_count": 26,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Applying a grid on a figure, default group is masked\n",
"# Note that if we do not put the default group (\"_\") in the grid,\n",
"# it will not be shown\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10))\n",
" figure.set_grid([\"a\"])"
]
},
{
"cell_type": "code",
"execution_count": 27,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Using set_grid, you can define very easily (and visually) a quite complex grid layout\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.cos, (-10, 10), group=\"b\")\n",
" figure.plot(np.cos, (-10, 10), group=\"c\")\n",
" figure.plot(np.cos, (-10, 10), group=\"d\")\n",
" figure.plot(np.cos, (-10, 10), group=\"e\")\n",
" figure.plot(np.sin, (-10, 10), group=\"e\")\n",
" figure.set_grid([\"aaa\",\n",
" \"bbc\",\n",
" \"dec\"])"
]
},
{
"cell_type": "code",
"execution_count": 41,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# By setting the grid to False, you can ignore the groups you defined\n",
"# and plot everything in the same subplot.\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.sin, (-10, 10), group=\"ç\")\n",
" figure.set_grid(False)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9Z3Ae15U2OLNf1W7VV7Ozf8Z/NPNjRsG7Vbtb++Orna88nyV7LMuSHGSNbUm25bFkShYpisqBVCQlimImSJBgDiDBAAYQJAEGgAFgAHPOBAOIQBIklb32BNvCvs+9fRvNFx3u7Xtu99uNe6qOCLx4+/ZR93PPTec85y/+wooVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1as9Ev5+te//sztt9/+zbDv3HnnnUPvuuuunxR0ZOHnv0vKNitWwsRi10pWxWLXihUracr/XHAqzxUc0YGCg7kn6EuF73yj8J05+Lnw798WvluTnIlWrPiKxa6VrIrFrhUrVkpDCo5lQZgjKjiftwrO6GnP9zuTscyKlXCx2LWSVbHYtWLFSuoS5YgKfysv6C88v3d87Wtf+6tkrAuXEf/nI381+n88ue6jf3ry0Mh/euKOtO2RlQ+/8eu/Ldi9Z/T/+M2GEf/98b9O2x5ZKdj9j6P/6cnjBbsXPvIXj/yXtO3JMnafv/PB/6WAgRWFZ3l01D/96/+Vtj2yMuK//eJvCnY3QfFz2vbIygffePL/xrPGM8ezT9ueLGMXfR8+AL4APiFte2Rl6H975H+Dz4XvhQ9O2x5ZGf2NX92JMQ5jHca8tO2xkiORWIlWFFaij3p+v3rbbbf916h2v/rqqx7TsqdqfU+hQzNdOXSK8ftRydoRs1y7m2euStscKcH7nPfkcNfuU5v3JnLfvGL3cG2T+ywXPzfG+P2opGHCItdu/JwVwTMWduPZJyF5xS76vniW8AlJ3JNC4GuF3fDBWRGMbcLuPYs3JHLPKJxZyYlIHkUM8Px+RaZdgOjjj7/suXnTnM54bJjbMcbc/VRPV1u37/dgRxL2yOjVjps94/75GdfuqQ+/0nPjxhep2xX1jFoPt7o2Q6ueH5eITXnF7rwB79/yPC+f7Yj9bpLS69c+65n0wHOuzZMeGMI+K3XsXj7TccuzxrO32I2vVUPG3vI84RtKHbs3rn/OfK2wefx3BjJfnDZ2o54RxrQxdw9w7Z7x8zdTx66VHEmxIyo4nVuOUguO5x+xGsXPt99+e+Grd62TaReAZh3vhhm9fLaTdYiyB5/vWfzCePbz/rU7fb8LO0zbI6uHG/czWxcOHt0z05nAnj9yIXW7op7Rtrlr+U7r29PZZHv8vQN7rl351LhNecRu1+Ub7jOsfqOcPdddyxpjv5uk9OSu48zWuU8O71nwFJ/Antp1ouSxu2tpI7O1emg5G/jZYrH9hsVuDEWfF88QvgDPddu8dSWP3dYj55mt0x8Z2rP0hXHs5yMFX5w2dqOe0b61O/gpQWGMw1jHFovnulLFrpWcSMHpPFtwLCcLWln4+duFj/6y8POFws9/XfS9jwrO6OcFHXPHHXfcKdO26U6/t3Y7d+qvT+nZOmcN+3n9hMUl7YSgDdNWMls3lVf31H04l/3csmJr6nZFPaPlQ6cyW/et2dEz9zcj2M+YEKTliLKM3cMN+9jzW/Tc2J6dSxvYz7UfzI39bpLSpvl1zNZ1oyt7GsuWsJ+bFtSXPHZr35/DbMWzxjNnx8CGB/+8YvfkTmcRUPAB8AX4efmwqSWP3ZblW5itq96d0bN9zmoewlCxMnXsRj2j+sKYBlsxxmGsYz64MPalhV0rVqTEdKffOHkZ6wybZ67uObSRx6QseXlSSTsh6JKXJjJbD23c03OoZiuPRxk1P3W7op7RrF+9w497DrX21I7kE9edSxpy6YhMY2XrbL5g2TBpSc+JHcfYz5UDR8V+N0npircqeBzSqm09Jxt2s5/xWaljd8Ezo/iCpTB5WT9xiTugWuyq647Fm9jzWzNyXs+5QzwsZPa/vlvy2IWPha3bF23oOb/rCB8vCr44bexGPSMxXhzetK9n84wa9vPGydW5xK6VHInpTo/JnphIXTzZxrf3Hx1a0k4IOu0nr/Ft/DMdPZ3HuAOtHPRR6naFPaPr3Z+zuEUc++AICE5U7ATl0RGZxsqqd2bwiVRNU0/npW728+Qfvhjr3SSpGOj5IuBcz42LnZGDfylgFzr5By8wWzvbutnkVewEWeyq69qPFrgTKfgCFsrwnYHMR5QydisHfuQsAo71fNH9Cft52k9fTx27Uc8IR9aw9eLJyz0HN+xhPy99xX+jI+vYtZIjMd3p0XnRGS6dutw7QbnnqZ7uq5+VrBPiDnMAi/1C4scfPv8d+3+Y8tBLJe2E4Hy8E+zjzXwFvfDZ0bl0RKaxMufX77Hnd/bAWfa7d4Ki+m6S0uvXv2C4BX67r37a88d//0/284R7B7G/lSp2iyfYeOb4fc4T71nsxlAsVvH84APwu5igwA+XKnahU370Eu9jF6/1fPXnP7tYNh3HrINfMcHG2IYxDs8Y/w8VPzM7cbUTQCvaYrLTd1/7nE32xn37t+7gM+vx3iPKUnVC5w6ec3dNhE3IpMRnpoPS4zohKI4fvEfs7a1dfAX9k9dy6YhMY2Xi/TyT9mrnx+x37xGl6rtJSttOd7i7JsIesZvddqajZLFbfMSOZ84ymAvvwGJXXaf+y6vs+bW3XmG/u0eUDftKFrvwrTxhcIhrj9jNPuczXpQKfsURO8Jv8Dvb6CiMeWyj45r/jmuWsWslR2Ky04vBqOJnb7ifIcOPZQKv65sJXApOCLq/bhcPmh461bVp3lMfsM9O7z1dkk4Iiiw/b5KNcERjv/V0Lh2RSay4g9H3n3c/E0kKu6o3K7+bpPTo1kO30P9A8DM+O7btUMliF9nVxUk2IpvySvtNi10F9Vt4iySFoEzgUsDu6T2nOP1PwdcKe5C4gs8O1LWkit2wZwRWCzFeiM+w+2d60WUngFa0xWSnF6t67xHkpqnLeVLIjJqSdELQ5sp6dyJV7IgOrt9dkk4I6jdBcR3R2c7cOSKTWBG7wN4jyOIJdiniF5nqYiIl7Kn9gONid8pZ7DJZlN4JijiCN7n7k0fstp3pu/D2m2CXGnYP1Le42crCnvUOLpor16eK3bBn1DidE1c3TF3hfiaO4DEG5g27VnIkJjs9gufRCWrem9nns1XvzvQFdNpOCNrrdOpdm+rHV7lB1aXohIKcDibfeXVEJrEiMtaXvTbZ8xkP7l72apnyu0lKRQZiY8Uq157GipWBi65Swe7SV8qcZLG97md4ziKz0mJXXt2F9+DehfeJ7UdD44FLAbvNC3nFKPhaYU/zAmcxPnFJqtgNe0ZIVOLJYs2ez2b2+Swv2LWSIzHZ6UH9gk6AXT/xmUhMWDRkbEk6IeiKN6fxY+q6Xa5NTfPXOZQgS0vSCUGnPzqsT6C3cER7V+fPEZnEyo6qjTyDesxC97Oz+8843GrvK7+bpBS0H7CxpXqLa09L9WZOCfJhujRGYc9HcFaKhBvoujGV7DNQmljsyismHcULb5EghqpMpYpd0C3BRvBYCnsO1O0seRojwVkpEm6gm8r5SdeWWbW5w66VHInJTi8GI2/1hAvHLrHPZv7yrZJ0QlAR7H9q90nXpv0O0ztY9UvRCUEn3Pcss9GbMZdnR2QSK2Iw8h5Jdly4yj4rZ2UB1d5NUiqC/Y9sPuDac2Tz/luSg0oRu+U/fpnZ2HHhmvuZqGpjctGVR+yirxcvvOET8NnE+waXLHZFxRJU1RD2nN594pbkoFLE78xfvMVsvHD8kvuZqGpjctFlJ4BWtMVkpxel345uOeB+5mb3PTCkJJ0QVFDXoJSPsOmUU14rbS7AoGd0peOmk0H3/C2f59kRmcSKuwvsKVuIgHok1ED9KFVKAb8uB+Dh8649oj40YupKEbtIVkLSQvFzFeW1TO7+5BG7fgtvKLJrvVntpYZdlwOw4GuFPe3nOhOhVNHB76QitgAoFmD4bPGLE3KHXSs5EpOdHrt8bGV07OItn0/83uA+O1Wl4oQwAIkUfgxMwiZRqB58WqXohPCMGRXB4+/c8jkm32z3xyCbfh4H0flPj+RZ33tO3fL51IdfdXaqrkq/myQVWcuCrkjYc6WDZzSDx7AUsdt+nu+sgrrE+zl24PH5/N9+aLGroJh08IX3wVs+n/X4244/vuT7HNLGLpJWROassEcsDhjHXgnyWLo7q0V0ReePXnD88du5w66VHInJTo/jBrYy6vrkls9n/PxN9jniUkrNCYljPgz0Xpuud3/GyaHBpp+iIwp6RseaDrv0H/6O6B2jNuUNuzjmxXPD5MT7+bwB7/NYtf1npN9NUlp8zOe1xy88oFSwe2bfGZf+w/s5OOy8fdFiV057J3q3LryrhozrE6tWKthlC2+nihFobLz2iL7oDQ8oFfyK6lYY07zfFSdd2OzIG3at5EhMdXo/HjWhyE7zy0xN2wlBz+w7zXcdnMHIaxMqgeBvqFpQSk4I6gZ+D591qyPq4uWUTBLq5m0QZbsOd9/KoyYUWcFBmalp4/fiiVsHI689vYuutpLDbm/G9ZRb34PYjb/7qcASZha7fdUlMC9aeCMpJCghLG3sovIHi6996OU+9ggOViwU0sJu0DPqzbge0+f7pnks7QTQiraY6vRhyR7eYN9SckJQ8PzBNhBWF9vkl6lYCk4IunUOD5jfOHlZn2vE7o9f+b0sOyJTWAlL9hDF6hFbKftuktLiDHuvPX6ZiqWC3Z1LG5htqF9bfI1fcojFbrCGJXtsKFvGE5vmri057BZn2HvtqX6DFw9Ajd20sBv0jPatCU4O9EsOyQN2reRITHV6lMsK4p0SPHtNC+pLyglBwfMH2+rGLuxjk+Al83KVlYITgtaNW8Rs8+MpFGTQlw2RQedtEG11Sjv51aEVPHsNFSul301SWsy76bUnCV6yuNhtmBbMUyjIoJHUYrEbrSB850kTb/T5m8uzN66q5LDrcmw6vJtee0DFxOiAqjamht2gZwTKGtjmx1MoeFmR1JIn7FrJkZjq9F5W9+K/BXWatJ0QVFQqEbQpXpuQSct2fwJKgaXlhKBhJZPC4tay7IhMYeXYNv94Sij49fC32pF9KyqkjV9RqUTQpnjtwWfFtDalgl1Up4BtLcu39LlGxK0hxtViN1qD4imhosQlMtxLDbuiUolgK/DaI2htvJU2SgW/QZsZUJSGYzuXhqpH2QmgFW0x1el3Lgk+1hHb5qvemVFSTgjqHvE5kzyvTYJTb+vsNSXlhKDgyYJtp1pO9LkG/G/4G6gJ8uSITGFlX+12X3xCjzRyTr2lr/Tl1Esbv+4RnzPJ89ojOPX8QgTSxm4YPt1wkTU7jNmUJ+yG4fPULsGp15fKKm3sFnMXeu0Rk0O/sSRt/AaFM0FhL/6GEIc8YddKjsRUp/eWpCr+W1DgbNpOCIrYP2+8idcm1KNkRygBtWDTckJQ0NMwCoXTfYuPrx4xmx//rdqWK0dkCiveklTFfxM1guc+OUL63SSlq51a0LtXbutjz25RI7jwnVLD7pwnhjPb8GyLr8FxZVBog8VuX8W7x/Na7fOe4Rvwt+mP9qWyShu7otQm+l6xPSIuGztqaWE36BkFJTRCGwyXYLQTQCvaYqrTh5VxcqlJfvVOH0CnPQEUtXNF3IbXJmTPeWOsSsUJQUXmnx/Nh+njv7wNomHVUwQ1ybSfvCb9bpJSt3Zuw74+9iBr2RtjVUrYBf+fH+UO1K+qhcVusLphAGV9d3pFgogfI0Da2HVLVtZu72OPG08+2L+OcZr4Bb2WH+UOFGMf/uYtJ5kH7FrJkZjq9N56usV/c1P+f/xySTkh3qHfviVzy2sTiFXxN5OkynGcUPe1z3pGf3NAz4R7B/leUxwblhdHZAor3nq6xX9jz7rwN2RWy7ybJBWEybBNkFd77cFn+NsCg6TKcbALnfDdQTxL/VrfLPVdhusY5w273nq6fn8ff+9A5ivAtVdK2HXJq7ce6mOPYJQwyWUaF7+grYFtftRg+9eZrWNsJ4BWtMVUp8fxbtDWOOdZG8CIP0vJCUGn/Ihz/XVdvtHHJkFVgKSKUnJCQZUUhOLol+1cDp+dK0dkCivgo+PZ3v60E6VayWbGY8OYXZdOXe5jD0jX8bdiwtq0sRtUSUEoQjHw9+rXpxizKU/YBQ8oz/Zu8v17UCWbtLEL+heWqOZQbHnt6Wq7zv4GHta0sBv0jAR5tR9P5YntR5ndoGDKE3at5EhMdfqwrXGoX13KtJ2QX61Xr02Xz6Zfl9LvGYEig9GWBNR6FXUpEWyfJ0dkCisLnJ00lCLz+7u3VnTUu0lSi/uU1x5RmaC4VnTa2I3qU0hqYjuXz4yy2JVQnE6wnbQt/glfbq3oI+f7PIc0sVvcp7z2RNXgTgu/UX0qKNQp69i1kiMx1endnbTC6s3v7whELk5aSNsJYdePrTR/9JKvTe5uhcHyPqpOCBq10jS9c5m3QbR4J61YkQDil7SQJn5xpCdKFQbZw3crBhirqhEHu9jxYUk1v+mbVAM1vXOZN+wW76QVa9DJTNq+V5QNFWT1xfZM+eGLfDxpv5GKfX42XTrd7iTVDPP9fmdbt9GdSzsBtKItJjq9zIptvlve53TJOCHE/fFYk7cDbSp2VGk7ISi4/4L4vaBilwWr7Dw5IlNYmfRA391pr1a9MJ79HXyBUe8mKUWlDBYG4KmbW2yPqKmKGNxSwe6xbYeYTYsLz9Tvmt5dliEWuxKK5CS/3WmhLl9ofUuf55Da4uXqZ30W1sX2oKIUvoNyh2lg18+m03udsqFPj/T9vumdSzsBtKItJjq9WPmIuo5+6ndUkfYEEJm/LNvMU72k2Kag47+0nBAUZcnCeLKEg/VLXMiyIzKBlaiEGqjg/tq/dmfku0lK/cIAiu0JOv5LE7vgT4NNfqW0hAYlLljs9tWwhBqoy3O6rLHPc0gLu35hAMX2iKoa4DJMA7t+NsmE1oj68UEnYVnErpUciYlOf/4Ij33AgBP0neK0/7SdENQNOHfqAPvZFHXEkrQTgspQZQQViM+yIzKBlfbWrkCaF6FBFEdp4lfUAUbljCB7UCOYHf9tP1oy2JWhynBpYlqvWOyGKPp2EM2L0CAy+zSxK8IAvCEqxfaIesBBiVlp4FeGFgzxf/gO4gHzgl0rORITnb6X6DmYt6mY+DNtJwT1o5wotqmYriBtJ8SepVOOCETVQdehNiiLuTRQDzhPg+i5kDrAQkFuju8UE7ymiV8/yolie8KomdLCbuN0/izxb9B1eBds57Lwbix2g7XtTIezk9a3DrDQ5sp69p31RWT2aWLXj16r2J4waqa08CtTGEAQRYPLMC/YtZIjMdHpRWFvrNqCvrN55mr2HRSCLwUnBMWquHgnrdgmsXO5z7NzmaYTgvZSPzQHXheUuJBlR2Rk8SJB3YCqFPhO3bhFke8mKfXbSSu2R+xcokxjqWC3buxCvptatTHwujBKKYvdXo1KqIGCHsaPEipN7O51Si96d9KK7XF3LueUThlO1CaGTX6E8UJBX8R3LvfmBrtWciQmOr0oRxRWdkrUCl43urIknBB0vc9OWrFNYufSVGkqVScERd1P2IQ6oEHXieM/HBXmxRGZwIooO+UNAyhWt1bwu6VTy9otvejZSSu2J2jnMk3sot4yW1CF1PoVx3+iPKPFrr/6hQEU62G3VnBZyWDXLb3o2Unru9vm7FxOXJIKdv1skqn1K8ozmijDaSeAVrTFRKeX6aw4hirOXE17Aui3k1Zsk4i38+5cpumEoMhCg03ISgu6DnU02SBamODkxRGZwEqLqJn7wdzA7+D4n2Wuvjgh8t0kpX47acX24G9+O5dpYnexm1EdHFJRK2ocF96NxW6wIrMXzwmZvkHfERVh5hdVhEkTu347acX2wCf77VymiV8RUgEWhqBr/DYVso5dKzkSE50ek6OorXGZoPWkFXVSYZOopepnkzhqw4BbCk4IGsVbB60dOZfH0Cynj6HJ0yCKElp4TiipFfSdIF7FNPGL47OopCo3aL2w0CkV7MokVWEhie80Lai32A1RxMexGOaR8wK/E8SrmCZ2EbZQnFRVbE9vLWszFWHi4FfmVMUNdaqg3zCwE0Ar2mKi0/t16GL1C7ZPewLoRzVQbFPv8V9w5leSTggKJnrYdKXjZuB1qAOM76AucF4ckQmsIP4zavESFGyfJn5xpFccBtBnEHWO/5a9Wpa4fUHPB9QfUclJ7q771BUWuyHq1vwuWxb4nSvtN9l3yr7/fJ/nkBZ2EUpRHAZQbI8fRVfa+AXlUlRykskNAzsBtKItJjq9TFwPKB2K6TbSngAKnjTQ2ATZdCQghiYtJwSCUdSiHPft34aSjboJLlOqc+OITGDFjesJSZQIottIE7+VA53FS0vw4gULG3wHC51SwC5U0BMV11X2qpvg4okXttjtqxsnV0cmSsBHwFew+rUef5Hu4sWJYd4czAkL7kq2YRBQ7jIN/MrQEwXFC2cZu1ZyJCY6fVQ9SqhfEfi0J4CCRb/9/NVAm1Aflg2iA0tjEEVpJNiDUklh1yFQGd8LIovOoiMygRVB8gyC4rDvuWXVSmQQFYsXb+3tYntEbdIwfs4ksYuSdMXl6/wUC0nYHUYWbbHrIXle2hj6vclOWTXsBpYCdisHjuIxzHtOBdrjbhgYqmYUB7+oXAKbwqpCmazDbieAVrTFRKdHgHFxh/ZTOH5vbdK0J4B+uxHFNmGAxXdMFfhWdUKiHiXiAMOu8+OJy7ojMoEVWZ5Hv9qkaeJX7EZ0XAhevGBhU7zrniZ2/Wpv+6kfT5zFbl+V5XlE7Vp27F4iddhnPf6Os3i5FGiP2DAII7lOEr8Ys1CdBlVqwq4RSTcLipJusoxdKzkSE51+5i/k6jbC8bNB9PKN1J1Q0G5EsU0YYGEzBty0nRB+92PR99OomqtZdERGFi8+Nar91E28KUzAg95Nkuq3G1Fsj1tzNaVBtM/i5ZR/QkKxRtVctdjlGlSjulj9Em9SXbw8LBYv10Lt8dt1Twu/KO3GFi8PhS9eRH151DLOC3at5EhMdHpR/xA1gcO+B8fvzV5N0wkFdeg+g+g1ZxC9b3DiNvrZ42ZTPx/M/QU9s8/JXC1McPLiiExgRWAS2ZJh38OEu1QGUbEbUVy/2M8eUVdX7LqniV03mzoCkxdPtklNFPs7dl1MFp5r2PfAvFCcvZqm70WNcrZ4uRa8eIEWbxikid+gbOpi7bzUzb5X/tDLucGulRyJiU6PXTSZQabYYaXphFToETDQlsogKoiLwfMXdp272xJxVJwlR2Rk8SKOdiMGmVIaRLHQ8htkfAdRg8XpVbF7rOmw1OLFXZxFHBX3d+yKo13vrrSfguQc3/NygqaF3e5rnzNbJnw3evFSvGGQJn5lF9SyR8VZwq6VHAl1p/dL7ghSOH7vIJrmBFB06PlFHdrPJgy0Mjucpp0Qft8tQVwMFckikyOSRbLkiExghR8zPRV5zORHrJ0WfsUOGUIvorAru8OZBHbdxUsIcTFUhGfg3VjsBuvkH7zQJ7nDT11i7ZXbbnkOqSxexA7Zj6MXL/Oc8IyoHc4k8OsuXiRCamSSRbKEXSs5EupO397aJR1oDsfvHUTTnAC6MXIS1R0QzyET42jaCeF32RJJXroYEzblAbsuvcsDQyK/iwk3G0Q91SnSwq8bIydR3UFUjYmKcUwCu27VlZHhixfoJAm6mP6MXfTvsd96umfMPdGLF5mSl0mpiJGb9fjbkdhdLBnjmAR+RdUVbyWrIHXZJULoYrKEXSs5EupO33pYnq/JrU7hDKJpTgDd0nRFWbK+g6jIcg4pvZaEE8LvYJiHLWCcj7q27MEh7LtXOz/OhSOixsrls53s+YCcOOq7ojoFJuBhWElCRWm64ixZ30HUyXIOK72WFHZR2QO2hFVdEQr6D3z38rkui10fRZ/G8wEpfNR33brRFcF1o5PSoCxZP3tkSq8lhV9UVIItYVVXhAqKJnAZ5gG7VnIk1J3+xI5jDOwLB4+J/C4cP74rSjylOQHctazRlyfPz6ZensODqToh/I66rrDFWwM2SKc/MpTTP4RUXciSI6LGiqhOM/fJEZHf9SvxlBZ+96/d6cuT52eP4DkELVDa2JUpGSl0zhPD+SAaUnWhP2NXVKeZ/ujQyO9uX7SBfbd+XFXq2AVX7Ggfnjw/e1yew+rNiWO32KbekpFLI69bOHg0++7JncdzgV0rORLqTn9wwx4G9uo3yiO/65Z4mrYyVScE3TZ3LbMFbPpRjsgdRNemP4iiritsQZ3XqGvn/mZEn8zVLDsiaqyIjGrU+Iz6Libc+C4m4GFYSUJB/Cu7eBGVTrDgSRu7KI/FFi8hJSOFLnqO1109sf2oxa6PCjooULxEfXdPjagJPTt17IJwHbagelQUdjdOXsa+a6KcpSp+UZZQdvFS/foU9t1DG/fkArtWciTUnX7Pqm0M7KtHzI78bvEgmuYEsIwh64oAACAASURBVLeM0tpIR+SWC1saXC4sCSeE31EcHbagWHrUtaJ4uR1E/VVl8VJKgyhKf8GW4jJ//oOoP87TwK7K4gXvJE+DaJqLl0Mb93KcFyYmaWMXJRdhS3GZPz97gnCeBn5VFi8YC/HdPTVNucCulRwJdaf3O14IUjh+PojOStUJQYN2Rvxs2lS+3BlEg2tuJuGE8LvK8ULvSnRvLhwR+eKl4KBlFy+YcOO7mICHYSUJDdoZ8bMnaKc7Dewue20yX7w0RC9eMNHmg2j0ZLE/YhcTY9nFi1+YTmqLF1GjfOrySOwG7XSngd+a92byxUvt9sjrVMJ0soBdKzkS6k7vFxsVpHD8fBCdnKoTggbFRvkOooWBlg+iy1J1Qvh9zhPv8diow9EBxnYQDVeVxQsm3HwQHR2KlSQ0KDbKdxANiHVNA7sLn3UWL7uOR16bt0E0zcVLqxPrirjKtLG7oUx+8RIU65oGfpe9WsYXL437I69TiXXNAnat5EioOz2CYllix/y6yO/C8bNB9NnRqTohaFB2pJ9NLdVOBtiH81N1QvgdGauy2ZEqxxZZcETUWCmOSQ1TN9v9ifdueQ5p4DcoO9J3EA3Idk8Du2AKkM2OVIm56o/Y9YtJDdLebPc3UscusmgZE8TyLZHYDcp2TwO/lYM+Yrac2nUi8jqxYYDJbh6wayVHQt3pMSliHbp6S+R34fi9lDFpTgBdapc9pyIdUSkNoi61S9cnkdfaQTRcVRYvmHAXU8akhV+xeMEAGYXdNAfRYnsEtQu4Q6OuzdsgmubixY8yJu3FC3xqFHaDKGPSwK+gdjl/5ELkddiZZ7vuo2g3DOwE0Iq2UHd6FZoJlzT6p6+n6oSgsx5/h9ly4dilSEcE+pdSGEQZufM98uTOpo6u8zKIqtBMCNJoTMDDsJKELlBYvLiD6DOjUsUufgfhtuzixdTRdV6wG3SU6qeCNBoqSKPTwq5LqSWxeLlw7CL77qxfvZM4dottUiF3NnV0bSeAVrSFutOrcOQVD6JpTgDdDn3+aqQjOrX7JPtu5cB0B1F3Jf/9aPJXqB1Ew1WVI69UBlEMiHzxcjESu+ePXmDfxQ5GmthVXbzkbRBNc/ECxe4fm3w7pPCpLV4KCxHZxQsmW2zDQKLKlGn8isWLTGWaIK7DrGLXSo6EutNjUsRiIwqTJJnvYwAQ5YvSnAAGdWjfQfRIaQyibU4sDwieZa4N4tzKqiMiX7wUHDRfvByQ+j4m3qUwiAbtRvgPorfuuqeF3SsdN5kdqF8rc+2RzXwQXfpKPgZRY4sXSW5SxP+x2GGHFD4t7LpHqUdvPUr1s8dv1z0N/N644ZTVlKxNfarlhLNh8FEusGslR0Ld6VViI6BiEMWAkJYT8h6JBHV6r01+8V9JOyH865fNF6ZHGvfbQTRE3cVLS3RgN1QMom0pD6JBcaC+g6hCyTCT2FVdvCDYPk+DqKnFCybKMt932QOcyiqpLV4C4kD97Anz00ni92qn2uJFxLpTbxjYCaAVbaHu9CqB3VBvFmtaTihsZRk6iEoevZpwQvi3OIs6St1BdJAdRP1UdfFSnMWaFn6Lj6LDsKt69GoKu35Z1GFanDBmsXurYmKssngpzmJNb/Fy6y56GHahKkevpvDbfq5vFnWYmtowsBNAK9pC3emDOnSQegfdtJxQWGxJ4CCqcARgwgnh394dvTKpa1UH3VJ3RNRYUaHUgRYPumngFwMhbMDAKINd6KT7n0tlEPXao7oY8aMusdjtVRVKHShOAbw7hmn5Xm8IkAx2g2K1k8Tv+aNqixFTGwZ2AmhFW6g7fdBuRJB6g4DTckIiu8xvi76UB1HVwHg7iIar6uKlOOEpDfxiIFRZvEDFINpxIdlB1GuPamB83gbRtBcvxQlPWVm89CY8XUrERj+bTu9RSwI0tetuJ4BWtIWy04d16CD10gCkNQEMo8YIsmnqv7zqDKLXUnFC+FeVX0o18L7UHRE1VoJ2I4IUPJBeDrM08IuBMIgaI3AQFZRHx5MdRG9ZvKxTW7yY2nXPC3aLE5KitJivNQ3sYgGiunhxKY/2nk4Uu16bjm1VpwEzsWFgJ4BWtIWy08dJ0/dWMUhrAojqH0EdOngQfZtdc/FEWypOCP+CsBg2bJi0ROpaO4gGa5zFS+3IuXwQXZ7eIIqBkC1efMhxg+wRpOdn9iU7iHrtcavpjJwnfX2eBtG0Fy/rJy5hz7JpQX1q2MUChC1eHpdfvPRWbDqcKHa9Nh0QhQAKY5fstSaOru0E0Iq2UHb6OESdtR/wQXT3iq2pTQAP1LcEdujAQfTpkc4geiYVJ4R/GytWMRs2z6iRvn6iHUR9NewoNUjXT1jMrmmuXB+KFZOKgRA2YGCUxe7iF8bzQbQp2UHUa09zZT2zARMR2et7d92zP4gaWbwU+rbsNfAZuKZx+qrUsIsFCGyYr7B4ERsGB9fvThS7XpswVsEGLABlrw0qNJBF7FrJkVB2+jhVBurFILpwfWoTwLAOHWRTlTOIHm8+kooTwr/eZyd7vR1E/TXO4gWDp3cCngZ+MRCqLl6WD5uayiB6y+JluvriJU+DaNqLFyxa2AS84EPSwi4WIGzxUvClsth1NwxWbksUu16bti+89dnJaFC1nixi10qOhLLTx6kz2lCxkg8EM1enNgFsDunQgYPoUGcQ3bAnFSeEf90jyMIEVvZ6cXRNGf+Vh0E0Tp1RHJ95j+DTwC8GQrZ4+UB+8VL7/hx2zZ5VyQ6iXnvEESR2AmWvn28g/isP2HXjQH2OUoMUYQveI/g0Fy9YkMhiVyx6ty/akCh2vTZtmensnlaskr629+j6EKk9aWDXSo6EstPvF7ERb1VIX9Mbx7Y0tQlg8XGIjCNaLQbRmqZUnBD+9cZPyl5vB1F/jbN4cePYPpwfihWTioEQNtQrLF7qx1elMoh67cHEwxs/KaN5GkTTXrwU++o0sIsFCFu8FHypLHbdsJeZqxPFrtcmLPi88ZMyGsdXlyp2reRIKDt98apSRr2ZrGlNAEWH9tuNCBxEx/FBdEfVxlScEP4NKqQepm78F2EQdR4GUThm1cDu4kzWNPCLgTBoNyLIHrHrvmVWbWrYLc6gllF3EK3P/iBKiRORxOYXBxqkoC7yLnhSXbwUFiSy2O3ddV+aKHa9Nom6yyKDWkbjnNaUKnat5EgoO70I7JbNSoV669OmNQF0KRF8diMCB9Fp6Q+iqnWXoSaCqPMwiLY4caAqi5fi+rRp4BcDYdBuROAgKnbdy5alhl3VustQMYjuzsEgSrp4CUliC9Li+rRpYBe+EzZgQSKLXbHrLkt9ZQK/q95Rq7sM7Q15kI/XLlXsWsmRUHb6OIHd3moWaU0AXVJUn92IIJu2zVvHrtk4Ob1BVLV0GVTEf9lB9FYtDoqX0eJqFmngN2w3Isged9f9owWpYVe1dBm0vijr2mKXq5vE5hMHGqTFpfVSWbwUFiBs8VJYkMhiV5U/0gR+i6uoyKgYG/3CjLKGXSs5EspOH3aUGqQnd/bWs01rAti7G3FQ2hHtWtaY+iDqsv+f7ZS+3sTRdR4G0bCj1CBtPdTKB9En0htEiys6yGBXVJDBrnta2HVLlx2WK10GNXF0nQfshh2lBmlbUVWgVBYvBd8JG7AgkcWuqCAjdt3TwO9Cp44yarHLXmvi6NpOAK1oC2WnD+vQQXrOGUTnPjkitQmguxvhc5QaZJN7dP1ueoMoKnrABlT4kL1+09Tl7Jqtc9Zk3hFRYgU7uXgu2NmVvabtTAe7ZvqjQ0OxYlLFboTfUWqQPb1H13I1pE1gd/ojQ5kNbQqLl95d92qLXY9unb2GH6VOXSF9zZV2pyrQD19MDbtYgAQdpQbZ4x5dS9aQNoHfuU8O54uXwtgle62JDQM7AbSiLZSdHpMhgHzfmh3S17SdFoPosNQmgGI3wu8oNXAQdY6ul72a3iCKih5j7h4gzf4PxcQPdm8qX555R0SJlXWjK9lz2bm0QfqarvYb7JopKQ6ilYOCj1IDB1Hn6Bq77mlhFxMPtnhpl1+87FzSwK5ZN6bSYtejm6ZUO4u6tdLXwGeM/uaAnvHfGZgadrEACTpKDbLHPbp2dt3TwC8WfGzxUlgAyl67r3a7s2EwM/PYtZIjoez0y16bwkB+eNM+6Wu62q7zQfRHL6U2AcQxSNBRapBN2P5PcxC93v0Zu//E+wYrXY+jX1xXN25R5h0RJVZqhs9iz2Xv6mbpa653f86uGX9veoMoBsKgo9TAQfRwOoOo1x5MPDABUVm87KlpZnbXDJ9tsevRurELeVjH4k1K102471l2Xfe1z1LBLnxn0FFqkD2Xi46u08DvFGfx0nX5hvS1hzbuZddUvz4l89i1kiOh7PRVQ8YxkJ/YflT6mu5rfBCd8N1BqU0A3d0In6PUIJvco+vfjEjFCXW1dbP7l//4ZaXrw7i3suaIKLFSPbScPZdDG9WIvYFbPoh+ngp+3d0IhcVL79H1sFSwKybOmICoXA/SdVwHEnaL3V6Ny0la/tDL7LrOgi9JA7sI+wk6Sg2yRxxdi133NPA74V7e54Fj2WtRMQrXVD0/LvPYtZIjoez0cevjYgcF1924/nkqE0DWobEb4dOhgxzRpVOXmc0zfv5mKk4o7v3jUEaUqiOixErc+rjYuWa7AW3XUxlEpzz0UuBuRJA9YtcdE4A0sCsWL7Bd5fqwusf9GbtxqZ1mPDaMXQdfkgZ24bvY/U+3S2PXXTwUFl5JYlfY9Oc//Znf/161+4fVPc4adq3kSCg7PeqoAuSqtTqnuPFANxJ3QsyhFCZ/QR06yBF1XrzGbJ768KuJOyHIuQNnnR3I95WudwlgX6bLosvDIIr61XguqrU6sYsmBrE0BlGEAIgdSFns4siPhQ98Ty18gAq7baedxctjajuQouIF+C8tdns1DiE8FKcXuO5swZekgd3yh1/hO5CXuqWxC2UbBorhA1RY+bff/d4NWVK5VtQaB3VX1rFrJUdC2emn/ZTTkrS3dildJ46xLp/tSNwJ4djXmw0n64iuXfmUXTfpgSGJOyHIyZ3H2P0XPTdW6fpi7rosOyJKrMThVISKYyyEBCQ9iGIAHHP3UywZSAW7UJZAdM9TiQ6iwp7WQ+dihU8Uc9dZ7HKNw6kIXTh4DA/Z2XEslQngpPufY/eHL1XBrmA/uNr5cWK2Cpu+uP5JrPCJy+e6nNjF1zOPXSs5EspOH4eWBNobyN6auBPCZDWsY4Y5orHferpn3Ld/m7gTghxu2MezkF+brHS9l3Yn646IEitxaEmgbiD7zuOJD6JXu/hgVPbg88rYLXtwSODgaxq7YvGycLBaAlUx7Y7FLtc5T6jTkkDBYMCS9gq+JI0JIPwnVBW7vRsNVxKzVdh081KXk0A1XOnaYtqdLGPXSo6EstPH3ZoXJc1O7z6RuBPCcTXujeNrVUc00VnBdl/9LFEnBNnvKaGncj2OKqljF/MwiLqxfO3ymX1QQSIOKoukB9GOC1fZvaf95DVl7E79l1fZtR0XriWO3SObRfUftTAExDnGiR3MO3ZFLB8otVSuEyTi4DRNGrvuCUrBh6pid9bjTqjRcbVQIwqsXDl10QlDUDtBiQo1yhJ2reRIqDq9TnAugrpZAP62Q4lPAJGwwoJznx6p7IiQgSuy6JJ0QhDULca9UcdY5XrE27AEgIdfybwjosRKLyWGfGYfVATgH6hrSXwQvXiyjd175i/fUsbuzF+8xa69ePJy4tg9ULeLJyK9VaF0vWAMUKU+yjt24/oh1L3GdfAlSWM3yg+F2TP/qQ947OJ+tWRDCqxcPsSTORB3qXp9WLJhlrBrJUdC1el10vNB68AoODbsTnwCCMoalp4/xD89P8wRxV1563Z6yPaF6rVroVEr7yw5IrLFC4ul6yXFVVG3tvLKbYkPomedRKB5A/wTgcLsQfIQi108eC5x7O5eqV67VignP6eLXcw6dqFxTyLc2soFX5I0dqNOIsLsWTRkrBu7mBR2hU2tOzmdy/Jh6lREYXRjWcKulRwJVafXIegEsSuuBQlv0hPA3lg6f4LOMEfkxt4o1DOl6PSQLbN47VrUR1VtIyz2JkuOiAorCCZnsXTf94+lC1MQauNaEGwnPYi6dbQHj1HGLuLvWOyiQj1TKuzuqHJq146Tr10rFPGOlAkAWccuW7zc81SsWOSGab21lZPGbmtELHKYPYh7ZrGLjfsTw66w6VQj56JcPUKdjNyt3X5OLUmy1LBrJUdC1enPH70QO80dpZ1wLcpwJT0BjKrpG+aIwmoIm3RCkDi1a4WGZd9lyRFRYQXB5GGxdGGKknq4FiX2kh5Eo2r6htkTVkPYNHbdcoRT1csR4h2xBIDzVy12b+ixEWybu5Zdi9rKSWM3qqZvmD1hNYRN4/fIWl6NZt2YhcrX99KkXcw0dq3kSKg6/em9PDZiQQyiyw1lfDLTVJjMJD0BbKnmsXRrR/nH0oU5IsG/hdjFJJ0QpM6ZNKuWf4KCu5DFDF2kSQDI+iCKYHKWCPS4fyJQmGL3RExmkh5E9zuxdAjmV8Uu4u9E7GLS2HUnzbPXKLcx6/G3eeziiTaL3RtfsiQePA8k9aheC98hJjNJYxechWGxdGH2IO5ZxC4mhV1h077qBmfSvEz5epBA41qQQmcZu1ZyJFSd3i1188J45Ws3z6hh1zZOX5X4BLC50omlm7hE2REhDgTXqjLw63Z6CI4gcG/V8k9Ql4H/FE0CQNYHUQSTs0Sgpz5Qvnb7Iuc4c3xV4oPo7hVOLN1I/1i6MHsQfydiF5PGLp4V7o1np9rGPJEAcOCsxe6NL1kSD0sE+oV/IlCYirKQKCWXNHbhM1kiUEBFojB71ntiF5PCrrBp14J17N6bZ65Wvh5l4HAtxsosY9dKwnLnnXcOveuuu35S0JGFn/8u6Htf//rX/5/CP//la1/72l/dcccdd8q0TdXp3WLXb5QrX9tcWc+u3TBpSeITQHRkNvmsWKXsiHonYc2JOiHICo3Jp6gAcE6RNyyOI8oCdhFMjueB4HLVa1s8k7CkB1Hv5FMVu4i/E7GLSWMXz4pNPgvPTrUNEJ9TJgBkHbtI4mGxdIoVgaDespBJYxcLVzH5VMUu4p5F7GJS2BU2NU1fwSefleqTz+rXp/DYxU37jGPXSk6k4Hi+UXAwc/Bz4d+/LTijmqDvFv52pPCdjwtae9ttt/2NTPtUnX5f7XYG7pr3Zipfu6t6s3sMm/QEMCqWLswR4eiExS4uaUjUCUHiln+CCvJiVAUx6Yiygl0Ek/NEIDVSbej+dTvdY9ikB1EcobJEoKkrlLGLI2sRu5g0dlc6x884wlZtQ5AXHyFKAMg6dpHEwxOB1Ei1oW5ZyIIvSRq74vi5bqx/LF2YPfDVInYxKewKmxom8oUTQodUr1/17kx27b41O4xi10qOpOBU3io4o6fF7wVn0xny3V+rtk/V6XctbeSTuI8WKF+LDiESMZKeAHoTUFQdERxQ3EQMnU4PQfA0m8Qpln+CCvJiqgSAIEeUFezui0mqDT3SKEiNyxIfRHsTUNYqY1cnEUMXuyIBBUksqm0I8mKqBICsY7c3EUi9tre3LGTS2BUJKJum+E/iwuzBgjtuIoYuVuo+5LvX8Bmq12NsxLW7ljUaxa6VHEnB8ZQX9Bee3ztw1OD33YIjGnPHHXc8WPj3zb//+7//P2TaRyf7+GOnzI2GNi2oc4NjVa89vMk5Pn59Sg+VPbIqjnH31jb7/h22BNkkEgAaK1YmZq+wZ+6TgoKmVbkNsQNzsL6FzKYsY1eQamMHWvVatybz4DGhWDGh9Q4Fzc7Fm5Sxu2PxxltiF5PE7iJBQbPzmHIbeEf8+HiLxW5BD3gSgVSvdWsyPzkicew2OhQ0W2fXKmMXdGGCiiUp7AqbVr/Nid9F+TwV3VC2lB8fL6g3il0rOZKCU6korEQf9fx+9bbbbvuvAV//S/znb/7mb/7XgsPaI9N+D5G0LOQTwN2L6pWv7TjKHdHyVydRmSMta97jlALnW44qX3uohsd/IS4kaZnjZEN+fu1j5Ws3jedH1ycbdpPZk2XsHlzFJ4BNM1YqX3v9PK9Pu2jQKCpzpGXjOPEe9yhfi3fPdmAKWEhaFg3k2ZDXL3QqXytisND3qCTL2D2xSbzHRcrXfn6Nk/fP+dU7VOZIy7YK5z2u3qZ87fldPOFw7fCZBiwLl+Wv8NAbjFmqgrEx7hgZJDJYs5JhcY4iBnh+v+L3vcIK9OHC3yY6v/5PBUf0e5n2ASKKVR8SOHhwrPrqBmnxgkKGyh5ZFWXojjcdVl6J6uwc6az6IFMffoVTuVy6ptyGyMLELpDJlWhWsCtItZGFrnrtxROCQubtxHdRVrw1LXQnN8wed+forYrEsTvrl7wM3aWTbcptNFbcSl7c37HrkmrH2MkFDRSjkHn41cSxu+bDeaE7uWH2gHbLG7uYJH6rnuWhN2cLY5bq9dj5Y8mOZUuNYtdKjqTgXP4Rq1H8fPvttxf8y13r8HPBOd3h/V7BEX2n8Pf/Fz//wz/8w/9e+F6jTPvoZACTbjyCG99QvVn5Wi+JNJU9slo5cBS79+k9p5RjUXRix3TiPiCTHohP5kydAACbsoxdHVJtL4l0GFZMaFQsZ5g9OrFjutjVIXOmTgDIOnajEoHC1EsinTR2o2I5w+wB8T6LXRzoTyJtEr/znNCbOGTOiP2LGyevgl0rOZOC0/mo4Ix+7sSagGbgLwuO5kLh878u+t7TWLUW/vZB0tloSOCIm+HklpF75I3EJ4BznniPx9Id8S/nFuaIesvIqWeP6nR6iE45NzcBoJwmASDMEWUBu+tGhycCham3jFzSg6jI5g4q5xZmT28ZOfXsUV3s4lnh3nHKufUmAFRa7BYUSRRhiUBh6i0jlzR2RTZ3UDm3MHtQepMdXT8xPDHsCptmPjaU3TtOOTfBlIFsYNPYtWJFSqg6PWrpiuBY1Wu7Lt9g10750UuJTwCnPzqM3bvtTIeyIzqx/SiP/4rBH6fT6f/0xz+y+0783uBYbbgUDOMWZdoRUWGlZvgsJxFou/K1GERHf3NAz/h7ByY+iLp8jgfPKWMXRMosASAGf5wOTiDjvzOQPTM8O9U2RAIA6odb7H7JaFR4OId6RSDoxPsG83jM7s8SxW4Un2MYdttO87jbGY8NSwy7wqapD73E7t3VfkP5evD/iWTHLGPXSo6EqtNXDeEs55gUqV7bfe1zdu2E+55NfAJY/tDLvEO3XVd2RGf2xa8godPp/+3L37P7wvY4bYgKALUBJKxZcURUWKkeWs4D0jfuiXX9hHsHsetvXP88UfyKii6oBqGK3Ysn29i1cSpI6ODkz3/6M+/r3x0Uq42DG/bwhLGhUy12CwoiZTyPOBWBoFOcCc2Vy9cTxa5b0WX/GWXsdrZ1c//343j+TwcrEwtjFO6NMUv1erda1vPjMo1dKzkSqk4//+mRDNyYFMW5ftw/P9Mz5u4BPV999VWiE0DsovEO/ZmyI7pwLH4NWZ1O/8X1T9h9sXsZpw1vBYAsOyIq7C5+YTx7HseaDse6fvIPX+RHmh03Ex1ERU1n1INVxW7Hhas8ASBGDVkdnPz77//Ad/sLzyxOG8e2HWbXI3nLYvdL1odZIlDMcpTTH3WONM92JIpdUdMZdbhVsdt99TN+AnL/c4lhl6uz2/+dgbGuF8mOqAmcZexayZFQdfpZv3rHCY7179BRWvYgjwv6z3//j8SckBsDU5h8hnWyoGfU3trFEwB++npiTohlf12+6sTAvBerDbcCwMs0CQBZH0QXPBOeCBSlFT97nSc1FPCQ5CCK4P2wRKAw7F7t4ouIsgeHJIrd393kg3fFz96I1QbeEU8AGGWxW1CdikDQOb/mMdDnj55PFLtuIlDrFWXsQhG3GDcGOq5e6+qN941zPRJHRLJjlrFrJUdC1ekxCRKDoI5D+P2nXyTmhEQWXNggGOaIrnRwHq3JP3ghMScEO66euaQ1CHorAGTZEVFhFw6ZDYJHLsS63l38HL+Y6CCKQRALmKBYujDsssXP3eGLHxPY/aSjW2sQRLIWW/z8Ot7iJ2/YRSYsnkecikBQsfg5U5hYJ4ndqESgqAlg1OLHhHac7834j3M9Ekf44odmw8BOAK1oC1WnxySIxZIUJkVxrp/pcIN9dvVmYk4IR2dRx2Chg2j3524CQFJOCHa0Hz6rdQx27lArTwB4ckSmHREVdqc/wo/B2s52xrpehD8gnimpQdQ9BgtJBIoaREUCQFD4gwnsdre2ax2DIVmLhz8Mtdi98SXLhGUsBoU+Hed6Ef5wvPlwohPAqESgKOyK8AdwGSZhL/SSEzeL4+s4119pdzYMYoY/lAp2reRIqDo9JkFxM/ugyEZkgfQXOxNzQgiejwqEj3JEIgEAk8EkbIYdqFrCssmGlsdq49JpPggjiSDLjogKu8g+j5vZB0UWOM9oPJrYIOoGwockAkVhVyQABCVAmcCuqPqDpLE4bbiMAQXbLXa/ZJmwbPFy2p/FIEqr3+AJUIc37klu8SKS/kISgaKwKxKgLp3yT4AyoeeczPl5A+JlzosNA4wZWcaulRwJRadnwNbI7IMudOqDdp24kNgEEPQZUVQYUY5IJABgdZeEzbDj9JZ9DhXGrFhtdF5yJg8Pv5JpR0Q1YE3QyOyDggcS1x9p3JfYICqoMMISgaKwKxIAgiiQTGD34h7OPwjaqDhtiMkDdi8tdr9kmbBsJ6ywIIhzfc17M9n14KhLCrtYaEUlAkVh16VAirnzGUe9db/jtsE2DLBRQrBhYCeAVrSFotOLre24mX1QVCRgg9H+k4lNAEGgi3uGkeFGOSKRABCHGDRupz9axwlFQWAcpw23AgBRFl2WB1EeCxc/sw+KSjB4nvvX7khsEO0lww2OhYvCrkgACCJBN4HdM9t4BRIQx8dthzMGBMc+9j4DqQAAIABJREFU9hfsQpEJyxYvV+Md47sVnJY1JoZdl/g/JBEoCruCBB3xzElgF3pk8352z6WvlsVuw90wiBkqVQrYtZIjoej0Mh06Sle8VcFXdNsPJTYBRAkt1qFDymFFOaLe7Gf10kBxO/3+5byk0IayZbHb0akkUiqOiAK73koecdtY8+F81gZqQyc1iPaWwwpOBIrCrm72cxycHFu/k90T9bPjtiMYA+JUEskTdr2VPOK2sWHSUvYsmxbUJYZdb+nPuNjtLYN4MBHsQg/UceyijF3cNig3DOwE0Iq2UHR6mQ4dpbUfzGVtnGzYndgE8ECdw4dXmHzGdUS9/IenE7EZdrQsrGP33DyjJnY7k+6PX0u4VBwRBXa9tXzjtrF+wmLWxvaF6xMbRI9tOxSZCBSFXZf/cFs8/sM4ODm4agu75/qJS2K3o1NLOE/Y9dbyjdsGfIjwJUlh9/TeaD68KOwK/kNwmiaBXejulVvZPdeMnBu7DcoNAzsBtKItFJ1edOgFGgSXKEvGgpFrmxKbAO5e6VTE+CC4Q0c5IlEBBSzvSdgMO5pnrnJW7fWx26HMosvyIAoiWp7ZF5/Mu2HaStbGllm1iQ2iIP7FPcMqYkRhV1RAQXWNpLC7p2o9u2dDxcrY7QgS4Ysn2vo1dmVYDKK0aX6dc5qwNDHsylTEiMJuraiAsmpbItiF7qjawO5ZP74qdhuY9FJtGNgJoBVtoej0bod+YXzsNjaVL2dt7F26MbEJ4I6qjbxDjwvu0FGOyK2BvEm9BnLcTt9YttiN24nbDmUWXZYHUVC3sN0IjXJ+2+auZW1smlKd2CC6pya6Jm4Udt0ayKubE8Pu9tl8x2nbvHWx23HLiB0426+xK8NiEKW7ljY68cQLEsPuoY17OYtBSE3cKOyKDYO4NZDj6NY5a/jiZery2G1g0ku1YWAngFa0haLTux36jfL4nWs271w7561JbAIoOvSmkA4d5YgQzM6y6NbsSMRm2FE/ap6buRe3HcosuiwPoihGzzL7hoyN3QYGIbRRN3ZhYoPoziUNfOAeE5wIFIVdJBGxPre0ITHsbp7CY85gf9x2Fj0naHeO9WvsyrAYROneWp5QhmzgpLC7z7nnqndnxsau2DDYOmdtIti99Z5rYreBSS/VhoGdAFrRFopO73UicdvYvohvr2+rWJ7YBBATv6gOHeWIEMzOduOqNydiM+yofXc6uycm3nHbEVl0yITOqiOiwO7hhn0OLcnk2G3sqWnioQTvz0lsEMUOGu65cXJwIlAUdpFEpLsbp4qTDWN41il2MOO2s+zVMj6INu7v19g9uTOaxSBKD23c44QSlCeGXZxcsESgjxbExq7YMGiYuiIR7EJx9Mt3HTfGbgOTXt3Fe9rYtZIjoej04hghrENH6e4VPMB20/hFiU0AcfTLOnRVcIeOckQIZkcbzZXx4/FUO/2K18q0jxF6s+gOZNYRUWB339odfDfinfi0JCIeD4HpSQ2iiKFjwfszV8fGrkgAaKxYlRh21w7nAyCeWdx2kIXJaXd29mvsHtkczWIQpceaDjvJROMTwy5il1nc4aTgRKAo7IoNA514PFWtHTlXO+7QS7uTVexayZFQdPreQOL4tCT71/EU+3UfzE5sAigyj5EMEtcRYfDUzchV7fSLnxutTd8haHeQCZ1VR0SB3ZbqLdq0JKCiQBtLXp6Y2CAqMo+bK9fHxi4WLboZuao4WfkGPwI7uvVQ7Ha8tDv9Gbv763Zp05LAh7AEvmdGJYZdd+ExPXjhEYVdsWFQq5GRq6orXZ+5K3YbvbQ7+hsGdgJoRVsoOj06su4k6EgjJ9mseXNqYhNAmUlQlCMSR3E6k1/VTj/fid87f+RC7HZkJr+l7ogosIsJlO4kCGS07Chu0EeJDaLuJKg6eBIUhV2ELehOflVxsuR5Hr93qiU+ga87+V0YPPntD9ilmASBBBxtgBQ8Key6k6D5dbGxSzH5VVVRrEDn1MRLu5NV7FrJkVB0emzl6x6DimD8ZS9NSGwCKNOhoxwRAuh5Fl28qhxxOv2snzv1P892xm5H5vi71B0RBXZxhKp7DIpEGhaM/+SIxAZRUX0ER9hxsYvEJR6MH//4WxUnlU/zDN5WjeQjcfwN2p3+jF2KY1CUAUQbKAuYFHbdY9ClwcegUdjtPf6OX5VDVUW50lMacdO9x99LM4tdKzkSik5PkQhx1im0vWjQqMQmgKJDhyVCRDkiUGhwOo54dXnjdPppD7/C7tl1+UbsdtwEmNnxM9rSdkQkixeCRAhQ6XA6jjcTG0RF/WEkscTFLjIReQJMvLq8cXAyx+Hwu3S6PXY7Mgkw/QG7mADrJkJ0tV1nbZQ/9HJi2BX1h/eGJEJEYbc3ASZ+XV5VnTfgfc6ccDA+/ZBMAkypY9dKjoSi01NQoYDUle2i/PrdxCaAoE/gHfpcbEcEEl20AVLdJGyGHZPuH8zu2X0tfkFxlwKnPD6nVdqOiAK7FFQoINNGGyDXTmoQBW0No0LZfjQ2dl3+ziHBhLzU2K1wqnh0XuqO3Y4MBU5/wC54J3WpULqvfcbamPi9wYlhF3RhnMUgmIA8CrtiwwCTsiSwC535y7f44uVkfAJyGQqcUseulRwJRad3yZBDdiOiVJTkmvHIG4lNAEGginuCUDWuI0IZLZZFp0GCraZO/c9/fkarHZe7btyizDoiCuy6ZMgatAzeklxJDaLzHTLkM/vOxMYuqhGgDZQzTAK7sKPswSHsnjolCHt33YNJsPsDdsE7yWlJ9MiQUUsYPuWrr75KBLtVogRhU3AJwijsXjzJNwwwKUsCu1BRgrDjQvwShGLXPYwEu9SxayVHQuGIRDm0sN2IKEVhd7Qx5YcvJjYBRAkl3qGDy6FFOSJvFl0SNl+78gm7HwZSnXZAZYB2Vr8/J7OOiAK7ohxa2G5ElF6/7kzKCwNpUhNAlK6D3ReOXYqNXdQjRRuoT5oEdmEHntHYbz2t1Q7lrnuWsbtalEOradJqBwsXtPPH//jPRLC7wCmHFsZiEIVdTMLQhk4Nb1Ut+/7zfPHS9XHsNih33e0E0Iq2UDgi7CDw3Yj49Q0xiI7+5oCeCfcOTGwCKLMbEeWIvFl0SdjceZE7Pp36n1BkPqMdcNdl1RFRYHex2I3YFrwbIaM4QkM7f/7jnxLB77Sfvs7u197aFRu7l891sTYqfvZ6Iti97hw3Trr/Oa12jm07xHfdX5zQr7GLvstYDOr1qJxEXfA/fP67RLA7+1/fjWQxiMLu1S6xEH4+EexCceoy5u4BPTiFidvG6b3OrnthEpxV7FrJkVA4IrdDH41PSwKd8N1BrJ0b1+PHtil36HueYpPPuI7Im0WXhM29CQd6Rx8UJLJpOyIK7FYOHMUz+3af1GoHQfRo599+9/tEBtHJP3iB3e9Kx83Y2L3SfpO1MfmHLyaC3a62bp5w8OOXtdoBhQzaqRz4Ub/GLhWZu6gL/vm1jxPB7vRHhkayGERhl+26360fCiOriLdmi5fCQk/nGWHSi3YwZmYVu1ZyJBSOCJMfXVoSKI5/0c7VkEGNrkP3Bj9HdbKwZySy6KY89FIijqj10DmS4Ge3Bu5z8Wvgpu2IKLAL6hZdWhLo9Ec5Nc+XNz5NZBAdf+9AtmN+vTt4sRQ5iHbzQW3CvYMSwe5lZ7E047FhWu24tDu/GdGvsYsMWMZisPO4VjuiLvjNS12JYHfKj16KZDGIwi504n36yXCy2tV+g5+8FBYvOs+od8NArw+kiV0rORIKRyR2Pzrb4mf2QXEUFXWsRdahPfQHUZ0s7Bm5E8n7wieSVHqqxaE/eDZ+/U8okgfYUcRTH2TWEVFgV+x+hCUCyShCANDOx+1XjQ+ishM3mUFUZiJJpedFuMQTeuESbgKA5i541rE7z0kEOrs/OBFIRisHfcR3k09dTGQCOOG+ZyMnbjLYxaI7aiJJpZfPdnLMFRYvOs8I2e8Uu+BpYtdKjoTCEU28/zneoa9+ptXO7F85ge3HLxrv0LIrMRlHxGNDwo+SqRTHPezo9mW9o1vKBIAsD6K9iUDxM/ugSAJi8aRn2owPorJHtzLYlTlKptLTe046R7d6CVPt5+kSALKMXZlEIBld8tJEfoJz8LT5xQs7uh0QeXQrg12qkycZRXgTWzD/ZrjWM3IZAzTjYNPErpUcCYUjQlafbmYfVCST6K5oZVQ2eUPGEYksOgQmm7b74HoneeMtveQNsaKt+NkbmXVEFNhFEDl7d53xM/ugIpmk/chZ44OoSN5AIogudgW1RRK77sebDpMkbwjGAGRl9mfsihMT4EGnHZFM0rrziHHsuu8ugsVABrsyySRUKiiTqgaP1n5GgjEgq9i1kiPRdUSysXQyWvW8QyezIz6djKy69C0R2VgyjqjcqcwRRidDpYK+pfYDPfoWHJuw2MUf6ccuZnkQHf8d5whUc/dW0Mlc2H3M+CCKHR+2e/v429rYFeS2F47r7SLJKKh2cK/lw6ZqtSMYA3B83Z+xK2KmEZ+m046gkznVuMc4dgV9CzKPdbE7X9DJ7I3PPiGrgr5l+auT9E/MiGIX7QTQirboOiJ3IkGQBAFyTLR1pDE+obRqh8akU9cRIagdbSFD17TdOx0C53pNAmfKiXtWB1E2kSBKghCE0qe37DM+iGKHXCYRSAa7ohoOKiuYxu7eWk7gvHqEPoGzG7uoOXHPKnahVBMJQSh9ZG2zcewi1pYlAv38TW3sCv5Z+HLT2BUEzrXvVOhP3EUSjObE3U4ArWiLriOiPEoUJeX2hxS4p+7QUXVQZRwRgtopMklldNvctexeFCXcqI7uszqIUh4lipJyR+t2GB9ERQY3alnrYhfJRBSZpDK6aykv4VZHUMKN6ug+q9iFUh0lipJy+6objGNXZHDPeWK4NnZl6mFTKcqcsoX3qHklc3RvJ4BWtEXXEVEmE6wdNZ+11bJ8i/EOvX/tTnavVe/M0HZEIgEgjNmeShumrWD32jq7VrstquSdrA6ilMkEGyYtZW0dWNFofBAViUBLIhKBZLArEgCObjloHLtN89exe22cvEy7LarknaxilzKZYMusWtbWrgVrjWMXfJsyiUAy2F359nS+YbBup3Hs7qrezO7VMGlxySTv2AmgFW3RdUSUdCLrJy5mbW1fuN54h25ZsZXda83IedqOSKa2JZWun+A8o0UbtNuiou/J6iBKSSeyeUYNa2v3onrjgygqP7BEoIgqLjLYRTwe2jq4frdx7G6evorda8vMGu22qOh7sopdSjqR5oK/RVtN01cYx65s7XQZ7NaOnMv7XMGXm8Zuc6XzjGasLBn6HjsBtKItuo6IklC4cdpKPkDM0t/dilJMoHgsXZW2I8IxMto6tHGvcbvXfDjPcXr6u6QujcKZjkw6Il3snjvISbUpCIWb5textppnrjI+iKL2K+5VMzw8lk4GuyJ2cU9Ns3Hsbpi0hD+jBfXabQkC73OaYRdZxW7baTpC4ZbqLXx3a2KVceyKRCDEe+tit27cItbWjqqNxrG7eeZqZ5d0nfYzEgTeGDuziF0rORJdR9RbUqxMu5P1xrdVG+/QW+eskYqlk3FEOEZmMTRrzMcuintRxElSlfDL6iDqlhQbpF9SbKcT37Z58hLjg+jOJfxeiDvUxe7ajxawtmC/aeyuG83vtWtZo3ZbKAPHMlc1S/hlFbuipBhFDfLe+La5xrG7r3Y7D715Vz/0RsQubp2z1jh2N06mi5NE+U0edqFXws9OAK1oi64jOlAndxwlozsWbyTJcJXRhqkrpHYbZRwRjpFZ7GK1+dhFkSlNEfgseBfBcZVFR6SL3WPbDvHjKE1eOih20NDWhjELjA+i2+bxWDrEHepiV+zKYQfTNHbFbiOygXXbEryLOFLsj9gF9QkLvYmgsZJRnFxQZbhGqYilW/PhfG3sitjFhmkrjWPXzZRe06T9jATvIkI5sohdKzkSXUckeOnAJaXbyXavFHF5c413aBFL1xwRbyjjiOrHV5HF5UWpGPhOEFAfLBoylre1XY93MauD6MENznHU0HLtZ4kYOrS1dsQs44OoiDdsnL5KG7uNFTwuD22axu4KJ97w0Ab9eMPqN8qdsIs9/RK7Lo3VkHAaKxk95hB0r3i9zDh2RbxhfcH/6mJXxOWtn7jEOHZrP+Dxhicbdms/I9Ag8bCLpkxi10qORNcR7XB46daNWajdyZDNxTNzpxvv0CLjGCtSXUeEY2SembvGuN0i4/gMQcbxslfL+G5i4/5MOiJd7O51jqNq3pup/SxFZu6qYeXGB9ENZcvYvbATqItdsZtIkZkbpUte5hnHx7bqZxyvencmP5IrvMP+iF2cAOD/H1Qous9SZOYuKSwITWNX7NptmqofeoNQArbo+miBceyKjOOzzQe1n9G6MZwyCqEcWcSulRyJriOiHEBAAE3l1KJUdgBROYqIcmoUKjgHzx85r90WFY1CVgdRygEEPHoMuy+ONz6IigEEiy9d7FIu4KJUcA6eajmu3ZbsAi6v2BU0VujDus+y1eHmq3z6A+PYlV0sy2CXcgEXpWKxfGnfCe1nJLuAK1XsWsmR6Dqixul0R0gntstV56BQ2SMkqaMIcawxPjyjmEJF1ZG20+3abYljjd0rt2XSEelil/IICZU0WDb8wA+ND6LuEdKq8Pcmg128e6oQjihF5RKWuXtQv+qIbAhHXrG726GxqiUIl0EFI5ZQ8vjbxrEL1gWZcBkZ7FKGcESpCJfpPNaq/YxECIfumGkngFa0RdcRCQJciiByUXB7wTP6gc1RKhtELuOIBI1CFKcghaKGJnNEl/TrDovA5qidpFJ1RLrYpQwiRy1dtDXvifeMD6JuEHldeBC5DHb31+0iS+KKUtQuZrsoJ9u025JN4sordkF9gv//OoKEOdQwZ5QyP3vdOHYFd18U2b8MdimTuKJU1B3ubm3XfkZuEleZ3qmZnQBa0RZdRyRKYFHQSFw4SkdtEKWyNBIyjkjQKERRG1Bo2YNDuCO6+ql2W4LaAPQ7WXREutilpJFob+1ibc18bKjxQVTQSICCSRe7Rxr3s7YoaJyitOKnvARWx/kr2m3J0jjlFbvALPv/n6JPmXW16xPW1pQfvGAcuy5lVgSNlQx2KWmcolRQZn3S0a39jFwaJ82SiHYCaEVbdB0RyGh5RpM+tcPlMw656WP65KZRKkskK+OIZMlNKXTcPz/TM+buAYWfv9BuS5CbNlTo7YBldRClJJJFYXe0NfWhl4wPorJEsjLYRQY4O7omIHKP0sk/fJHd62rHTe22ZInc84rdBkLS/OvXv+gZ/c0BPRPuHWgcu7Kk+TLYpSRyj1JBmv/ljU+1n5EgckcoRxaxayVHouuIxHEURSmprja68kZRKltKSu4ogtMoVEWUN9LV692fs/tMvO9ZEkfdXFnPjyIm6cXAZXUQpSwl1X2Nv5tJ3xtsfBAVpaRQhlEXuyLsgqKUY5RO+O4gdq8b1z/Xbku2lGNesYu4VRYDWUlTNnPCvXTvJkwR381CbyLKZspgl7KUY5SKspn/9uXvtfu3bCnHUsWulRyJriNCQXqAmaKYPI412SD6gH6B8yiVLSYvdRTh0CiAosWkzVfab/IJMtEuE1UWbFYHUepi8mx39p6neih2Z8O0t5j8RW3snnfCLmb96h2jNmOXCTvX479Ds8sksmBxpNgfsSsquOhmQQud/IMX+O5sp/7ubJgucGLpTkfQWMlgt/38VdbWtJ+8ZtRm6MT7n2P3+tMf/6iNX0EZhVCOLGLXSo5E1xEtHMypHUCDodvJYMfYe55mA6npDl32/ecdh/extiMSNApznhhu1Ob21ivsPjMepYkz27uaV69AhYYsOiJd7IJuCP//FFVVoJMeoIvPDNOKn73B7nP5bKc2dtsKbbCwi0eGGrX52hW+uJv8g+dJsHt4k6CM0gu7yCp2QX2C//+9mjyIQjGJklkQ66qgsWo9HE5jJYNd+G6OqReM2gwd9+3f9oz91tORNskoQjdgN0I5sohdKzkSXUALagfQYOh2MtiBIzQ2iF4zexQx/t6BLO4FOxO6jkjQKOBY2aTNF0/wI4+5v36XZBAV1SuWD52aSUeki11UUcD//3GCqipQhC6gPYQymMTBlB+9xO9z+YY2drvarvMEgIdeMmpz50WeaVpRmGhQYNethKFJGZVV7IL6hIXebNCrhCIUx6hUGdphKmisLkXQWMlgl8UuFtrC8bVJm0V4x8T7BpNMAM/uP8MZAzTDLuwE0Iq26AJaUDuABkO3o8EOBNGzwa09fHDTURH0jEmgjE1RzwirZpYA8PCrRh2R4Jpb+AwN19zRrZxGYclLEzPpiHSxK6gdUFeV4v1MdwY3JDOZxAEGIr5I+kwbu91XP+ODW2HhZdJmDPi4z+zH3yLBLo4QWdiFZi3crGIX1CecxuoQyftBIgXbmTt0zigOyh9+xdlpDKexksEuFCEFMgt5HcVCiy2SCgsvignghWOcMgqhHFnErpUciS6gK37GqR1Ag6Hb0WAHaDTYIHpOv70gFUcHOAaWsUn2KAIULaZshp7cxatNLH1hHMkgemoXp1FAhYYsOiJd7IJuCP//549cIHk/bntH9au0hCniDHEcRYFdKNqSaU9HceTHJmxPvU+C3dYj552wCz3KqKxiF9QnjMaq5QTJ+1lI3F6QijAJUM9QYLfsQblQHh297IRJVDzyBskEEGMba+9nb2QSu1ZyJLqAnuJQOyBBQbejwY55TowIVkmmOrRK8LD0UURhFWo6dhGJNrB75dApJINoL43C+5l0RLrYnf6oU1WFaMcOBOYsO3evfp3mIBWxdAhKp8AudKIIu7gavqOoo2LHbvFzY0iw23aaU0bN0KSMyip2xY5dFI2VrOIUgHJHMUgFjRVF6A1UNplPR5FsxXavf/UOyQRQUEZhRzGL2LWSI9EF9IT7niWL2YMdiwaNIospDFJQv8jSB8g6IkGjAKoWU3aLmL21w2eSDKIipnDmL/VoFLI6iIqYvc5LNDF7guICJQ1NYaBTUCU9FE2VJIvdKSLsou26MbtFzN6K18pIsCtiCnGk2B+xK2L2LhLF7C0fNpW1F1UaU0cFjRXogKiwK+i8EIdtym4Rszf/6Q9IJoDemMIsYtdKjkQH0Jza4SmynS/YsezF8WRZxUF6zsnaBRk0lSMSWcVXCEhug1Rk7a4fPZ9kEBVZxbo0ClkdRCc51A7YVaN4PyKr+EgjTVaxn7YJsvRHo7N2ZbGLDGC2ExqRVayjImt39dsVJNgVO6E4UuyP2BVZuzjNoHg/Iqt4H1FWsZ8KGiuZrF1Z7IJ5gccu0uyE+qnI2l00eAzJBBCKrGJOGZU97FrJkegAmsoJewG9ahjPbgNXkqkO7ZYQGhhdQkjWEbkOuVW/zFWQ7lrKefsay5aQOCFMViloFLI6iFI4Ya+ueoeWV9BPEa/IjqP+9V0y7IIDkMcu0sRC+ilKf+EedR/OJcEu1eIzq9iVpbGSVcEr2FLdaAwDolwiVegNtHIgPzGKKumpoyi5yGKvX5lENgGkWHzaCaAVbdEBNI7OKI5hvIBeO2IWaxNs6aY6tEoRcVlH5B7JnDBHo9C0gFfuaJ65imYQVTiSKUVHpINdqmMYr64hrCwSpMhY5sdRI8mwO9+tLEKTDe2nLcu3sHs0TFhEgl2oCD/RCbvIInbZ/7sIOSHKfkU1IOZbKuuNYQBMEbIhJ7LYXfzCeCd2MbyyiI4eqHMqd7w1jWwC6IafaFBG2QmgFW3RAbQIxEYwPUVHgx0bxvCVKEVt4SB1a/cOLSdzRG5Q9kFzNAqidm9L5TqyQVQ2KLsUHZEOdt1A7B++SPZ+6sdXsTZ3LNavLRykbu3eIdG1e2WxizrALHYxorawjoravdsqlpNhdzJBAloWsevSWH0nmsZKVhsr6GoLB6mgsZJJOpPFbvUb5U7sYnhtYR0VtXtr359DNgEUtYV1EtDsBNCKtugA2qVi+LUeFYMX0JunLGVt7lzaYKxDI84F90DcC5UjcmkZdpmjUdg4uZofMS5vIBtEQV0jQ8tQio5IB7u9VAyvk72fTeXL+SRn7lpjGDjcuJ/dY9mrZWTYXfpKmRO7uN+Y3VvnrOH9et4aMuxO+6k+BVUWsdtLOxVNYyWr2+atZW1uKq82hgFBYyVDOyWL3VXvOrGLa3YYs3vnkgYevjB2IdkEECEcozUpqOwE0Iq26ACaiozVC2gcb6LNpvl1xjo06meybNpR88kckSBmBbmyKbvhgNhAvaaJbBAFeTWnUQgnZi1FR6SDXSoyVq9i94TFaE5baQwDiC9kVEBvTyfD7oq3KvjCom6XMbsbpq5g99i7ZAMZdilI6LOIXZd4/l/oiOexa40268ctMoYBQWMlQzwvi901H853Yhe3GLN727x17B4bJy8jmwBSkNDbCaAVbdEBNFU5Ji+gWxbWsTY3z6gx1qGbK9fzbNoJi8kckVuaaf1uY3bjCIJlSDfsJhtEKWgUsjiIUpVj8ur2hQ6uJkbjKq4ivlAcR1Fhd7WDq90rtxmzu77Q19hRXc1WMuxSlKHMInYFjRVl6cndKx1cjZxrDAMqpSdlsStw1Vzoe6bsbpy+yh2TqCaAFGUo7QTQirboAPpwA01Bdi+g9y/nma4bypYZ69Bip6ZBYqdG1hG5xdlXm4tdFDs157YfIhtEXRqFiOLspeiIdLALmiF2HKVZkN2rLQo7y3F1R9VG9ziKCrvrxix0Yhc3GbNb7NQc37CLDLsLB4/mC6Jdx/sVdlsVaKxk9UCd/M5yXEVcNwu9GT6LDLtiZ9lk7OKGSTwsqWlBHdkEUFBGHdYIu7ATQCvaogPo/WtpnQbsOLqOx+dhUDLVoUWs1tY50bFaso5I0CjsWmaORgFxX2y3bv9JskF0wTOcRgHH+VlzRDrYBc0QO456eRLZ+9m3Rj62NK4ivpAfR0UtddS4AAAgAElEQVTHasliF0dbLHZx3jpjdotYrTPbDpBhV1SvwNFif8IuKE/w/w0KFKr3c0TElhYmJqYwIGis4CupsCtiSzdNXW7M7nVjKrlvX9pANgHEmMnCLjQoo+wE0Iq26AC6ZQXtsQHsONnAM3RXSxxxxdX6cTxbE5mJVI5ovTiKMEijgMxPRh1wrJVsEK0SNApN8WkUsjiIgmaIUTu8OY3s/Yjs8uUS2eVxtcHJ1kRGOBV2cbTFYhcrVhmzW2RrXth9jAy7onqFTthFFrELyhP8f4MCher9oHoNZTiPnwoaq/UTl5BhV2SXIwPflN2rR8zmpzs1TWQTwNoP9Cmj7ATQirboANrtfONoOh/sOLfjMPnA3KfzOXxtLRKdT/ooYpr8wBxXwf2Ge3S3tpMNotWvT9GmUcjiICqoHeDcqd6PCr9kXMXgKbvQkMWuGJjBBWfKbsHX1n74LBl2a4bzgVmHMiqL2HVprAqTaqr3Aw5IyoQ+PxULDSxiqLAr+CXXjJxnzG6MRXyh0UI2Aawbt4iHXVTFp4yyE0Ar2qIDaHf7vZxm+x12tO3nxxtgXTfVod3t97XR2+/yRxHyR3NxVVAHfNLRTTaIrnp3hjaNQhYHUUHtgOMdqvdzerdTYWZQdIWZuOqGGiyNDjWQxS4ol2SP5uKqqNhw9cwlMuyuG82P5nQoo7KIXUFjhWN1qvdz4ah8hZm46oYaSNAkyWJXVJhZ9c4MY3YjTISHGhwgmwBumlItHYZUati1kiPRAbTY9aIKwIUdXSfOkwfnF6sbgNsQXbNV1hGpBOfHVVGz9cubn5INoi6NwvL4NApZHERBM0SdbNR6mD44v1hVko1ksasSnB9XRbLRzbYrZNjtDc6PH3aRReyC8oQ62ejyWfka03FVJdlIFruixjRVIqKfimSjU7uOk00A3UREid3QUsOulRyJDqB7495oUvBhx/Xz3BHNJ6TnKFbEucim4Ms6Ipee4wNzNArlD/HyQf/2u9+TDaKieoVMPGSpOSId7Lpxb9Pp4t5ApYM2URbQFAZAoSEb9yaLXZeeY1g0PUdcFXRDn1/7mAy7iFkU9Bz9CbvNDt1QvQSNlax2tTllPX/8sjEM1CrQDcli16UiI4yHLNZ5TqnEcwfOkk0AEcIhGw9Zati1kiPRATRWoOw4qnozSUeDHZ92ckeEAvWmOvQCQcIpkfkq64ioM6L9dKJTQPxPf/wj2SCK7Dl2FDF7TeYckQ52sfNHnfkqCHplit3HVTfzVYJwXBa7KgS9cRWkxbjH7z/7kgy7XoLe/oRdd/do6gqy99N99VPW5qQHnjOGAZdwXCLzVRa7bjGCZ+gyoosVZPG4x8Xjl8gmgGCL0A27sBNAK9qiA2i3DE/tdpKOBjt+d/Mz1mbFz94w1qFRug73QCk7KkfkciJKlOiKq2O/9TRTKicExcRPl0Yhi4OooHZALCDV+7nW5ZTo+j5dia5iVSk5KItdlRJdcRVly3CP//z3/yDDLo4SeRxn/LCLLGK3l8Yq/qLN7zmMvefpnnHf/q0xDIiSgzLcd7LYBX8p2pzzBE05Uj9FuUiWwNTaReZ79yqUIy017FrJkegAurcQ9x4yJ/Tv/98fWJtTfvSSsQ49/dFh7B5tp6MLcaseRYCqxYTN3df4xHji9waTTgApaBSyOIgKagdkA9O9py96Rn9zQM/4ewcaw+7c34xgdstUv5DFLtpisYu/ed+Y3eO/M5A9m6+++ooMu3tWbeOZ3BqUUVnErgqNlcpzmHT/YM4ycO1zIxhY9BynsTqx/SgZdi+dbmdtznhsmDHsTvnhi+weVzpukPnegxucTG4Nyig7AbSiLTqAFvVvwUtF5YT+/Kc/uxMdUx26/OFX2D06L3WTOSLUdGSxi4ZoFLou3+AT44deIp0AujQKH8YPKM/iICqoHcAHSPWOYMuE7w5iE53r178wgoOZv3yLH0edaCPDLmrpsrCLx982YjOeBdqfcO8gUuweqHO4HN+q6FfYBeUJS9zS4JDzew5Tf8xjjLvabxjBgaCxAuUMFXY7L15jbaKmuQmboRPv4xPj692fk+FXUEbphF3YCaAVbdEBdOVA5ziqJfo4ShbQEBxD4KjTVIee9MAQZve1K5+SOaLzR8zSKFw+28mz9B4ZSjqIgv6FU0rEp1HI4iAKmiH8fx/ZfIDsHcEWsVtwtfNjIzhAfCE/jrpChl0cbbHYxZ++bsRmPAu0P/kHL5BiV1SvwNFif8IuKE9Y6M3a+NRNfs9h5mP8ZOTyuS4jOBA0VuePXiDDLnw4C7t4cIgRm6Fj7nmqZ9w/PyNtk4wihAN261BG2QmgFW3RATToLlh21KFWMicEmeQkO3Rf/cxIh0ZnHnP3U1K7NLKdHsfJJmkULhy7yCeYv3qHdBAFATQ7ing9Po1CFgdR0Ayx46gdx8jeEWyZ7sQLISHEBA4wieLHUTfJsHul/SafoBUmryZsbj/fmxxDiV28OxZ28Vz8sIssYheUJyyWblM0jZXKc5j3BI+NvnDskhEcCBqrtjN0oTfw4WPuHsB8ugmbxQQTYxLlBPDcwXNO2EV8yig7AbSiLTqAFtQOF09eJnNCEEF30tkWfUSrqohvYcdR9z2rZFPkUcQlh0bhITM0Cmf2neFHzE9/QDqIogScLo1CFgdRQe1wdv8ZsncEW+b86h3SPlGsOEYVx1FU2EVbrE98d5ARmy+ebHPpcSix6/YJDcqoLGJXhcZK5TksGjSKvE94FeErsn5dZbLFwi4k+4Squn79xy+TTgC9fSJr2LWSI9EBtDiOotrtEB0Mu2iyK0VVRXwLi6WT3O1QPYoAVQu1zVDvbgflICpoFHQKy2dxEJ3lTNQodztgS+XTH5DuinuVxdJ9U363Q2XA4rviZmIXvbsdlNh1d8U1wi6yiF1QnsjSWKk8h2UvTSDfFfcq4rplT3ZUsDtZJGm0R++Kq2rvyc4w0gmgd1c8a9i1kiPRATToLijjnUQHU4kVUe54TrwTUvtVbJJ5RixWxBCNAmLVWLzTq2Wkg2gvjcLwzDkinecAmiHqeCfYsuR5nul4avdJcgxc7fpEKd5JBbsqcbGqihhhRjMz6CNS7HrjYvsTduc8IU9jpfIcVg3jrA4oeUaNAaigsaLGLmJXZeNiVVXEdoM6jHIC6I2LzRp2reRIdAANugvKjEfRwVSyxVRVNeNR6SjivmeN0Sj0ZjxOIx1ERfUKHOdnzRHpPAfQDLGMx8t0GY+wZcXrZaSZ8V7tuKCW8aiCXTcz/uI1crtFxiNYAyix29V23c2M70/YneEka4AChRK7a0fMIs+MF+rSWN0nx+6ggl2VzHhV9bI7UE4A3bCLe+OHXdgJoBVtiQtocRxFyXkmOljVEHm+KFUVnGfzBshxnql0epEBSjmpECo4z1BOiXIQVZ1UlJIj0nkOgtqBcrIOW2rfnc7apeLG9KrqZF0FuyYmFUIF59nyoeWk2PVyY/Yn7JqYrMOWDWMWsHZpuTG5upN1SX5XFeyCv5LFLkpwY6qqW2puyDjSCSBUcGPG3UCxE0Ar2hIX0GILm7LqgehgqKbBstwkGONV9eROp+rBYLmqByqdXjDG42iK2m5R9aBu7EJSJ6R6rFhKjkjnOZg4roct9aM4RxtVdRyvth5qdY7r5aoeqGDXrY5zmO5YUai36gEldqEqx4p5wa6J43rYsnnKUtYuZXUcoW3Ocb1shScV7KKCDdpGRRtqu90KT69NJp8Aiuo4cUOo7ATQirbEBbSJuqeig6GeLtqWqRmpqohvQdtLXp5E7ohEzUgEp1Pb7a17SumEBI0CVqM67y1L2EUQuqB2oHxHsKVh0mLWNlV9bK8irhBty9Y9VcGuSn1sVfXWPaWeAE7UpIzKGnahKjRWKs9h+6wa9iwp62MLRTw3C72RrPGugl23PvaWg+R2e2u8U08ARX1snMJkCbtWciRxAQ2aC9009qBOXztyLmt798pt5B364PrdPJbuzWnkjsgEtYjQxumrWNtbZtaQD6K6NApZG0RBQyGoHSjfEWxpmr6Ctd28cD05BlQpe1Swa4JaRGhz5XrW9oZJS8ixKyijcMTYH7Drxo5J0lipPIfdi+pZ25tn1JBjQJWyRwW7y4dNZW3Dt1PbvXvFVh56UxiTqCeAgkYNoR1Zwq6VhOXOO+8cetddd/2koCMLP/+d7ve8EhfQ55zjKJBBUzohCI450TaOPak79J6aZn4cNXw2uSPCsbIpGoUNk/jxTNOCOvJBVIVcWNURlSJ2QS/EqR1oSbthy875a/lEfVYtOQZUSbtVsGuCXFgongXabpy2khy7LrlwzLCLrGHXFGk3bNm/nO/UbihbRo4BQWMFAnZq7NYM58kre1c3k9u9o2ojD70Zt4h8AgjmBRZ2EZMyyk4A+4EUHMo3vv71r8/Bz4V//7bgZGp0vlcscQEtqB1QDo7SCUE2TanmRxFz15J36J1LG1jb60ZXkjsiHCujbcryYkJhLztaLNhPPYiqlBdTcUSlil1TZftgy96lfMDYVL6cHAOqZftUsGuivJhQb3+mxq4uZVTWsGuqbB9sObqOx2quGyPnG1W0t2wffegNQgu4b2wkt3vrHL6gA4apJ4DgXh2tQRllJ4D9QApO5a2Ck3la/F5wMJ063yuWuID2UjtQOiHIllmrWdsNFSvJO3TT/DrnOGopuSPCsTKjUaijp1HAjqVY5VIPoro0CkGOqFSx66V2oHxHsOVwLc/Wrh9XRY6BluotrO01I+eRY1eEXbQs30JuN3ZP+I7+RnLs6lJGZQ27qjRWKs/hVCPP1l49Qu50REX31+0yFnqD0AJ+OlJPbnfDtJXujj71BHDxC+NZ23Epo+wEsB9IwaGUF/QXnt87vva1r/1V3O8VCwD98cccTCp6eGMvtYPqtUEKOyDbF9a7MUNUbQtFDB2Lc5m+SskmmWcEx8kmaTVN5HavcOJcDm3YLW2PrIIShx9FnIv93rKE3RM7jvJYuufHkb4j2HJiY4szSZtLjoHtizbwyeX4KnLsok02SavaQG63mFzuWbWVHLuCMurkzmP9ArvnDvbSWFFjt3XnYXeSRo0BL40VNXbd+OhZq8ntXj+RJ3VtX7heySYZrX6j3Am72EuKXSs5ksIKs6KwwnzU8/vV22677b/G/V6x9MSUM1v5lj5oL6jlWD0/6mosW0Le9vbZfAKIeBdqETQKOEqhFsHS33bwNHnbS1/gCQBXTl2M3UaWsHtpHw9fqHFItSnlbPNBHjP04Vzytvcu4cfLO+etIW97x1wep4cjbGqpGzmHJ0cVng211LzJF0aX9p+M3UaWsHvlJA9fQJ+llrYDvCwkfA21HFnLY6+3lC8jb3v/ch7Ws33OavK2G8v4BPDY+p3kbdeP4gujM9sOxG4jCmdWMi7OEcMAz+9XdL5XLABRnBVNS/VmTu0waj7pKhSyr1YkaswiX9GJBJOdSzaRr0Q3lDmJGvPXkdstEkxOtRyXtkdWBY0CjvUpV6Klit0DdbdSO1Di9+Ke426iBjUGGqYuZ21vnbOGHLtbZ/MJYMO0FeR2g0ONxcY27iPH7sq3Kpywi139ArvHtvIFxpKXJ5Jjt+sELwu5aPAYcgw0eWisqLG708ORSm03uCtZbGztdvIdQIydIuyCErtWciQFh/KPWGXi59tvv/2ugqzDzwWnc4fM96IEgAaYVOMPBLXD+gmLSeNQIDjm5MfLU8ljOla/P8c5jpKjmBE2yTwjcRSBf6ntFse05w6clbZHVvGcdWgUYEuWsOtSO3wwl/QdwZaOo+fc42VqDIhjWhwFU2MXtDVsR5+wPwtFFQWWHb/9CDl2a53+HJcyKmvYFTRWoD6hxu718zw7fp4kVYuKNlasUqKYUcEu3r04Xqa2u3ooP3lBNRsVm2QUfQ1tx6WMCsKulZxJwel8VHAyPy/omDvuuOPOwkd/WXA0Fwqf/3XE9yIlLqAFtQOCZCmdEEQkmGBnirpDqyZqqHR6QdYsm2Ciogj65okal8gHUV0ahTBHVIrY9VI7UL4j2HLtLOfHXECcYAJF8gfbMaiWS9RQwe4uZ0d/zYfzye2e75BMI1GDGru6lFFZw64qjZXKc/i067qTYCJH1qyibqLG/Dpy7LoJJm9VkNuNJEfv6QglfhumrnATTKixa8WKlMQFNGgu+HEUHVWL6GCCYgYlfqg79NJXypSoWlQ6PUoomaJREGXm2s93kQ+iLo3Csng0Cmk5orjPAXQkgtqB8h2xY5l2XiFHtlybioL+hR1HrZGjalHB7j6nXNuqd2eS2y3KzF04eoEcuxsnOxQzMatXZA27oDphPkaSxkrlOfzuY04yLVuuTUUFjRVouKixKyhmUEKU2u7KQR85oTcnyCeACOVgfmhqPMooOwG0oi1xAQ2aC5XjKJVOj2xUtI0i39QdetFzPGtQlqxZpdOLTDcTNApTfvgia/tqx03yQXT9RL46b66MR6OQtUEU9ELsOGrmatJ3BFu+uM5rK894bBg5BhBXyDLBN+4lx+4hJ6sfmYnUdk9/dBhr+/LZDnLs4kiRhV1UxAu7yBp2QXUiGBKosfvvv/8Da3vKj14ix4CgsdpT00SO3RPbeVb/oiFjye2e+5sRPPTmUCv5BNCb1Z8l7FrJkcQFtMsbtmIrqROCXDrZxtoGPx11h57vlGtDaSJqR4RjZUGjQG03Sj+hbZSCoh5EdSdEWRtEdSe8Yc/hD1/8jrVd/vAr5BioErxhTXK8YSrYBRcZ2l4sWWZORVFyD213tXWTY1d3QpQ17OpOeMOew5//9GfW9sT7BpNjQJRrO1BPH3qD0AK0DU5IartR6pSF3hTGJOoJIJI/WNiFJK9nqWDXSo4kLqCRQcnoVNbuJHVCkI7zV1jbqFBB3aFRjJwdRx27SO6IcKzMM/Tk2O5lFUXfUfwdReCpnRBUHIniOC1Ljijuc9A98g57Dn/8j/9kbU96YAg5dhc8wysHnN5zihy7qEaAtlGdgNruSfc/x9ruvvopOXbFkSjeaX/ALrJodY68o7Ay7tu/7Rlzz1PkGBBMA0e30IfeoAoM2qau7AN1qySdv0rue1F1h4VdvCNX2adUsGslRxIX0ILa4XADXe1Q0cGudjr1Ln/wAnmHFrVDL0vWDlU6ilCsdymr16586k4qTEwAd3hoFLLkiOI+B0HtsLd2O+l7gi1fffWVO1mnxq5q7VAVrJio7S1UTCpMYBeJSzwpYla/wO66MWbqpIt3M+kBPlmHz6FsX9BYndx5nBy7qAONtqlre0PLvv88D73p/Jgcv6i7zWIXX5Or7V0q2LWSI4kLaNBcALzHm4+QO6Eb13kw8oTvDiLv0FMeeokfR12+Qe6Izu4/Y4RGofNSt3usaGIQdWkUYtKiZG0QdWlvNuwhfU/i3XiP6ynbn/HzN1m7l05dJsfuxZM8exn3oLS5+9rn7rGiCezq0qJkDbu1ijRWqtgVx/Wdbd2k7Qsaq7MHzpJjt6uNZy+XP/Qyqc3QCfcO4n35+hfk+MXYibarYoZd2AmgFW2JC+gFDrWD7HGUaqfHDsqYuwewjkfZoSd+bzA/jrr2GbkjwrGyCRqFttMdzgp3mJFBdP+6XmLkLDmiuM/BPY7aeoj0PYl3M9lJ2LnSfpO0/akPv8ra7bhwjRy7HRd49vLUf3mV1Oau9hs8saDwTExg9+gWhxg5JmVU1rC7wiG+BvWJCexiFw3tt53pIG1f0FhdOHaJHLvdVz/ji4z7nyO1GWPP6G8O6Bn/nYHKNskoxk7YjdCOLGHXSo4kLqAFtUPrkfPkTgj/lj04hG+9d31C2qnHfutppnFsivruZecoApQtlDbjGTNqkcIzNzGIHtakUcjaIOpSO+w6QfqexLup+KlD2dPaRdq+ap9QwQqOuNB22YPPk9p8+VyX2ydMYPfkLl55JS5lVNaw69JYFfqsCewijg7tnz9ygbT9aU6fAB6osQtV9esyWtwnqPHbevi8FmWUnQBa0Za4gBbUDtidonZC+Fd1t0NG46wUlY4iLvfudlA6Inel+NsPjQyiujQKWRtEXWqHg+dI35N4N+5ux3G53Q5ZVd0VV8FK8W4HlWLHR+yKm8AujhR1KKOyhl1VGitV7LonO3tPk7YvdsWxI0yNXajqyY6MFu+KU+P30ul2LcooOwG0oi1xAe3GilyiixXxdjDVeCcZjRMronQUce0zIzQKbqzI8+OMDKK6NApZG0S91A6U70m8G9V4JxlFPCGLi71XPi5WFSvj7x3oxjtR2e2NizWB3Ysn9CijsoZdVRorVayYiO2GirhYxISawK5qbLcUtoriYqnx23nxmhZllJ0AWtGWuIBGRip1tpi3g7kZj4fpjpjdbLFH5LPF4hxFUNMoINNaZIuZGER1aRSyNoh6qR0o35N4N27G467jZG1f6VDPjFfFijfjkcpuZH2KzHgT2G1vdSijfhov7CJr2BVHtLI0VqpYcdkdCI+YXRqrb//WGHZRvUSF3UFGW4sy46nxK9gdENqRJexayZHEBTQ/jnqKdLfA28FUOc9kNM5ER/ko4n56GgVwLYokDRODKAK+dWgUsjaIYhLFkjQ6aJM0xLtZ8rLgPDtI1rY70VHgxlTFiomJMXjfWJLGy5OMYBeJNmxiHDPsImvYFTRWbYQTHS9WXH7XdXT8ri6NlaHQG6gqv6uMFnNjUuOXT4wHxKaMshNAK9oSB9CC2gHb+iacEP5VrXogo3GOOlU7PY6XqY/GUW2F0bSMnGtkEAXlgw6NQtYGUZfagZimRbybFU7VA1CUULUd56hTFSsmjsZR+QFtojqOCey6R+MxKaOyhl33qLPtuhHsigpPuwkrPLlHnT82E3oDNXE0XlwdxwR+gdu4vshOAK1oSxxAe6kdTDgh/Kta91RG4yQ7qHZ6l0aBMDnGrRk5rsqIE9KlUcjSIGoq2cGLFdSCxvPcU9NM1nacZAdVrJhIjkHtV7SJZ2ICu1AdyqgsYRdqItnBi5X6cYtY+zuqNpK1LZIdkDhoCrsmkmOK62ObwK8OZZSdAFrRljiABr2FCboTbwdb9e4Mdg+Uy6Fq/0gMuhPVTm+CRmHrHF6qbVP5cmODKGIXVWJ0SsERxXkOoFAxQXfixcq60ZXsHihTRtU2KGvYcdSgj4xht3KgQ4/TQkePs3NpA2tz3ZhKY9gV9Dhxwi6yhF2oCboTL1Y2lVezZ4nykFRte2msTGHXpcfZLFdqTkb3rXFKtb07M5ZNMjrNpYy6khnsWsmRxAE06C0EtYMJJ4R/13w4n90DBbOp2gd5KjuOeqvCmCPC8TI1jULDtJWszS2zao0Nor07C9k5iojzHEAr5KV2MIHfDWVL2T2aFtSTtQ3SahZLp0B4rIqVxS9O4GEX2+gIspvm17E2N5QtM4ZdQRmFo8Y8Y9dlGSAmPPZiBT4G92ioWEnWtqCxmv/bD41hFyEGuMeBuhYyu1uqt7A2146aH8smGRWUUQjxyAp2reRI4gBaHEeB7sKEE8K/9eOr2D1w/EnVvlvy7P05xhwRjpepaRTWT1jM2myuXG9sEJ3yo/g0ClkaREEr5KV2MIHfxumr2D02z6gha9steTZUvuSZKlaqh5bz2EXCEnl4BmgTz8QUdsGjhnvgqDHP2BU0VogDNIXd5sp6do/1E5eQte3SWA0ZZwy7qw2UyGteuJ6H3hT8bxybZBQhHaNjUkbZCaAVbYkD6F5qh3js+zKdftPU5eweW2evIWsfBdTRZt3YhcYcEY6XGY1Cwz4yu7ECZUeK1ZuNDaI6NApZGkQFtQNohiifnxcrTfPWsXtsnLyMrO29q5tZmzXDZxnDbs17M9k99tZuJ7MbO3/sSLHwTExhF5UURsekjMoSduPQWKlipaW6ke96fbSArO3DmwSN1WRj2F03ZiGPXSz4eCq73d3QqSti2SSjqGCDe/z/7b1psF3FlSZa7uro6K7o6niv247uoCri2UzVf+r16+gouxFguw3YxjYUmKEKYwshMQoJM8tmRgJdoXlGoBnNoOlqHkACzfOMQPM8YWyoV9H143VH6e0v98k8W/vuIeed+3itiAW695yzd959vlwrc+Va39KhjKIFIImx6AA6Se3gwgjh/1j4sby3aCFo6/qrhGOe6cwQuaBRQA4Ky4eMHLMrJ2pCo1AnJ5qmdnCB37XTljXy3uQ3GmW6boa6Y1bFSnKjYWvcyP3DNddOW+4MuyaUUXXCrilfpwxWYGPYRuPlMdaunaSxcoVdbLb4RsPWuJFzzYIQY+drjUlGRV9yDcooWgCSGIsOoPlxFPIuXBgh/F9UvjbC7zZ0xajG0dyYuc4M0bze9mkU+NEcqtJcOVFOo4DODXUxRDrPAbRCSWoHF/jFMZRqqkGZ6hzNqWIlmWpga9ziaG7OamfY5ZRROmkXdcIuKE5YLp1mxx4ZrPDKV5VUgzJN0li5wm4y1cDWuNNpSC7wO8uAMooWgCTGogNo0FtwagcXRgj/5wm4KAaxdf0lg6cpJ+erTnocL9umUUgm57tyoiY0CnVyoqAVSlI7uMDvVo1iozLFpkU1OV8VK8liI1vjTibnu8Iup4zCUWMrYxdzE3+nbs9uGazAxqgWG5Up38wv7P+uM+yKYqPB062Ne36f8ZcUIrrA75xXYsoopHjUBbskLSQ6gBbUDm2TnBgh/L9Zgv+Wtevj+EyVnkP9KGJm49jAHo1Ckp7DlROd/tRgbRqFOjlRF7hKY2XnyphuCNQUtq7NcaVCz6GKFUE3NEw+RUIFV66wO/tFfcqoOmGX01jZxFUaK7AxLEVCgW6oHFfzlXGlihUXPimNKxf41fFJVWOXpIVEB9AudlvpCSYiNdHu3tb1kUCvuttSPorgkZqR9mgU0IsS1zyw/aAzJ2pCo1AnJ+oispzGyr61jUjNY/YiNSKyrJDkrooVRK1VIzVlih7APLLsCrvpSE2rYleHxkoVKwe3H7pJ8SQAACAASURBVGD3ACm4rWujiEI1sqyKFX4qhYiarXGj93oysuwCvzqnUlVjl6SFRAfQLvIt0hOM52pNsZirpZNvoTrpXdAogLIE1zyy77gzJ2pCo1AnJ5qmdnCBX+RRslytbr2tXVsnt1QVKzq5WmU6PpFb6gq7JpRRdcKuDo2VKlaO7mu0HLxHvuVgmerklqpixUVe+pSe/S/JLXWBX5GXrkEZRQtAEmPRAbSLiqv0BOPkoTarNXUqrlQnPUL5tmkURv78GXbNk4fPOnOinEYB1Zp1MUQ6z4FXl3NqBxf4PbzniPVqTZ3qclWs6FRrlmmzuvyoM+wKyqix6pRRdcKuDo2VKlZgY3AP2Bxb1xbV5TPcpd64YKZIV5e7wK8OM0XV2CVpIdEBtAvOpfQEc8HXpsO5pDrpBV+bRRqFIT/pya559tQXzpxokq+tLoZI5zm44JdMY+X4Aft8bYJfcsUWZ9gFdyXuocLXVqZJfklX2E3ztbUqdlc54JdMY+Xsqd+xewz96ePWrs1prFT4JVWx4oKbNs0v6QK/Jot6WgCSGIsOoF2wrqcnmIuODTqs67pHEaBusTXuATc8fLHturjZvSsnanKsXycn6qLDTBorZ47b79jAO8zs/XiXM+zqdGwo02SHGVfYNTnWrxN2TY4LZbHy+YWv2D0G3vCItWuj4p6l3ih0mFHFiovuVOkOMy7wa3KsTwtAEmPRAbSLvovpCSZ6tt5mr2frmF88H+fSKfRdVD6KaPRsBXWLjTFj0YfFHxaBrowQ1KSwp05O1KRgQBYrF843erb+sLu1a/Me059ulu8xrYoV9K9muYsKPVvLdNBNzR7TrrBrUthTJ+yaFAyoYGXAD5obThvXntrgaVTpMa2KlWZ/+hesPZPhtz3Frsl7TLvAr0lhDy0ASYxFB9AmlCGyk/7s6d+zewy5uae164+841l2zRMHzzgzRJ+ss0ujgGNf9hx+0tOZEYKa0CjUyYmaUIaoYOXN7z3A1Na1kU+IcR/aedgZdg/uPBSnXXR+2dq48Qz6f/9Bp9g1ofapE3ZNKENUsAKby1JOIhts49pJGitX2D1x8DS7x6g7n7X2TIbc3INd89yZPzjDrwm1Dy0ASYxFB9AmpMGykx67z37Xd2W7UVvXH/qzX7NxnznxO2eGiB9F2KJRSCdlu3KiJuTedXKiJqTBKlgZ9KPHGpGvL61ce/Tdvdj1jn160hl2j+0/Gecu3v0bK2M+fzaOhA6OnoVL7JqQe9cJuyakwSpYGXH7042is3NWri1orLYdcIbd0yc+j9MuIhtv65n0/x8PRT6om4iEusCvCbk3LQBJjEUH0LxtGFoTuTJC+Bl5KLjPhfNfWbn+wBvVr6c66XG8bJNGAdQvyVxIV05066L12jQKdXKivG0YaIZsPr/0d4P8P5b7duyClWsPv/XJ+Djq2Hln2D119Dy7x/C/fdLKmDFWdr1bn3SK3d2r9Nv71Qm7Jm3DVLDCaaeQh23j2k0aK3epN0gxYLmLNz1qZczwEex6Nz6iPSYZRUoHS7vQaO9HC0ASY9EBdJPa4YgzI4SfUYnGInYn5SN2uRO6EVHErs5kTGWK42WbNAoHGtXQ2EW7MkJQExqFOjnRNLWDK/yiAphF7D47ZeXaIqJ4Vj6iqIoVHHUlI3amimhlHFHs5RS7n2zYp00ZVSfs6tBY6WAFzAus+jWyPTauzSOKJw6ddYZdaDpiZ6I4JWLV0ImIogv8Htp1WJsyihaAJMaiA+gktYMrI4SfOf+dSs5ennLnhrwOkzGVGo6TdmkURGumh/s6M0JQExqFOjnRNLWDK/yKnL1d8jl7RYo8OtWcQh2s9PtuN+VNUp4iXzHp3Fxh14Qyqk7Y1aGx0sEKFtIsZy9aWNu4dpLGyiV2B//40pw9E+U5hcgbNxlTmWKDqEsZRQtAEmPRAXSS2sGVEcLPompX4eggT1HJpVNVrDrpxdGBJRoFcbzVqCp25URNaBTq5ETT1A6u8Nus2jVPk+DHW6iodYldKI7QeNWu6bjF8VajqtgVdk0oo+qEXR0aKx2sTLWcJsForJB6oxCZ08GKqNo9Kp8mkac8lSdZVewCv0gRadOkjKIFIImx6AAa9BY2E9zzJhgKKVSTh/MUDp85ib9TS3DXPYqwRaOwfenGSxLcXTnRJo3Ci7UxRDrPARuAJLWDK/zaLJTCRos5iVvUnIQOVoY1CqWQVG86bnAWJhPcXWFXUEbdrk4ZVSfsYjGiSmOlgxVeKIXiGtPrChorxWI+HaygeImlXeyXL5TK02Yx32tGYypTXig1SCPtghaAJMaiA2jbFBd5EwxUKuwoYp08fUCe4sgvPiZSo7jQmfScPkDlyCNPN8/7uEFxMcaZEYIeP6BPo1AnJyq+G0sUF3lYAa0Do0pS6NyR+900jomQeuEau/j+WXpHhAfTce9oUFygi4lL7AqqJA3KqDpht0ljZf7dFGEFdDqMKmm+OVWS7nejgxXQF7H0jp3m6R04ZmcpMY+2GY1JRnX9KS0ASYxFFdAmOxbVSS+Snj+UJxDNU95bGEUArg0RjzKBwsV03OtmrmTXQj9Nl0bIhEahTk40ThS3R3KbhxUQu+J5gujV9LootmLR2V+qRWd1sIIIcFzgddR43OhbjGvx3sKusKsbZaobdnVorHSwAkJt3AcE26bXReGHTnRWBysTH3zdWoEXCm1YUVzkg0zGJKO6J2q0ACQxFlVAp6kdXBkh/Dyrlz3aA9HmSpEqQmfS26RR+GhS3OZqcaPNlSsjZEKjUBcnmkXt4Aq/8xrtEtHqyfS6n235NM6l69bbOXbHNyiebOSZbXjvQ3ateb3HOcUuVJcyqi7YZX+jBo2VDlbQUg/3QYs90+umaaxcYndKz/7sXrD1puPmLT1BvWMyJhnVpYyiBSCJsagCOk3t4MoI4ec5r7zN7qXSRDxPQfzLjqOeGebcEIlKUws0CqLR/cj3nRohqC6NQl2caBa1gyv8ork77oVm76bX5WSxk7v3c45dVIGzStO1e4zHLRrd93/XOXZ1KaPqgl1dGisdrCwf8R57lh++M9/4ugc0K7R1sDLjmaHsXjuWm5O8g2wb1wL5tsmYZFSXMooWgCTGogpoE94i1UkvWh/NMG99hNZfLJfuRbV2UVpHEQ/Zo1FYNnxWbIzHzndqhKC6NAp1caKCo/EOe+2i8rCydOgMdq9V4xcYXxctF3EttGB0jV3wQLK0iw/M2zyuGtfOrrV06Ezn2BWUUQpcc3XCri6NlQ5WsPDDvZaNmGV83SaNlfvUG6QasLSL9rXG40a7PZZ6E/kgkzHJKKeMUuXVpQUgibGoAtqEuVx10i8eFDc//2iSefPz9bMaDeP7jHduiES3iVXmNAqL+k9h1/r43SVOjRAUHSB0aBTq4kRFl5Zf2OnSUoSVlW/NYfdaMWq28XW3LtTr0qKDFdwD90JnGNNxLx/1PrvWyjFznWMXnXfaNCij6oJdTmMFqhPX2IWtwb0WDZhifN3dq7bHNFYeUm/m9RkX5y6+96HxuFdPXMSutWTwNKMxyahuZy1aAJIYiyqg09QOrowQfk47EBPVNWo6k75Jo7DReNxpo+bSierSKNTFiWZRO7jCb5YD0dWNs1exa819baxz7KIXNO61cc5q43GnN3AusatLGVUX7OrSWOlgRXeznKXbllxKY+USu+nNsolmbeBc4VeXMooWgCTGogroNLWDKyOEn/kR0rJhM42vjSNUnWMNnUlvk0YBR9bJYw2XTlSXRqEuTjSL2sEVfvkR0oK2ScbXXTtteXytfpOdY3dBv0nsXmunLzcedzqFwyV2dSmj6oJdXRorHayIdJmX1NJlsjRNY+USu810mXbjcSNtIZ3C4Qq/upRRtAAkMRZVQKepHVwZIfycTiI3UZ7YjKIK14YIO2dbNAooWkkmNrt0oro0CnVxolnUDq7wm5VErqtwQiyaOGSGc+wuGTyd3Wv1hIXG404XcbnEri5lVF2wq0tjpYMVXjCHkwzT63IaK1DLuMZuumDORLOKuFzhV5cyihaAJMaiCmhB7dBnnFMjdMm9epvfS5faQOsoYsAUazQKaWoDl06U5y6q0ijUxYlyagfVXDodrGTRSOjqitGz41SIt+Y4x67uvbI0TePkErt4zsl7tRp20ZZNJ5dOByv8XqqUWVnKaawWNWisXGI3TZllolk0Tq7wC/+WvlfI2CVpIVEFtM0E4bJJbzPaqEtuqnUUMWKWVrQxS9NROZdOFHk6ce6iWguoujhR5LXp5NLpYMVmtFE3KqeDFd1oY5amo3IusdvMXfyoJbErWkL2Gu4cuzajjSIqN+I959hNk+abaFZUzhV+ee7imilLa4FdkhYSVUDbpAgom/Q28w2Rg6KTl6cz6W0+o3RenksnKp6RIu9iXZwoTylQzaXTwYrNfEPdvDwdrOjmG2ZpOi/PJXbFM5qm/ozqgN1NjVy6OS+r5dLpYMVmvmGaxsoldjdbfEZZeXmu8GvyjKrALkkLiW50SxWsOpOeVxxP6dHf+Nom0a0qo6So+ktW5rp0oiJpP9pJ18EQ6Ua3OC+dS/zyiuPxXc0rjnUrc3WwoltxnKWotk5W5rrEri7vYl2wi0IaFt1K8NK5wq6oOFbs3pGlupW5OlixGSUFy0W6MtcVfnnAQCdKWgV2SVpIlPPbNMPVOpN+/6YG5+CDrxtfe6omN5/OpMcxsy0aBfB+4VrgAXNphKCgLEnSdoRuiFSfA6cVsnE0X4aVw3uOsnu9fe8LxtfV5ebTwYou52CWgm8R1wL/omvsgioqTdvRStht0gpNd47dk4djzkH0NDe9rqCxmuU+9UZwDv56oPG4wXOLa4H31mRMMmpCUVYFdklaSFQBrZuwqjPpD+2013UETPS6Fa7KRxGaXUeyNN2dw6UTNSk2qAN2F1vscVqGlRMHT7N72eg60uzOsc05dtEBBPdS7TqSpaI7x8EzzrErCgAGqfEu1gW7nJfORnFOGVbOnv49u5eNriO63Tl0sILOS7jXpIf7Go+bd+dA5yuTMcmobmElLQBJjEUV0Lol6zqT3mbfYdGfV4PjTvUZgbKF5S4+M9R43On+vC6dqAndSB2wq1sIpIMVm32HkUeYzKVziV2Ru9jdPHcx3Z/XJXZ1CwDqgl2b9DxlWLHZdxj52xj3Dg2OO9Vn1MxdVOs7nKVZ/Xld4Ve32JEWgCTGogpokRy70rxXaNmkP3XsPLvX8FufNJ/QvMvFp+pdLlSfka1uKefPfcWuM/CmR50bISiKDOICADXy4ro4UUHQ3W5O0F2GlQvnG9/djY8YX1d0udh+0Dl2ka+He9noljLwhkfYtfAsXGMXxV0s6q5BOFwH7IJQnOXnTjfviy6DFeA2+d3pqkmXC9VnhDxplrtooVvKsFufYNc6feyC0ZhkdKdmsSMtAEmMRRXQk7v3Y2Ddt3aPcyN0/uyX7F6Df/SY8bWxiExPaFeGCD0dWe5it95GY+ZRpGGJKJJLJ6pLXlwXJ5om1XaN33T0VleRjI9xH/3kuHPsHtl3nN0LvXVNxsyjSAN+8LAX7OqSF9cFu2lSbdfYReQ6Gb3V1fGNPrefbVHvc6v6jETA4G/NAwaDIp+Da8EHucYvFscsYPCYWsCAFoAkxqIKaFQ1sgm99TPnRgja77vdLvb//oPmE/qH3eMJfe5L4zGV6eHdvADgRaMxZ+WRuXSigry4lxp5cV2cKKrJ8fepEl3rYiWdv6mrSMZPFgK5xK4oALjdrAAgK4/MJXbxnTLGgJ5qjAF1wS4qW/H3obeuD+ym8zd1FUVQuA6KolxjlwcMBlkIGLz5vQeYmo5JRrE4ZowBigEDWgCSGIsqoNOVfS6NEFR34ZZUFo3AQlIjp0Vn0tsqAMiqJHXpRHWr6OriRLMq+1zily/csKgyua7uQlIHK7iHjQKArEpSl9jVZQyoC3Z1WQx0saK7cEur7kJSFysIFqQXbqoKX8MWkpHvsTGmMtVlDKAFIImxqAJaTOhDZ50bIaju0W1SuVODI7UxpjLFsQkrAPjp40bPg+8Mk0fJLp2obhVdXZwor+w7vPuI9WeX9d3oHt2mFU4NGxgf2I2PbvU2S0nNOkp2iV1Ua+owBtQFu7osBrpYEUe3hic9Q37Sk13n7KkvnGMXOrhxdGsSdc87SnaFXyyOdQIGtAAkMRZVQOtOaN1Jr1u8kVQTXistJ4oCgOu6Xhxww8PK90uqyA1JFJO4dKK6VXR1caKj7nyO/X3HD5y2/uyyvhvd4o2k5kUjXGEXOugmHnXXLwDIKiZxid3jn52KGQPuUmMMqAt2dVkMdLGiW7yRVuSAwhaq5sHqYiXNm6qjecUkrvALX6oTMKAFIImxqAJad0LrTnobhg8RGDahNZjtdSc9Fn/sORlU0YlWeAk6GZdOVHQAUKyiq4sTHdZIbD994nPrzy7ru9Glb0kqIt+6lfC6WBEVkMf1n1MWnYxL7GKsrGDqlidaErtiI7xffyOsghVO37JTkb4lqaIS/gb1SnhdrIioe2TLdMedtxF2hV/4Up2AAS0ASYxFBdA2qS1kJ72Now9EYOJoxKveDFGaA01HQZ7KqC0ShNIuneipo42jj2gXXQdDpPocQKdjGtlSwYougXNSm1yY6tQWulgB72aaA01VswilXWKXUyYhetmK2MVxJItsHTvvBbuCwHmBGoFzUk24MHWxMq5LHHU/aBB1z0uFcYlfRpmkGDCgBSCJsagAOouWxKURgqIgIU5+3q4/odftjaMRj6qT2+pOeuRzxMnP+seNoqXc6xOMxyOjIldSsYquDk40i5bENX5FC7eFai3ckorIdxyNeNkbdsd2jqPu6MSjO24QxeMaII73gV2oDu1OHbALzaIlcYldtLHE/VRbuCUVqRa4xqg71YvhdLEy6ZG+cdR9vX7UfdeHcTHctCcGWRmTjOrQ7tACkMRYVABtMqF1Jz0oSRj9weIN+hP6g23xhH5Svb2V7qQHBUxccKBfRSfaWw2c6sUIQbPoD0I1RCrPgefZDLm5p5PnlvXdzHttLLunSdtERL7jaMQb3rA78SHzqLtob9V7nPF4ZBWVyyw/+fTvWwq7UJ15aYKVRRbaJqLYilW3/lKdDksXK1i0saj7h/oBA0GH9ZsRVsYkozoBA1oAkhiLCqBNJrTupAcpMe65cc5H2tfduki/wb3upJ/QqKIDKbTuuLMa3Lt2ojqRhjo4UVSts0q7nz/j5LllfTeL+k9h91wzZan2NUH7oUPNY4IVQTmyWp9yJKvBvWvsgrswpt2RZyioA3Z1I/MmWFk+6n12zw/enqd9TdAtMRaDB/p4wy6PupsEDDbOWc2uMffVd6yMSUZ1Aga0ACQxFhVAiw4XGhNad9KjLRnuuXbacv0JPXtVHI14baw3Q4TKXVZF9/Eu7XEvHTqDXQM9en0YIahOrlEdnOiRfcdiWpJfmHW4UMHKshGz2D0/HDtf+5og/mXRCEVybhOscNLh7Uv1SYc/fGc+u8byEe95wy4oZ3BPUNC0EnZ1c3NNsML7gi8dOlP7moKcu4caObcJVuY2ou5YxOmOe83UZewaC/pNtjImGZ2g0TGFFoAkxqICaN7jVmdC6056GKD0Ikh3Qi/s/643Q4TKXdzTpO2YWPxOX248HllFBbBqtWEdnCj4zPB3oZONi+eW9d1g4Yd7YiGoe03d9nwmWLHRdmzZcL74bfeGXVDOMNqdbQdaCruiOl+DxUAXK9hwZy2CVJS350MLRl/YXfjm5DjqHtl83XGvGtcez9thM62MSUZFwECBdocWgCTGogJoLGbStCQujRAURxAskjDqfe3rwgllTWiXhgiVu7jn5vY12uPmx99YBPgwQlBBu7NDnnanDk4UvavTtCSu8YujX3YM2n+K9jWx+GeOuG2SN+y2953I7rlu+grtcWOzlXbErrHLaXdAQdNK2D3YYDFQ5ec0wQpSbrKOQVV08/w1MYvBS28Zj0dWRcBgXLvyPbkuH5l9/O0Sv5x2Z4cC7Q4tAEmMRQXQWbQkLo0QFEnI6UIIWxPapSFC5a5pFZ0ogEn0/3TtRHVod+rgRLNoSVzjF8Uf6UIIVV09YSG7xpIhM7xhd8ng6eyeqycu0h43L4BB+oUv7OrQ7tQBu7odekywklcIoaKcxaD9jQnG45FVGwEDXgCDPFYbY5JRHdodWgCSGIsKoLGYSdOSuDRCtu6ZN6FdGqLFFqromhQ4O4zHY3LPUA2RynMAFUualsQ1fm3cc8Xo2ewaK9+a4w27uJfuPbkKCpxF643HY3LPVsAu79GdpiVxiV0b9xQsBoOmecOujYCBoMB570MrYzK5Z4jYJWkhUQE0n1yLDCaX6qS3EXXUmVymk94k6sg1Kxrn2onyAoBk1DFUQ6TyHEQ0TqMQSBcrNqKOSwZPizcSk9SjcbpYQeSPRR0HT9ced1Y0zjV252ZEHVsBuyIap1EIpIsVG1FHzmKgE43TxYqNgEFeNM4lflEtrxqkoAUgibGoAFqE10fqh9dVJ31WOzRbE9qlIeKJxCZVdFlt8Fw7UVEAMFeedqcOTpTn4+kUAuliJasdmqqKfLyZK71hd92MFfHRXXRv3XFntcFzjV2dAoA6YJfn4+kUAuliRbcveFKzWAxcY9dGwCCvDZ5L/KJaXjVgQAtAEmNRATSKKEwTbFUnPaqicE80J7c9oV0aojwqARUVLbk+PWk8HllFsYFqAUAdnKgoBBquX5GrihVUo+KeOi0Iuc5+aUxcTDRfvZhIFyub530cLzheHqM9bt6S60CiJZdr7OrYpzpgVxQC9VMvBNLFClgAcE+dFoRcTSi8dLFiI2AwuXu/zIpcl/jVsU+0ACQxFhVA2yixV5304EVi9B3demtfF4tH1RJ700mfRyaqosNufYJdA43ufRghKIoNWAHAhIXBGyKV58B32OCnc/Hcsr6bo58cN6bvmPnssLg6cJk6nZAuVrYv3cTuOfO54drjxt+Ma4DCxBd2dU4o6oDdJiefeiGQLlZOH7vA7jn81ie1r2lC4q+LFREw6KEfMABVFK4B6igbY5JRHaoyWgCSGIsKoHVybEwn/eE9R9k93773Bf0JzUk2UxPapSGyUUWHxva4Bhrd+zBCUF4AgOKD0A2RynPQybExxcqpI+fYPUfc9rT2Naf07M+uAVJdX9gVBL6PD9AeN0iLcQ2QGPvCrk6Och2wi05ApkU5qlg5f+5Lds9BP+yufU2TNp66WOEBgwkGAQOQxeMaR/YeszImGdXJUaYFIImxqABap8rOdNKfOHiG3dOkhRcWj7gGFpO+DFFeQ3FZRUN7NLZHg3tfRgiqUwBQBydqUgikixXRwuvHPbSvOeHB1+NCoE37vWGX9x+eGN1bd9yDGy0F8Qx8YVenAKAO2DUpBDLBCmxPv+92Y7ZI55pNRgH1vry6WEErtThgoN+uFL4G10D7SBtjklEdxgBaAJIYiwqgdXi2TCf92VNfsHsO+UlP8wkdLSZ9GaJP1u81qqJDQ3v2d9/c08p4ZFWnAKAOTtSkEMgEK29+74GL/b//oPY13/nVS2zch3Yd9obdQzsPs3vi3rrjxt8N9YldnQKAOmDXpBDIBCtDbu7RYRGvopzFABXFvrB74uDpOGBwx7PazwI2F9eA7/GFXx3GAFoAkhiLCqB1mPZNJ30cCet6ccAPHta+7tCfPp45oV0aIs7ej2R4nTGjoX1W5NO1E92kUQBQByeqw7RvAyuDGpGw82e/1Lrm6LviQqDjn53yht1j0b3iAoBeWmMWkc/ob/eJXZ1ORXXArigEMmjNp4OVEbc/ze578vA5rWuigpixGCh0FTLFypmTv2P3HPqzX2s/Cxb5vL5j5NMlfnU6FdECkMRYVACNakZW2afQa9PGpB9406MdcuFUdMAND19su66r1lGG7qQ37d95ZN8x9nnko/gyQtDtSzcqFwDUwYmaFAKZYGX43z4Z58IdO691zWG3NAqBTnxuZTwyiqIj3BNFSDpjRt4fKyC47Smv2OW9ylUKAOqAXV4IhOIcn9gdc08jF27fca1r6vQVN8XKhfNfMVs/8IZHtMYMH8NyH2/qmPvoEr+8Vzn6WYeOXZIWEhVAmxoE3Ulv4gSZQYg+O/BGPYOgO+nznKCqQUBFmi8jBN29ege771SFAoA6ONEJvBBoy6dOnlved2PiBKEmmx9drBQ5QRnN2/y4xu6nmxsFAA/0aSnsohhHtxDIBCtYjJhs+E02PyZYweKPbfjPq8+Zos2PS/zmbfhDxC5JC4kKoE2PBHQnvckx2JkT8ZHAMM0jAd1Jn3cMJqvNI4F+3owQVBQAPPRG8IZI5TkgKVy3EMgEKybHYKbpDyZYyTsGk9G89AfX2BUFAL+ULwCoA3YnGhQCmWAFx5EmKT8m6Q8mWMHxL+6L42DVzxalP7jEb17KT4jYJWkhUQE0TwpGgYIvIwQVifA71RPhjx+Ik4JH3fmc1THJaFYivKzubBCaTn9qiDcjBEXXEdx3bOeXgzdEKs8BSeFxIdBpJ88t77tBERBLhF+/V/l6pgVQJlgRifAacx3dP1gB1CN9rY1HRptzXb4AoA7YNbF/JlhBQQLuu3PlVq1rmtg/E6zg+9ed60X2zyV+xVy/WX6u0wKQxFhUAG0SFTCZ9GIHnOiJK6uHdx8xqmg0mfSDMqgwZBXVqvgsqld9GSEouo7EO2D5DgB1cKImUQETrIAGiFXOf6hOhQEaChMKJBOs8Mp5RCZUPwuWgCwKJNfY1Yn21wG7oiOQxgmICVZAScIq5xeuU76e6QmICVYQAWbR/t3q0f6iExCX+NWJ9tMC8I9Arrzyyl5XXXXVzyPtE/37L4vee/XVV/+X6H9/+o1vfOPfXnHFFVfKXF8W0KZ5QSaTnufAID9N9Zqfbt6vnBdka9KLHJij6jkw4KtjnGZ9xnszQlCdDgB5higU7EJN8oJMo5+4BgAAIABJREFUsMK5M3XIcEFEq5oXZAsrzXzfY8qfBU8o4zSL/naf2NXJ960DdrM6AvnA7rw+49h9N2hwZ3ISdN0caBOs8Hxf5ISqfnb3qvwcaNf4Vc33pQVgi0tkeK6JjMtY/Dv6/19ExmhO0fuj13dG7/si0nmXXXbZ12XuIQtokRx7i15loMmkR0VqXAW3UfmaoqtBj/7eDREvAEi2w5JVdKzAZ9NdDVwbIZ0OAFmGKCTs8spAVIO7wm7edyO658xZrXy9vEIgH9jlBQA63XPQKQifTXc1cI1dKCIoKhX/oWMXmtURyAd2TbrnmLZBNMEKqsBZxf/Hu5Q/u21JgwWh13CrY5LRYY1TCtliR1oAtrhEBuX5yBg9wH+ODM2pkvd3Vr2HLKBFcuxdetxgJpMenHS49yYNHqwmN9gw74bIpAAgr6+pDycK4mJ0AFB5RiFjV3CD/fRxZ88s77sx6Z+dVwjkA7smBQB5fU19YBf5kix3UZLzM3Ts5nUE8oFdk/7ZpjyoJlgBDyTurcP5uWnuR+yzc1552+qYZBR56irFjrQAbHGJDM/wSO9J/HwSxwx5748MUb8rrrji5uj/v/3mN7/5n2XuAUB/8UUMpiI9vLvZHaDsvbqKcWSNZ0Fbgwl/xgrla25pX8M+O/ult6yOSUaRBB/nLu5T/uyy4TPZZ1eNb7c2HllF67K4eu8P0s8oZOyePBS3Exx1x7POnlned5P3Pcqo6A7w9BDv2OUFABiD6mdXjWtnn102fJZ37CZzF1sBu5iDcXFAD+/YzfseZXT/hrgQaHJkA31jF51gWO7igrXKn103fTn77IK2SVbHJKO82OfwniPa2CVpIYkMyqhoJ3p34uezl1122Z8VfORr+M/Xv/71P4+M1kaZe1yUlHMH4pD+1MfaZD9iTT4aEzdD3/reCuXP7lmyLo6kDZ7qYGTF8v5zMYHr8e2fKn/2g+Ez4gq89o8cjKxYRt0RO9F/+od/lP5MyNj98nSc1zj+vpe1noeJbJoWH+Wvm9iu/NkDH8f9pBf0fsfByIoF98S9D6zZofzZtRPihcOmaUsdjKxYxnWOneiXZz6X/kzI2P2nr/4xPnm581mt52EiO+evjiOAI2Yqf/b49jj3+v1ewxyMrFiWD4qPrmH7VWXLrLgV5sdvz3EwsmKZ0oi6nz94QvozMlgjCVgi43I9jEakG1I6BzvKyBB1Tbz3TN51oh3obdHrgxo//ovo8/9T5v4AkcyOZi/PpevZ3+suFLryrTns3itHz1a+5seTF7PPoqG6753oe78ZEecuLtmg/Nl5jdyxTXNWe92FQpG3w6oO9x8vfN/KlR9fvP32Oy7+/Od3XgwZu59tjQmCx3fr7eyZ5X03PJdz8cCpytfb8D4vBBrnHbu8AAD5fKqf5blja6Ys8Y5d5EuyhevWz1oCuzyXbsw9v/WOXZHL2Xus8vVQ9MQLgXxjd/GgqfEiLrL9qp9dMToONnwwZo7VMckofGucu7hT+hnJYI2kphIZlm9jN4p/X3755ZFtuWoBfy0yUFck3xsZoh9E7/kb/Ptb3/rWX0XvXSFzDwAaYCrLN9ixLM6lQ1sin3ko0I8mLRKLONVrrhwzl312xajZ3nNR5r76TqMA4CPlz+ZVj5qMR1aRt8NyF7cf1M5FCQm7aP+Gvwft4Fw9s7zvJq+aW0ZFIVC0oPKN3UX9+SJuqfJn86pHfWAX+ZIsd3HtnpbA7gGeS3e/Xi6dCVbyqrllFEVP+OzcVCGQD+wuH/V+vIh7e57yZxcPmsY++9GkxVbHJKPIU2e5i8s3a2OXpMUkMjh9I2P09408E04x8LXI0ByOXvt3qfc+gJ1r9Fpv29Vom+fzXLoxXo0QdN3Mleze7W9MUL7m0qEzGjlYC7wbogX9JrF7r522XPmzefxxPpwoz12UJS/OM0ShYJeTas94eojRc9HBSh6fo4wi+Z6lL4x4zzt2l42YFR//jVUvAMjjj/OBXRCns9QJSfLi0LHLSbUnP9rmHbt5fI4yyguBFvSb7B27sPW499KhM5U/O//1Ceyz62d+YHVMMoo8ddx7c/saI+ySkEiLLKBNFmGmk765+HxL+ZomizDTSW+y+MzrIOHDiaqSF1dliGSfg8kizBQreR1dZBTJ97qLMFOs8MUnFoKqn83rIOEDu6rkxaFj12QRZoqVvI4uMsoLSHQWYaZYMVl88gKSrEWYa/wWLT5Dwi5JC4ksoPkxLELkPo0QlB8/61C5zHlF/xjWdNLz42ccSah+No9CxocTndXIXZQlLw7difJjWBxNunpmed+NCZULaFR0j2FNsSKOn/urHz/nUcj4wO683mrkxaFj1+QY1hQrJlQuoK/SPYY1xYo4fn71HeXPCgqZjGNY1/hFnnDe8XNI2CVpIZEFtGkuncmkNyFzntVLbTFjc9JjIvMCANXPchLpY/tPejVCUNXcxdCdqGkunQlWTMiceSHQhvdXecfuBr5o7q2+aOYk0ge2HfCOXdXcxdCxa5pLZ4IVENjj3jpkzov4Ymay3GLGJnZ5AQo2sqqfLSKRdo1f1dxFWgCSGIssoE1z6UwmvUk7N36cuXuVei9W00mPUL7usbloI3fsvLXxyCqOTlSOzUN3oqa5dCZYQSs1VsWp0c6NH2duXbjeO3ZxhKp7bN5sI3fcO3ZVcxdDx64g1X5TL5fOBCtoYYl767RzE8eZs+SOM21iF6krusfmRW3kXONXNXeRFoAkxiILaNNcOpNJf3j3EXZvNPlWvabIpduwz7sh2tyun7s46EePsc+eP/ulVyMEVV3sh+5ETXPpTLACQmLcGwTFqtdLkjH7xi7y93RzF0fc/jT77MnD57xjVzV3MXTsmubSmWDl3JmYhHpwZItUryfImNvXescu8qZ1cxffvvdF9tnDu49aHZOMquYu0gKQxFhkAY3WOCa5dCaT/viB0+zeo+58VvmaJu3YTCe9SRu6N7/3AGvJ5tsIQfPa0IVmiGSfg2jHpplLZ4KVs6d/z+495OaeytczacdmihWT3EV0rcBnsYDwjV18xyxilmpDV1fs8nZsurl0pliBHYKqXs+kHZspVkxyF0fe8Sz77ImDp62OSUbhW3Fv5K2HjF2SFhJZQM98bjgD5/alG70boTMnGr1cf/Zr5Wvm5dL5METII9HJXRQ77x/38G6EoKo5c6E70WZO42pnzyzvuzHp5ZqXS+cDuya5i/hb0Usaf7tv7HLyYtmcudCxy3MaMSd9Yxc6uHESkV7Ml6nIpVuz2zt2TXIX0S8cn0X/cJtjktFtSzaye8/sNTxo7JK0kMgCGosYgBMFGb6N0IXzX7F7D7zhEeVr5uXS+TBEyCPRyV08deQc+9yI2572boSgKDpQKQAI3YnCoLJCoCXuNi9F382gm7rHx/nnvlK6Xl4unQ/s6uYunj/3JfvcoB92rwS7ogCgl1wBQOjY5YVAWNhWgV3k/zH7eVTNfvJcus+2dMylc41dk9zFATc8fLHtuq7M5/jG755Et62QsUvSQiIL6KLkWNdGSEzM6P5ZE7NI83LpfBgi5JHo5C7C4eftYH04UVXqidCd6JTHB8SFQKt3OHtmRd/NsFufYPc/feyC0vXycul8YFc3dxEbLeZ8b32yEuzuXrWD3X9q9J23AnZVKZlsY5e3hURLOpXriVy6PR1z6VxjVzd3sSzQ4Bq/qsWOtAAkMRZZQL997wtxNGLvMe9GCCpC8yc6huaLVDeHxcak57mLyCtR+RyO/FgOS0b7Jz9OVK2KLnQnOuHB1xubl/3OnlnRdzP67l5xGsKnamkIPJcOeYS+sXv21BeN3MWOaQhFilQLfG703b+pBLv7N8VOdGL0nbcCdqf+emCDxaCazQtvC3lAsi0k16JcOtfYherY/dMnPi9MNXKNXyyWWcDgXrmAAS0ASYxFFtDNaMRZ70YIigIQ3B+LKtnr8Z2gqhOzNem5E8XiVeVzSPpnCfgZ7Z+8ONGNn8RO9KE3gjZE8puX/Mo+H/gd2/nluBBpp1ohEoqA4MTSuXQ+sMtyF7+rnruIYiv8rWPve7kS7KoyBoSO3YmNzQvmZBXYFW0h18m1heQ65Cc9481LZAN9YxeK/GnV3MXjn51qFBs+52RMZXrikFrUnRaAJMYiC2idCWVz0sOgx078iLMJZXvSxwUAXZWdKGg/YgqOwd6NEPTQrsPs/u/86qWgDZHsc8D3z6IRh9xtXoq+m0kPv6HsxE0oOGxhZZBGAQDolhgFx8MdKTh8YPfEwTNKUffQsYs5qGr3bGJl2pOcimib0vVYIdD1HQuBfGFXJ2BRZvdc41c1YEELQBJjkQW06VGq6aRHXoTqMZ7IwZMMqbuY9EiGV81BBPEvy8F7fpR3IwRVpd0J3YmaHqWaYkXnGI/n4MGRVYVdFCGp5iAWpQ/4wG7z6FqOdid07JoepZpiBXnAuD/ygmWvxRcygyrcvPCUJZUcRJ4+MCEnfcAHflX8LC0ASYxFBtBFtCQ+jBBUpwq5bEL7MESiiu6IvBMtqsL1YYRAgaBydB26E8VRahYtiS/8inaEClXIzXygFyrDLiqAVfN+i9pw+cCuKu1O6Ng1PUo1xYpOFTI2DHksBr6wqxMwKKvC9YFfFdodWgCSGIsMoG0cpZpOepApYwzbl26Svh6qPlUqAl1Meh0qD87Dl0Vm68+Jdr044AcPSz+jULFr4yjVFCsgdmVOVIFEXZdCyCZWdKg8eO/aLDJbH9iFqlT+h4xdqOlRqilWYIPwLFVI1E3aH9rCCq/8VwkYgOMWn8kj7veBX5Wja1oAkhiLDKBtRCNMJ/2cl8ewMWyaK+9ETZqC25r047kT3fqZ9GeKOnF4c6KCu67eTtRGNMIUK6ITydRl0tcS0YgKNy+IhKg60aJOHL6wqxJ1Dxm7RZyKvrCr04kEGwa2eYlsX1XY1Ym6NztxvO1kTDKqEnWnBSCJscgAWpWfyMWk572IVZwo7wowT7IrgItJz4+u0RVE9jNLhuT34vXmRBUItEN2ojCkptEIU6ygLy3GgD61stfiXQFkCY1dYJcTaKt0/xGbl2jhUBV2m1H3cJ2ozHMwITS2hRXYIIwB/cFlr6VKaOwCu3P50bVC95+yXrw+8KvCt0sLQBJjkQG0jQltOumXDZsZO9Gx8k5UtDTrL9fSzMWkn/ms+tF1e9+J7DPrZqyoxAhBVQhgQ3aiPBox3iAaYYqVVePaG050pvS1+FEq2thVhV2do2ssFKrevKB9nWzUPWTsFhHC+8Luuukr2Bhgk2SvxY9S0T60KuzqHF1jg4bPLBs+y8mYZFQl150WgCTGIgNo1R6FLib9h2NjJ4qFoOz1io5SfRkiHCeoHl3PfvEt9pkt7WsrMUJQlT60ITtRsXlR7MdsEytrpy+PIwttk6SvVXSU6gu7OkfXYvMyvbrNi+hDKxF1Dxm7Jv2YbWFlc/saNobZL70lfa3mUWp1mxedo2ts0NjmJdqwuRiTjGLRLBt1pwUgibHIANrGhDad9GunNZxoP3knWnSU6ssQ4ThB1YlOf2oI+8zOlVsrMULQyd37xU5Uopl7yE4UkVe2eXk2O7HbB343z+dOdIz0tYqOUn1hV+foGgsFfAYLh6qwywvGdizbXGvsYu7h73j3sTcrw+7OFVviwoinh0hfix+lYgNRFXZ1jq6xQcNnsGFzMSYZVQkY0AKQxFhkAG1jQptO+k3zPlZ2okVHqb4MEY4T4qPr7F1llhax7/tzokNjJxo5gFANkcxzgCEtSuz2gd8dGk5URCMq3Lzwo2uVqLvYvGTgxhd2RcFYZDPqjN0dyzcXVqX6wG5RV6I8RZoOw82I7KNUH9jlR9cqUXexecnBjQ/8qgQMaAFIYiwygBYTOic3wrURgmI3HxvDoeoTOiMa4csQiaNrhWeHNlr4DNpqVWGEVJ9dyE5UJ3JsGyv71jacaHd5J8qjEVlHqb6wK46uFZ4dFgr4DBYOVWG3LJJTF+zqRI5tY+Xg9oNsDGPve0X6WjxfO+8o1Qd2dZ4dNmhs07s8O3LsA7/NXPfyZ0cLQBJjkQG0CihdGCEoPw7B0aTqhM6KRvgyRM0FiHz0dPRdvdhn0JuyCiMEVYmehuxEdXJHbWPlQMOJjuvyqvS14LjYAnx+dZuXzY2oOyJqsp/BQoFtXqK/uSrsluVy1QW7OlEs21g51uiPO/ruXtLX4owNMgtwV9gVUXeFgAE2aGzzEm3YXIxJRlWCLbQAJDEWGUDr5LHZnvQoRmBO9H55J1o2oX0YIp0jyKE/+zX7DDpyVGGEoDx/cvWEhcEaIqnNi0Yem22sHNt/suFEfyN9LXEEnxON8IHdZtRd/ggSCwV85tinJyvDrkr+ZMjY1cljs42VMyfirkDDIpskey2VI3hX2NUJGGCDxgrfMjYvvvCrkm5FC0ASY5EBtE4lq+1Jf3T/iZgS4e/knWjZhPZhiHSKENCBA504stj/vTvRUeUV1CE7UZ1KVttYOX3i89iJ3vKE9LVUinBcYVenCGEY37ycqG7zolJBHTJ2wV6gWslqGyuwQW3Xdb044Aa5rkBQlSIcV9jVCRhgg8Y2L/s7bl584Vel4JIWgCTGIgNoldJ0F0YIevrYhdiJ3irvRMsmtA9DBCoK5kR7yDnRMvZ/X05UcCgOnBqsIZJ5DuDRw9+hQghrGysXzn/FnOjAGx6RvhYclywNjyvschoSUALJfgYLBfytVW5eOAH8XAkC+JCxu2jAFPZ3YC5WhV1osyvQV1LXwoah6s2LTsAAGzR85vTxz52MSUZVKNdoAUhiLDKAViGndGWEmBONxqDiRMsmtA9DpMrlhfZVeH9e6zJfTnTD+40uKr3HBWuIpDYvjW4WaAvo8nmVfTcDb3pUyYnCceH9cGRVYRck4MyJShIRi83LTdVuXkQLSIkuKiFjd16jmwXmYpXYFa31jpZ3BYJyDlGV9pe2saITMBCbl/PZc9QHflWaLtACkMRYZACtwqzvyghBB974iJIT5e/Pm9A+DBFn80d7Krn3F7cu8+5EJfooh+xEfW1eyr6b4bfKt9ZLvh+OrCrsYqwYA9oCSr3/aPH7fWG3Dk5U5jno9LN1gZVma73yrkBQlS5CrrALH8ECBtHGy9b7feBXpXMRLQBJjEUG0DYmtI1Jj92crFMUEcMb5SOGLia9aj/Pskbq3p3o4wOCNUQhbV7KvhvVOaQaMXSBFe4U8yJ6aS1rXeYLu3VwolKbl55hbF7GN/rTys4hlT7irrALxWlRUUQvqWKzc2v+ZscHflXa/9ECkMRYZABt4yjVxqRXORbDWFUT711M+rKcvrSWRS+8OVF+dF1zJ2rjKNUGVlQWojxnUCXx3hVWUJCUl9Onihlf2FU5ug4Zu6FsXngUXaa1HrSZM/hlpdjlBUkowrKBGR/4VTm6pgUgibHIALosN8KHEYKqJMY3qTfk+atcTfr+/+Oh3KretIpG6jlJwORE1bDra/NS9t2I/rQSifG8anioAvWGK6wMVXCivOApr++yL+zWwYnWafPSLALcVHod2DjYOti8qrErKIkkigBlCp584FelYIwWgCTGUgbo82fVIlguJ71KdZkODYCrST+0gBojrahWLapg9OZEeQS15k5UUOo43ryUfTegAZJ1ojq8ga6wUsTrl1axeYkWDFViVyWCGjJ2xeZFYvHtErvNSvpyGjBBeRTA5kWFBkyGrcEXfmUjqLQAJDGWMkCfPFxclerLCEFV+KVU6VdcTnoVOhrOYbao/5RKjVArOFGfm5ey70aFS1OHfsUVVlSi7mUcZr6wCw3diSptXiRODlxiF3yKeJYyXJo69CuusKISMJDha/WFX1F1feRckNglaSEpA/Th3UcZGN++98VKjRBUhWFehQrCtSFSyeURBMwjswmYvTrRH9bbiZ48fDbevNzufvNS9t2odNNRqWJ1jV2VKuqyLgY+sYsNK8aCDWwdsSs2Lz96rHLsoqMKxiLTTUcld9g1dgUFlEQVtUzHJl/4ffveF9hYDu85GiR2SVpIygC9f+MnDIwTH3y9UiME5T0mZZzohvc+ZO+V4bFzbYhUqvnQ9gnvRRuoKo0QtO5O1Ofmpey7QW9PWSeqQsHjGruCikSCRxF/G96L9ntVYzd0J1qnzYtKSzoV9gDX2FXhUeSbl6Ke7b7wOyHytRjL/k37g8QuSQtJGaB3fbCNgXHaE4MqNUJQlb6uH01axN67eNC0yg0RHLmsE21/YwJ777qZKys1QlAsnOrsRMXm5aE3nD+rsu9GxYmu55uXPtVvXrCBYk40GlPZe3n/6BA2LxO5E40wUEfsis3LL6vfvMAWYSztfSeWXmfrovXsve/9dmTl2F08cCoby0eTFpe+l5+85G1efOIXvhZj2fXh9iCxS9JCUgboLQvWMjC+/8LoSo0QlDvRJYOnl14LPWzx3pVj5lZuiODIMZb1Ek4UhhPv3bpwfaVGCFp3J+pz81L23XAnOv/1CaXXWT1xUQPn1W9esIGKneii0vfO7zM+xvnMDyrHbuhOtE6bly0L18WLuudHlV5n/awPYpxHWKgauyvfmsPGsmLU7NL3Yq7hvasnLHQ6JhmFr8VY8NxDxC5JC0kZoNfNWCG9+3NphJLGRSYyIhKXpyyt3BAJ4zKx3Ini6ATv3b16R6VGCFp3J7ql3d/mpey7wYJeNjKC/E+8F1GJqrGLDRTLSR2VnZOaVB7pRhSoauxiscKcaLSBrSN2Q9q87F61g41lqsSxLhZQspt019gV/cxzCuqSyiPdRZt0X/gtOwWqGrskLSRlgG4eXc2s1AhBVQo7VKouXRuissKOpJYVjPh0omInWlMn6nPzUvbdYEEvW9iBIgrZXFfX2OVV6dhQlb23rGDEJ3ZDd6J12ryodFbhBSMhbF7KqtKTKtMz3Bd+y/LAq8YuSQtJGaBF8vrY8rw7l0YIKhKMc4hmkzrjmaExZczycsoY14aorDoyqWXkr5U40WghFaIhKt28jGuXzrtzjV/hRLuWU7uoVLu7xq5MdSRX0NaEsnkpy0cMHbvrpoezeVEhhVepdneNXdCFYSygDyt7LydqLyrU84XfsmKqqrFL0kJSBmheebt2+vJKjRC0yY9WTu48+dE29t596/ZUbojgyJkTjRx72XvLSKN9OtHQd6IhbV7KvhvOjyZD7jzj6SHx5mXFlsqxiw1U7ESHlr63rPOCT+yG7kTlNy/uT17KvhsVcufZL8Wbl80BbF72rd3DxjK5e1vpewVpdAHfpS/8rp22vLQiuUrskrSQlAF69ktvxRN6/ppKjRAU3QiYE72rvL3bO796ib334M5DlRsiOHLmRCPHXvbe/t9/8GK/73bLJX+txIkOr6cTXdDW2LxMc795KftusKDHWIb+9PHS60x6uC977yfr9laOXWygMJZJj/Qtfe+Qn/SMNy8nq9+8NGk9JtUSu8uGzQxm8xK3d+sm1d5t+lPx5mVnAJuXgzsOsbGM7fxy6XtH3flcvHn57JTTMcno5kbAAIvpELFL0kJSBmgxoVdurdQIQc+e+oKNZcjNPUuvNfLnz7D3njh4pnJD9Mn6vVJOtPn39ajcCEGbO9F6OlGfm5ey74Y50Whh/+b3Hijt7MA3L4d2Ha4cu4d2HmZjwZiK3oe/CX9b0d/nE7uhO1HpzYuHkxeZ72bwj3uw8Zw9/fvC64jNy4Z9lWP3xMHTbCwj73i29L2wuezvi2ywyzHJ6E7JgAEtAEmMpQzQYkKvN4tG2Jj0Mk5GGKwfPcbGfe7MHyo3RHDkMk70eLT7xPuwG63aCEGbTvStIA1R+eZlsJVohC2sYONS5mSgYvNy6Gzl2MUGijnRaExF7xObl5/kb858YpdH3bGBrSN2Z78YzuYFOurOZ9l4jh84XXgdvnk5vPtI5djFYhVjweK16H18c4bTF9djklFE/mUCBrQAJDGWMkDbikbYmvRlx0xiQl/fVerIwochgiOXcaJoWs5yHLvk5zj6dKI7a+5EfW5eZL4bmWMm6KCANi8YA3OiJS3JZNIzfGI3dCcqvXnxcPIi892Mve+VOKUmslFF1+GbF3QyqRq7UPgAHF8XBQxk0zN84ZdH3cuOrmkBSGIsZYC2dZRqa9KXJZpDVZKWfRgiWSe69+Nd7H1oYl61EYKKo+uHi8loQ3Wi6KLANi873W9eZL4bmUTzC+e/YpuXAT94OAjsQmMn2rXQicoUaPnEruzRdajYBQF0SJuXyd37sfHsXbO78Dp884JexiFgt6yoDipboOULv7JRd1oAkhhLGaAH3dQ9ntDnzCa0rUlfRjWRnNCgVPExJhmFQy9zopznEJxUVRshaLOX7gtBGqKy5zD8tqca0YjiXsa+8CtDNXH6eGPzcssTwWB3WMOJYmOV9x4Ziiaf2BW9dG8r7qUbKnbH/OL5+Ci1pA2jL+zOfK7Bk7dkY+41xOblhnA2L1jUlQUMZCmafOEXi2eMZ9APuweJXZIWkiJAY9HHgHhTMRB9GSEoiHQxprxOGWxCN6IRMpxrvgwRHHqZExU9YHvndzrx6URPHTsfL0ZuLV6MhOpE4Yjarusa4firIPALAnPmRAvIZlU413xht4ybEsp7wKIbSAjYxXeO737gDY/UErvCXhy7EAR25702lo2nqCe02LyU2Auf2JUJGPBOJ1NKOp34xO/Amx4tDbzQApDEWIoALRuK9mWEoGXtptiEVui64MsQwaEzJxo5+Lz3yPSA9WmEZOkfQnSissfuPvEr027q083yXRd8YVd0p9nyae57ZNo0+sQuVCaXMkTsYt6V0UH5xq5MT+gj+8LbvJR1p4HKtmn0iV+ZQjBaAJIYSxGgDzaKEpAAHIIRgpY1nIeK5uUSfVd9GaIJD/RhY/p08/7c98i0UfLtRGUqV0N0osckKqp941em4Tz6LuM9Mn1XfWF3Ku9PvSq/JzRvGVnUA9Y3dkXlagm3W2jYRYFbWUVO6997AAAdjUlEQVS1b+yKntAF7Sz3b9rP3gNbFwp24QNYwGBhfsAA7QLxnvmvT/AyJhkde9/LcdHNjnweW1oAkhhLEaBVWq/5MEJQmRZPgr+urZi/zqchkqnq411Xitoo+XaiPIem6PgvRCfaLEowTwOwhRXeE7qoO4Us9Y5P7MpQkoiuK+/kExf7xi4KUsqO/0LErkgDsJDDbAsrTWLt/O4UsqwBPrGLVnoYUxGfomzLSJ/45fnCKAwMDbskLSRFgJYNjfsyQlAw4zMnOiy/RdLKt+bEu9VR+btV34YIDckxJjQoz3uPjKP17UQndOtdGrkM0YkiWmUrkmYLKzIbk4/fXcLes6j/lGCwu7D/u2xMGFvee2QcrW/sThGRy/x84RCxazOSZgsrMhuTjXNWs/fMffWdYLCLiCXGhAhm3nvQbo9tXsa2exmTjIrIZUGqEy0ASYylCNAhNSTvMKY38sP1cJ5lDsu3IZLJoZn2xKDSKKFvJ8rHtOuD4jGFht3N7WvYuN9/YbSX5yTz3ciMCZuWMoflG7t8Q7Vi1Ozc9+BvYpuX9nA2L3xMW9rX1gq7mP8Y97QnBweDXTGmyB7kXUMmh9k3dsWGakD+hgq+BO+Bb/ExJhkVY5qRPyZaAJIYi+mRlU8jBBXVhr3yqw1FCzDDhuQ2J71MX12ebI9CgBCMUPws4+bumwqeZYhOVObIyjd+RbVhQXGSzf7FtrAi01eXJ9sXVef7xq5sSkVo2N009yM27jkvF7ex84ldnACUFSfZ7F9sCyubJFoCgnarrDrfN35lUyqqwC5Ji8ir37n3L//fz/+QX/k1cGpp1MqnEYKCiBRjmvxoW+57pv56YBy1+jA/ad23IeKJxkWRS560HkJDcq4y0dTDe45c7Pvtzv/BK3b/pst/+vLs7/KT1iWiVr7xe0AUVeUz/POjHxQyhYLdLQvWxqkgz4/KfQ+6FrCk9YJOEb6xK6KpERby3nN037GLwJJP7GKu/OHU+dzn8NHkxaVRK9/Y5Z1eioqqUERRVqDnG7u7PthWGrlEtxi8Z9/aPV7GJKM8moqTo7z3HP/s5EX4cJ/YJWkh6dvp/uMjb38qAlM21UAzb211EEYIih6TGFMRObEM95NvQ8RJnosil5x0u4y2wqcTLcunBK8h+Pb6duqyxit2r+2yGw3cL+TwZMnkrfnGL28JWEROLEMW7Ru7MsVgTdLtYtoKn9gty6fEPBv848cuAktesRvNlYE3PnLxzMlsTlCZvDXf2OW0SkXkxCKSVkAW7Ru7MiTPgnR7dzHptk/8bpy9qjCfEvRAw2998iJ8uE/skrSQROA5zyg+cvrqopoLr6OxeghGCApiVIypqM2bDP2Db0OE3SWLXHbPjlwKA1tCuu3biZYd/6GtGV6PnNpmr9i9tsuB+DvOZvi3mQZgCyucnLiozZuIpBXQP/jG7kGJyKVoF3c+n3TbN3bLjv/QHQKvt3W6/zOv2O3UZUv8HWdHS22mAdjEiiAnzmnzhlMZFklbtycY7MrQQfF2cSCy9jEmGd2xfDMb04ynsyuqebvTtmu7nPOJXZIWkrZOXfYAREf2Zu98Jj74OgPZ/o2fBGOEsPN583sPMM0jScUutSyS5tsQicjlL1/UNlS+jRAUCfRFhQucty7aTCz0it1r719bVJ3cLF7Z5uU5yX43ZbyKiA6WRdJ8Y1dELm/PjlzK8tb5xi4Kl4qO/2DXGpsXr9HryO4uiquTs1NUcNTO0gAW5BevVIHdso312/e+KBVJ84ldsbHOIYRnZPff7caIt8tIt33i95MN+9i40RM663XeptN39JqkhSQyfB8ARJ/k7Nh494oj+44FY4SgaDWEcaFVWfo13r4Ou1WfYypT3lYNYfus12U7QPh2omVtknjCeuTUxnvF7rVd5rCK6RWbM8c1XtDX5BfUVIHf5pzK7ghjs32dLaywOVXQVg32AX9TWQcI39jlhQsTcubUjmWbOXZne8Vup/snFEWnZdpdVoHdso4w3C7baF9nEys4bmeRy4x0kVNHi+1yVfg9sjeeU2PueT7zdZ4LH+lKn9glaSGJnOg0lrORwzU0VKIJvG8jBEUUDeM6tOtwh9dst6+zNemTbdWydpqy1A++nWiTUPnVzNfR1QKvv3HtfX29YrfT/aNx3w3vZSecj767V1xQU9AEvgr8YkfPNl3RDj/92tnTv2evDf5xj6CwCx1c0Fbtk/V72WuTHs6OVlSFXZCXY1wgM896HcUKDLuduozyit1ru7Sx4rqJ2cV147rEBNZIrwgJu0WUULbb19nESlFbtUM7D7PX3vnVS17HVKair3JOqhPvdtW3U5epPrFL0kISGaIhca5JR5oEmaPWKowQdHL3fgz82AWlX+OVljCiPscko0N/+jgb25mMnEtOoorCm1CMEPS4OJp+NvN13pml7zVdnvCJ3chpv4r75lFOoECk6Ki1KvzOeGYYG9f2pZs6vMYrLbF4DQ27o+/qlVuhvn3pRvbazGeHBYVdfPfsaPrm7KNpTnPV1qnLK16xe+19T+K+eZ0nRt5hL4fZJlbmvPJ2oyiwI5n9mRNxGsDQgtzsqrCLVqYs5zKjQh2dNvDau4+96XVMZcqPpvP8L8/Nbrvm/sE+sUvSQhKB57cA0YrRHakyeGgcYf2QjBC0qL8jjk3YkWUB11pVhqjo+I9H0spIVH07USR8s+O/G7OP/1ClxqIo13T5hVfsdurSnVV4ZlBllB1ZVonfeX3GxVQZszpGLmXTAKrAbtHxH4+koU93SNiFNo/UOx7/cYqjvp3ue9Qrdq+9717cd95rYzPHDNzmjblK7HIy+9UZkUvZNIAqsMs5KrMq61X6xvvG77Bb8lOdOMVRtPH+jU/skrSQ9L3mvm6swrOtY6cPGc6yKowQtKhKrqxooUpDVFRUg2gAXkNfypCMEJQXLmRFLnFkzXai/73zjV6x26nznbgv2uelxyTDWVYVfovIcsuKFqrEblFRjQzJeVXYLeLW5J1CXu903x0+sfvGd7rchPuiP3h6TDySVlZQUwV20Sotjlx2bMNZVrRQJXaLimpkSM6rwm8RtyZvvRhtvLv6xC5JC0nfazr/DCCa9ZuO3HTcGYFUOSQjBAW5L8aWRfC6ZsrSxoS20wHC5qRHST/GhuTz9GuIBsQ5bR8GZYSgRTxZPDLU+5ouf+0Vu9d2uT4v0surOydEC25fz0j2uwGpOsYGkvX0azhaY2kAljpA2MSK6Agzt+Px3yJBGL84OOyin27epotHhl7/TufrfGL3je90/r/zIr0yPKdVYXd9ZJtY5LL3uA6vIaUBr814Zmhw2C3qCIPTr7xTsKrxO7XRyzpr08U5F9/odN9PfWKXpIXk9Ws6f5slbz/StwPANjQmu43G3rYnfVGbL95CB/k9oRkizpSf1d9RLA6XZ1e1VmWEoMiPyTtC4QnWb3znnv/oE7t9rv3lX+Ulb3PS7ZnPDff2jGS/m6I2X4j+sjSAIdm5YVVid8ng6XGEevyCDq/JtAusCrvIS2SFbhnkxMAOO0b7duerfWIXnUdYhPqOjnm1nHQbhOChYZdXTWct8mR6tFeF3aKWpjLtAqvCL2/EsOH9VR1eQ8FVI3/1b3xil6SF5NX/3uWbANGYezrmbYhJM6xjuL9KIwQtak0lupfM7jhpqjZERV01JkhyLlbhRHHMirFl0VbwfKVX/+T7/9Indtv++hf/J8aURd8gNght5cc6vvFb1JrKdvcSm1gR7ckyumrItl6sArv8qCwrXYTTlrz6/3T5P3xiF3MF983Kq22SV3dMbagauzyyPjEjsi66lxS03asKu1hA5QUzVFov+sYvjtpZukhGP2CeT/56p1/8Xz6xS9JC8up/u+XP8vJNFr452aozsjnpRT/gjK4agkNrlR0OLZuTHon/eUcoosqyhLakCicqkr8nLLzk980qyx5VNCX/Wl6V+vIR78XOyGMrLdnvhndOQWVi+jW0CWTFTTm0TFViFwVXeekivMqyjLakCuyKTdfISzddSZYDYMk3eIf+JJsQHBFWmWKwKrDLO6fAVqVf4yks60tSWKrALgi3WbpIBpcpfAhey2KUqBq/vJUhNobp1zjLwZPX3PVvfGOXpIVk0I2PZBLPwtAzZ5RRaVulEYIe/eR4bIgy+L2QO4PXsjgCqzZEgusvFf1hHFqslVa3UgLgKpwor1BONyZHNTOPIFeB3ZGN/rNp4lkssJkzyqi0rRq/Ra0MeRQ4iyOwauxyrr+s6E+IrbS48gplVF8nf58kZq8Cu2Mbdgq2LDmuxY18yqxK26qxi6pktPtDK8P0pktEgTM4AqvGLuf6Q6eS9GucLxSckT7HJKN5FcqC5SDy3VVgl6SF5K27nmMgO37g9CUg4zkGn6zbG5QRusQQ3dDREIFEN2tnHYIh4j1V03lrJw+fi53R34bFRs91Mz+WSlXcAhsshzTCShXYnXB/g99r56V9c3ll8k5PPaxVv5uBjU1XmlSZ51Pa4n+ziRXeqnBkKm+NtdqCM5LovFMFdtHHHONOV9wCM3wuVoHdaT3ezLSvvDJ58/w1QWIXC2aM79SRc5f8nudT2uhhbRsrolXhzZcSrMN3YDELXyJDueMbv+ipHNvXS3P04avZXIzsRRXYJWkhmfpYHALHDj8JMpWdkW8jBBXt4I42OZJ4JwX0Aq5iTGXK2d1BCJ38PW9ZJcP/VoUTzUtMh5PC7+G0qsDu+8/FCf6IrCbHha4l+D26mPh6RirfTVaLRdFJQSIKXAV2MaasTja8ZZUM/1sV2G12snntkt/vbCwMpz05qBLsLugd5ypvbr90occLrkBQHCJ2edV/usXikMaRtq2uUbaxMuimjv3hsYjNyyMOAb95J1184w3KnSqwS9JCsrDP2MwEf+zo0xMmFCMEhUFPGyIVZ1SVIRIkr2ebO07kfLGq1V7DgzNC0DxqCsH/NmxmJYZoxZCpmQn+wxtHwycPd2z9FAJ+321Ef5K9XlWdURXYzdp0iV7RPcqJ16vALtp/YXwjbnv6kt83C4UmVoLdj9+JcxPTfJBFlEshYBeV9RgfKu357xhZfE5RSyjYzdp0iY1319cqGVOZsug6Aho3XRrQ2JQ4kakCuyQtJGvGxdW+SdoUntxvqyepi0kv6B0ShkhEqiTa+lRliLIiq+BPy6uwrNoIQZtHKJcWCyVpbarA7uYZsRNP0qZU0cJQ9bvJonco67kcAnZ5j9pkZFWFLqoK7F44/1VmS60mrU17JdjdtTB24mnalCpaGKp8N7xSHVXh/HdFOdmhYFe0D01EVlXpoqrAL+/BncSDYOgYPosWgCRmsmthfIwHZ84BhgKKOLn/+SCNEDNEGVXKnGMNvGShGiJwLmKM+9buEb8Tid+pKttQjBA0KyLME793f7itEkP02UcxpUqSDohHfGTyKavCr6hSTlBmCI61p4cEi93pT3Xkqsyrsg0Ju8BCOiLcbCe5thLsHtv6SYeCMB7xkcmnrAq7vEo5WRAmWBke7cjKEAp2QauDMSa5Kjm1UVaVbSj4hQ+OI8JHxO/QcpEVuc2sZuNN0kJybFscBp+aKJHnrO5ZrYpCMEJJQ5SkS2i2KrJDpOti0osk70Tuj+CiymhVFIIRgook70RbIm6cjuw9WokhOvdZHHlAtwc+Ju6M0onTIeEXEVO26Ur0zl07fXkcEerbsS1jKNhFtIpFfKc3icx5b+N1M1cGi11e0JbcdE3o1ruRQrK/Euz+4XRcDY4jXz6mAzlFYiFhl7faTFamJnOBQ8UuTglYxDfRapPTW2WRm4eCX17QluweNaXRIQT0NlVgl6SF5MuGIUrmzfHF1aKMdlUhGCFmdNrXdIj+oDNIOioYmiHKMjoq9B9VOVHeeojTAuE4rZnP+IdKDNE/ffWPHfLmBO3Ha2O9Ph+V7yaLDghdCtJRwdCwy6N9yY4KKvQfVWF3LueoS9ACNfMZz1WC3f/9//0vQeXBj6Y57Qf4IEPFbhYdUFZUMDTsck69ZPcosfFuL994V4XfRQOmdDgd4vmMR/cdowUgiZnAEKUpVXiIGVGJEI0QM0SJSij+O96wfodF+g/bkx4FC+ncnxG3P81+d+Lgae/jkVXOSs9zRQV1TbT4wliqwO4///M/i0UoP5rmuV2IBvt8PirfDacgefuXTV4y3rA+q9tKKNjldEDJSA+41fA7cK2Fil0UWiRzRQV1DSta+IdKsIvnIBahDUqVKrovqX43SQoS/jueC5zVbSUU7HI6oOSmayLfeK+XozqrAr/cX/AUrSR1zYVzX9ICkMRMAGjO7cRzZDg7elbv1xCMEBSLJbYAue0p8TskIacrvUIzRLxqklOqoIIOSeqMXuN8Of1HVU6UJ/ujgAE/87ZQOH6tagGI59DMkYmrJmc807E4KDT88iIrVPfxTRenrknTa4SEXV41ySlVMHZOryFTtFAVdkWy/7PD2M+8qh3Hr1Vid8ID8TE0b/8455W3OxQHhYZd2ChGWh/ZLM5kwKlrklXtoWFXMET8XbNQheeGnjh4ppIxySieKcuv7N6P/ZzMca4KuyQtJLEh6nPJTojTaMhEpKowQswQwfk0KqTOnPgd4ynj1Z+2eNRcTHpBqNvYQXNy6GQ0KDQjBBUR18bRT/IIvkonyo8gOReg6AQjEZGqEr886stJn3m1HyquQ8Uu5hnGyNkB0lgOFbsi4troBJE8gq8Su+89P/KSfOAJihGpqrDLo76c9Nk2gbkLrKT9A/gKGZajeSfLFlAFfnnEldMY8SN4YIUWgCTGAkDPeXmMyJFh0YkGs3+oNBpcxzcSuZE7x3f1yR1eiIaIhfBviEP4eNZ8IZXVYzUUIwQF9xvGyVuY8ebvqGit0onyanC0zhLRieu7XcKzGCJ+ec9q5M7xXf2wW54IGrtQjJFtDqMx84VUVo/VkLCLI19ggrUwizDCWxsCO1Vid/nIuBp8+ai4gpq31EObupCxy3tWI3cONgy2DKkYNv2FC6zAN7Q1KmrFQkqCfL9K/LJc60bnIDQ64DnO8Nm0ACQxFgD6o8h58gRZzkc29r6XgzZCUM6nhknByTFlF1JVTnq+cEWrH7GQGlVOo1GVEeIKHkCMFbtn0JXwo9Yqnag4mo4MIrgV8e9Rdz7n/dmofjecTw2LEdCqqCykqsQuX7gip4ovpGT4K6vG7qg7n2VjPbb/JKOJYketEXaqxO62xTEB/IxnhoouQeioETp2hc2K/o/KatWFVFVY4QtX5LLyhZQMf2XV+B3b+WU21gPbDkQ+ehL790eTFtEC8I9Frr766ocuv/zy68red+WVV/a66qqrfh5pn+jffylzbQB6b4NAGXQJ6xsO1WZJv6sJxiu7QEWxqMGll2bWD9EQgeqDTeLJi0VJ//alG4M2QlCeNI28FH7sg0VXkSFyjd0DjQ0LqDN4R5Vkoneo+N04e1V8hP7bkRdXjJ7N/o1Cm9CxC4oljBUVwdhs4d8b56wOHru8QAwYQboF/o3NbpXYPbb/uDhC57leyaK2ULG7bclGNlZQh3ESe5v0Ra6wwjsXgXd1Xu+YvkiFMaIq/PICMfhm4IPn59MCsPXlX0UG5bHIEG2NjMt3i94Yve+a6H1j8e/o/38RvX+OzA0A6LMnf8dyI3B8xo26zYouVxPssy2fxsnc9zwvelSiyCJ0Q4SjdpaU/tzwOIn+uq6XtNcK0QhBOZcWT1bHkRWOKHIMkRfsohIORyQ4hkJrJBebABdY4d0TkMyNNmp8cRI6dkEDxKKVPfuLJHrZfuFVYpc7f4aRRgUw0gSqxC4qkPmxL59TNjlMXWGFp4Og5zrvyITFSejYBW8exooTGF48ptIvvCr88raF8M3oFw5fjXxcWgD+kUhkVCaWGaLI+DwfGaMHEp85JXNtDmjeoYIruoGEbISgSOZFQjofMxZTtnO/XEx6VJ3BCfFxyxaAVGmEoDzniyvvuFJkiHxgl3eo4CrDpxgCfnkUFQrDDqMeOnZx/I+x8nHLFoBUjV1gIokR3nGlauzyDhVceTFT6NjlUVQoNl/ICQ0du8gF5VXr7Lj95h5SzAtV45d35uLKO67QAvCPRGQMUfT68EjvSfx88hvf+Ma/Lbs2AP3FF81OBCyfo0Ht4VsxDj4e2c8sauRSJRNjqx6TjGIS83EjB7Pq8cjohfNfiupV5qxWbBFjqhK7m+d/LMYUd1b4h1rgd0Ujl4ovSKoej6zy/E/oilHvVz4eGQUmeNSH5YFFmAkBuzsb/HR8MY05Vgfsrp648JIFSdXjkVVe8MhyVwdMCWJMMsopg9jpXOSry7BL0kIiuRMdFe1E7078fPayyy77M9l73PUnd/1p27Vd3ut77f2bel/T5a9NxutTXr3mrn8fTYolGPer/+2er1c9Hlnp850uV/XtdP/eSKe/+s0u/7rq8chK32t+9b3oee/q26nLcJn3+8BuJF9r69RlYjSm7a9f0/nbCp+rVJ679tY/j57l3LZO9+949Tv3SuWOhSAYK8aMseNvqHo8sgJsACPASvTj18re7wm7f9L32vtGsDkVzS2Vz1UpT15z17+B7YINa7vml1dWPR5Z6ftf7/oGfAV8BnxH1eORFfjkeNxd3oOvrno8JJYkMhjXR0ZmY6QbEroxmUuicBTRNfHzGZfjJiEh7JLUVQi7JCQktZAsQxQZnSuSP0eG59vYjeLfl19+efT2qxb4HCMJSZYQdknqKoRdEhKSSiUyOI9GRmVfpJOif3+/8euvRT8fjn7+d6n39o2M0d9H2u+KK66oTViepDWFsEtSVyHskpCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQeJarr776ocsvv/y65O+uvPLKXlddddXPI+0T/buSDgXRuP5L9L8/RVulqqgVQngOaQnhuSTGcgl2fD8vwm6+hPAc0hLCc0mMhbCbPa4gvqMQnkVSQnkujbFUil2S1pB/FYHlsQhMW5Nkp9Hvrol+Nxb/jv7/F0lmfJ8S3XdndP8vIp132WWXeW/xFspzSEvVz6UhHbDj+XkRdgsklOeQlqqfS0MIuwUSwncUyrNISgjP5U+qxy5Jq0ma7b7R2uiBxOunqhhXNI7OVdw3cf8gnkNaqn4uSUlip4rnRdjNvX8QzyEtVT+XpBB2syWE7yiUZ5GUEJ4Ll6qxS9JCkjZE0b+HR3pP4ueTCHv7HleDVf/m6P+//eY3v/mffd8/lOeQlqqfS1KS2KnieRF2syWU55CWqp9LUgi72RLCdxTKs0hKCM+FS9XYJWkhydiJjop2FHcnfj572WWX/VkFQ/sa/vP1r3/9z9Gk3ffNA3oOaan0uSQltRP1/rwIu9kS0HNIC2E34/5VjSFHKv+OAnoWSan8uXCpGrskNZEIDNcDrJFuSOjGZJ5AzlFE18TPZzyODTon2mndFr0+uPHWfxH97n+6GEPJ+Lw8BxVpPJdBjR8reS5JyTiKsPa8CLtG4yPslghhN0zsNsYYFH7/mLBL8kcmGYbo29hV4N+XX3559NJVC3yPKZpwP4ju/Tf497e+9a2/isawwvcYQngOaQnhuSQlZYi8Py/CbraE8BzSEsJzSQpht6OE8h2F8CySEspz4VI1dklaRKKdw6MRYPZFOin69/cTv+8bgervG3kPVdFYPICdTTS23hVWo1X+HNISwnNpjKMDdnw+L8Ju6Rgqfw5pCeG5NMZB2M0fWyjfUeXPIjWeUJ5LpdglISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISGph/z/V9U2E0UtJTIAAAAASUVORK5CYII=\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Forcing a grid layout\n",
"# Use auto={\"ignore_groups\": True} to put every plot in\n",
"# a different subplot, regardless of their group.\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10))\n",
" figure.plot(np.cos, (-10, 10))\n",
" figure.plot(np.cos, (-10, 10))\n",
" figure.set_grid(ignore_groups=True)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9Z3Ae15U2OLNf1W7VV7Ozf8Z/NPNjRsG7Vbtb++Orna88nyV7LMuSHGSNbUm25bFkShYpisqBVCQlimImSJBgDiDBAAYQJAEGgAFgAHPOBAOIQBIklb32BNvCvs+9fRvNFx3u7Xtu99uNe6qOCLx4+/ZR93PPTec85y/+wooVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1asWLFixYoVK1as9Ev5+te//sztt9/+zbDv3HnnnUPvuuuunxR0ZOHnv0vKNitWwsRi10pWxWLXihUracr/XHAqzxUc0YGCg7kn6EuF73yj8J05+Lnw798WvluTnIlWrPiKxa6VrIrFrhUrVkpDCo5lQZgjKjiftwrO6GnP9zuTscyKlXCx2LWSVbHYtWLFSuoS5YgKfysv6C88v3d87Wtf+6tkrAuXEf/nI381+n88ue6jf3ry0Mh/euKOtO2RlQ+/8eu/Ldi9Z/T/+M2GEf/98b9O2x5ZKdj9j6P/6cnjBbsXPvIXj/yXtO3JMnafv/PB/6WAgRWFZ3l01D/96/+Vtj2yMuK//eJvCnY3QfFz2vbIygffePL/xrPGM8ezT9ueLGMXfR8+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8euvRT8fjn7+d6n39o2M0d9H2u+KK66oTViepDWFsEtSVyHskpCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQeJarr776ocsvv/y65O+uvPLKXlddddXPI+0T/buSDgXRuP5L9L8/RVulqqgVQngOaQnhuSTGcgl2fD8vwm6+hPAc0hLCc0mMhbCbPa4gvqMQnkVSQnkujbFUil2S1pB/FYHlsQhMW5Nkp9Hvrol+Nxb/jv7/F0lmfJ8S3XdndP8vIp132WWXeW/xFspzSEvVz6UhHbDj+XkRdgsklOeQlqqfS0MIuwUSwncUyrNISgjP5U+qxy5Jq0ma7b7R2uiBxOunqhhXNI7OVdw3cf8gnkNaqn4uSUlip4rnRdjNvX8QzyEtVT+XpBB2syWE7yiUZ5GUEJ4Ll6qxS9JCkjZE0b+HR3pP4ueTCHv7HleDVf/m6P+//eY3v/mffd8/lOeQlqqfS1KS2KnieRF2syWU55CWqp9LUgi72RLCdxTKs0hKCM+FS9XYJWkhydiJjop2FHcnfj572WWX/VkFQ/sa/vP1r3/9z9Gk3ffNA3oOaan0uSQltRP1/rwIu9kS0HNIC2E34/5VjSFHKv+OAnoWSan8uXCpGrskNZEIDNcDrJFuSOjGZJ5AzlFE18TPZzyODTon2mndFr0+uPHWfxH97n+6GEPJ+Lw8BxVpPJdBjR8reS5JyTiKsPa8CLtG4yPslghhN0zsNsYYFH7/mLBL8kcmGYbo29hV4N+XX3559NJVC3yPKZpwP4ju/Tf497e+9a2/isawwvcYQngOaQnhuSQlZYi8Py/CbraE8BzSEsJzSQpht6OE8h2F8CySEspz4VI1dklaRKKdw6MRYPZFOin69/cTv+8bgervG3kPVdFYPICdTTS23hVWo1X+HNISwnNpjKMDdnw+L8Ju6Rgqfw5pCeG5NMZB2M0fWyjfUeXPIjWeUJ5LpdglISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISGph/z/V9U2E0UtJTIAAAAASUVORK5CYII=\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Auto gridifying example\n",
"# Use ignore_groups=True to put every plot in a different subplot,\n",
"# without having to deal with groups.\n",
"# Note that ignore_groups=True will discard the groups you may have defined.\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.cos, (-10, 10), group=\"b\")\n",
" figure.plot(np.cos, (-10, 10), group=\"c\")\n",
" figure.set_grid(ignore_groups=True)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9aXAdx5Uu+HpezEzEi56e+dH+4+4f3ZbtNxEzExMxL6Ynup/l7rYs2/Iiq21JXqS2ZEoWKYrauWklJYriTpAgQYLivoM7CYALwAUgCXAHQZDEvu8oUAtltbxow9wvl7p161ZVZlVlVeFe5Yk4EnFRy0HdU5knT57zff/pP2nRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLFi1atGjRokWLli+lfPOb33zia1/72re8jvn6178+4xvf+MbPUjon9e+/jcs2LVq8RPuullwV7btatGhJUv6n1KDyVGogupwaYL7tdlDqmH9MHbMW/079/29Sx+6Lz0QtWhxF+66WXBXtu1q0aBkfkhpYNnoNRKnB5+XUYPS45fj+eCzTosVbtO9qyVXRvqtFi5bERTQQpX5XmNJfWX7u+8pXvvKX8VjnLbP/jwf+ct5/f7T07X96tG7OPz1yR9L2yMpb//ibv0nZfX7ef//tkdn/30N/lbQ9spKy+x/m/dOj11N2b37gPz3wn5O2J5d99+mv3/M/p3xgd+pZXpv7T//+fyZtj6zM/m+/+uuU3VVQ/Dtpe2TlzX989P/Cs8Yzx7NP2p5c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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Gridify example\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.cos, (-10, 10), group=\"b\")\n",
" figure.plot(np.cos, (-10, 10))\n",
" figure.plot(np.sin, (-10, 10))"
]
},
{
"cell_type": "code",
"execution_count": 32,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Gridify example, forced height\n",
"# If the default gridify layout is not fitting well, you can force the height\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.cos, (-10, 10), group=\"b\")\n",
" figure.set_grid(height=2)\n",
" \n",
"# Gridify example, forced width\n",
"# … or the width\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.cos, (-10, 10), group=\"b\")\n",
" figure.set_grid(width=2)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# You can also specify a grid directly in the constructor\n",
"with replot.Figure(\n",
" grid={\n",
" \"width\": 2, \n",
" \"height\": 1, \n",
" \"grid\": [\n",
" ((0, 0), \"a\", (1, 1)),\n",
" ((0, 1), \"b\", (1, 1))\n",
" ]}) as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.cos, (-10, 10), group=\"b\")"
]
},
{
"cell_type": "code",
"execution_count": 40,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# You can also specify a grid directly in the constructor\n",
"# Setting the grid to False ignores the groups you may have defined.\n",
"with replot.Figure(\n",
" grid=False) as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.sin, (-10, 10), group=\"b\")"
]
},
{
"cell_type": "code",
"execution_count": 35,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Note that if we use legend, xlabel or ylabel with subplots,\n",
"# they will be set identically on every subplot\n",
"with replot.Figure(xlabel=\"some x label\", ylabel=\"some y label\") as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\", label=\"cos\")\n",
" figure.plot(np.sin, (-10, 10), group=\"ç\", label=\"sin\")\n",
" figure.set_grid([\"aç\"])"
]
},
{
"cell_type": "code",
"execution_count": 39,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# You can avoid it by passing dict for these arguments\n",
"# they will be set identically on every subplot\n",
"with replot.Figure(xlabel={\"a\": \"some x label\", \"ç\": \"\"},\n",
" ylabel={\"a\": \"\", \"ç\": \"some y label\"},\n",
" legend={\"a\": False}) as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\", label=\"cos\")\n",
" figure.plot(np.sin, (-10, 10), group=\"ç\", label=\"sin\")\n",
" figure.set_grid([\"aç\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Saving figures"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false,
"scrolled": 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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Save a figure to a file\n",
"with replot.Figure(savepath=\"/tmp/out.png\") as figure:\n",
" figure.plot(np.cos, (-10, 10))"
]
},
{
"cell_type": "code",
"execution_count": 38,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9WXQVV5YtevPWGPVRo25+vJF+bwwyPzLp7v169XWzbmbaTtskbjJtp/t0b9OYHoNN3/cgBAjUgUBCiF4CCSEhQAIBAtQgBEhCLUJCLZLAuMmsW69qVNbN82LtOHF0EGrOOdGsvSPmHGMaYY5OrIgZsfaKiL3n+i//BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAkxo4dO2XkyJFPD/WZ0aNHLxozZsxbGtdpP//MqdgAAAAAAAAAa/H3WjE3UysAK7TC7tnBPqR95lfaZ5LpZ+3Pn2qfzXIuRAAAAAAAAMByaAXdvqEKQK3oW6oVgZODPt/pTGQAAAAAAACALRiuANT+LU7jB0F/73jqqaf+0ZnogKGw4Z8/+H82/ubzJI3VG3/9ebP259mN/+uz33DHBbgTG3/96a/ofNv0mwktRHHuaf+POy7AnaBcJnKantuq6Xxb/etP/m/uuADANQjhCWDi6NGj3wv6e/eIESP+Ybjv/dvf/uYD7MPtM8W+mJdm+LSB+AmeXLnL959//St3iIBLQNfy9YwCX9QzE5841+j/Xc8458P1DlgFyl2UwwbKbZTzKPcB9sKq+gKQHCG+Ap4Y9Pf7oXwvnUSPHv3F9803oNW8nnPFt+lpfTA+tjTB13Tzjq+tscN3MSXHF/PyLPH/MxbH+x70/uBIPKQz9HYvT23eHyj28uMyfM3Vzb5v23t8BfEZgaKQPsMdJ2gPnby+KWdlLIrTiz0tl1FOo9xGOe7YkgS9ENRy3/Xcq+zHxa0kna2oLQAF0L8A1Iq9UcH/rhV8v6SngPTzyJEjtY+OyQ3leylh0Mn08CFoJWuuVPuin58iEuGVQ/lP/HvTrbu+7a/oRWDupjRHYiKdobc7ee1EkTiXto6b5ruVX/6E3vT/6N/oM9eyL7PHC1pPJ6/vnI37xLm0/ZXZIpf1/3fKefTvlAMpF3IfGzeSdLa2ygCkhFbsTdcKulqNadrPz2n/60faz83azz/u97mNWhH4vsaoUaNGjQ7lu1EQWM/uzke+uDe+FgnwTMzhQT9Xf63et+WFqeJOubGi0ZGEAb3dx5baVt/W8dP14k4rBAfTuyzrkvjMtvEzxO9wxw1aS6eu78brDSJnUe6iHDbY505vOyzON8qFlBO5j4/biAIQMA0UBNbz7I50kfj2fbFevCoJ5bOH5mx1JGFAb3fxwYM/+9KmbRTnUNbKpGH1zlyRJD5Lv0O/yx0/aB2dur4PfblFnEP5selDfo5yX6qWA0P5LBiZ3tz1A6A4UBBYy+bb93zRz30h5lzRnfJwn+9qexiYD3i7qNL2hAG93cVb566Lcyf29bm+++3fDKs3fSb2tbnidyq13+WOH7SOTlzflKP0V7+zRO4a7vMN5Q0iF1JOpNzIfYzcRBSAgGmgILCW6f6J0TRHJtTfoQnU9Dupk9ba+lQGBaC7SOdK8mcr9XmmB8+GrPflA2fE7yR/tgpPAV1Eu69vOlf2ajmKzp2Le3ND/r2cDanidyg3ch8jNxEFIGAaKAisY1tjp3a3O0lMfO5s6Qn597q7vg3MGbxxutTWhAG93UNaYUnnTMJb83293d+HrHfP/e/E79DvXj9VzL4foDW0+/quyCsJzOmjcyjU3+to7hE5MerZSb62O13sx8ktRAEImAYKAut4LjFTJMjMFbvC/t3i9PPid5M+WOrr7Rl63qCZhAG93cOUCWvEOVN67ELYepdov0O/S9/BvR+gNbTz+qactOv9JeKcKUkvDPv3M5frfoHndmayHye3EAUgYBooCKwhJcj4N+aJJFd79XZEvx9IsBnhJ9hQEwb0dgebKu/qc7F+P3vAp3/D6U2/QxYe9B13K5vZ9wc0Tzuvbyr66FyhHBXJDSpZwdDvx785b9iFcWDoenPXD4DiQEFgDW+evSYS3O6PlkU8r4pex4nv+Hi5bQkDeruDZ2KO6B6SUfsj1js3Kk23Ktp+lH1/QPO08/qmnETnSsWpkoh+n3Ji0odLxXcYPpWgeb256wdAcaAgsIaHv4oRya1o/+mIv4PurGNfnSO+h57w2JEwoLf6pCcocX/8SpwntMoyUr0byusDc7rwVEZ92nV9k9GzWGn+2lxT01OK0k6L7znydQz7sXIDUQACpoGCwDxb6zvE4g8yRu1qfWDqu6grCCXJgvhjtiQM6K0+qwor/E+bh35SHIre9MSavquq8Ab7foHmaNf1nR+f4X/abK5jEeVGypGUK1sbOtiPl+pEAQiYBgoC8zQSZNaqPaa/y5grs+tPiy236EAB6A4eX7ZTt+JIyTGt94Vk3YKIvpN7v0BztOP6phy0873FEc9t7s+sVbttu8H1GlEAAqaBgsAce3u+98W9rr+OqyutNf19lHCNxSRWt4dDAag+u9ofBp6itDcNbakRit5kyyGeXo+b+oSRNKgW7bi+Rds3Wryh5SQrbkjrSmr0aQd//Mo2twOvEAUgYBooCMyRfPsooe35ZIVl35m39ZC/j/ARyxMG9FabxmpMasdlld4H/a297Fp9DjpDO65v6mVO58ZpLSdZ8X1URFKutNvz1AtEAQiYBgoCczQ6fwzUiSFSUoN1w+DXytfAKADVZ9pUve9vefZly/S+pn2X0R+Ye//AyGn19U25xzAMpwVDVsVJuRKdQazRm7t+ABQHCoLISa9/t704QySz4V7HhUNKvInvLNRfK5fUWJowoLe6bKltE+cEnXPUPcYqvem7xHn89ETfvbo29v0EI6PV13ddsf66due7iyy9EaVcKc7jl2aKHMp93FQlCkDANFAQRM6ay1X+nqorLf/uszvSxXef2jy4z1skCQN6q0vqokDnRPbaFMv1zl6TjE4NitPq65s8JumcyI9NtzzW5E/1Hta06I37uKlKFICAaaAgiJyGGS8Va1Z/952bTbr31utzLfNoQwGoNvdO1Fu/VV+8Zbne1Rdviu/eO2kt+36CkdHK65tyDvn+0TlBucjqWM/uOAoTcgv05q4fAMWBgiByGpOZrbBHGIiGc/7tokrLEgb0VpOdrb2+qGcm+raOm+bruf+d5XrTd9JKYFoRbNbLEuShldd39aVbgc5GdsRq2F1ZuXjOa0QBCJgGCoLI2NbYKRJYzMuzbLMzMF755WzcZ1nCgN5q8nruVX3175yttul9yL8amFoScu8vGD6tvL4p59g5JYByZsxLM8U2yIqI+9ipSBSAgGmgIIiMxUfPieR1bEmCbdswPLioAbtVCQN6q0ma90fnwqV9ebbpfSn1lD7HcF1ocwxBuWjl9U1G9HZ4kQYzY3G82EZx+nn2Y6ciUQACpoGCIDIenR8rklfpsQu2bYPm4Wx/ZZZld8koANVlwtsL9B7Rt0LvER2u3k3+eaeJ7yxg318wfFp1fRtvN7a/MtvWHtElWu4UdjALYtmPnYpEAQiYBgqC8Nnb/b1v23jdNqP9bret26LkSEmyLOuSJQkDeqvH5tv39O4Jr38Vlh1HuHrTd9OiI9pWS00r+36D4dGq67ss86JemC2MszXe9qb7IodSLoUdTGR6c9cPgOJAQRA+jQnSKRNW276tywfOWNZnGAWgmjSMc7NWJtmud+aKJN3Y/FA++36D4dGq69vo12uluf1gTPl8taUL3bxEFICAaaAgCJ+nt+ntkfLjM2zf1t3KZr0ryNvmX8uhAFSTR+dt9z8FLrJdb3rSTNs6On8H+36D4dGq69vo/nG3qtn2mPPjMvxtLw+zHz/ViAIQMA0UBOGTrBGs7tIxGB97LVdrrksDCkD1SKsljS4dHc3hTTeIRG+a0tDXpcG++V+g9bTi+m6pbY1oukGkNLqN7P5oOfvxU40oAAHTQEEQHlsbOhyZIB3M48t2WrJaDgWgeqwtvh2xX1qkehv+ljQ4c+8/aL/ewTTcDSjnOBFz8EI3yq3cx1AlogAETAMFQXi8eqTA0QRJpMLPim2iAFSPBQnHhfY07cApvU9vPSS2WZB4nH3/Qfv1DuaxpYlC+5L0QsfiNrZZfOQc+zFUiSgAAdNAQRAejadxTiZIevUbaAtn4rUMCkD1mPrFeqF9VeENx/SuKqwQ29ynbZt7/0H79TYoppv427/dqzM33SQcUi6lbWYu38V+DFUiCkDANFAQhEfySKNk1Vzd4uh2DR84WhRiJmFAb3XY1f7QF/XsJF/081NCbv9mhd7dXd+KbdK2KQbu4wDaq7fBpsq7LD6QtNhE3+5C9mOoElEAAqaBgiB0Ct8qmv/3+9mOTJAO5onVe0xbM6AAVIs3TpcKzQ/OinZc7wOzNottUwzcxwG0X2+iYTl1Yk2yo3FTLqU51bRtu31V3UQUgIBpoCAInRWnSkSSOvJ1jOPbNuw5zJizogBUi6eiDwjNL+w56bjetE3aNsXAfRxA+/Um9pnOh2c3ZAUPfxUjtl2RV8J+HFUhCkDANFAQhM48/+T4wt3Zjm+bWsGZXX2MAlAtpk5aKzSvuVLtuN41l6vEtlMnr2M/DqD9egevxm1vMt92MlxSThWLnbQcy30cVSEKQMA0UBCEzsCArA2OHNvf9f4SUw3aUQCqQ5rzR/PwNv92sq+785HjetM2jfmH1PqQ+3iA9urdeL1B5BbKMRyxUycQ3HCErzd3/QAoDhQEoVEMyM99oQ/IXd+yxJCzIVUkyUuppyJOGNBbDdaV1gqtkz9bFfF3mNU7+bOVIob6sjr24wHaq/fFvblCa8oxHLHTDQflVsqxkSx48iJRAAKmgYIgNNZeve3v/7uGLYZrJ4pEDMeWJEScMKC3GixKy9MH5I37Iv4Os3obNxxFaafZjwdor94Zi+OF1teyL7PFT73VKQYyP+c+lioQBSBgGigIQuOF5Bx9Uvzm/WwxtNS0mrJpQAGoDqnIFxPyMy9G/B1m9S49flG/4ViayH48QHv1NmymqBUcV/y5UftFDBdTctiPpQpEAQiYBgqC0Hh0/g6RnMpzrrDFQHYJMS/rE7U7W3oiShjQWw0G/CZv34v4O8zq3Vx9D/5sCjFSvTuae/wLzGY5bm8VzPKTV0QcR+fHsh9LFYgCEDANFATDk5LijlfniOTU1tjJGsvB2dEijlvnrkeUMKC3/Oxo7rZkQLaiM4SxMpSKBO7jAtqj962Cct1v8sstrPG3arlVdDx6zVzHI68QBSBgGigIhqfx6jXhrfnsseTHZUTcpxUFoBq8caZMaHxozlZT32OF3oe0ooBiuXm2jP24gPbobfSbzo/PYN+H+Dfnsb+KVoUoAAHTQEEwPANzoSJcfGElaSCmWA7P3RZRwoDe8vPsjqNC43OJmaa+xwq96UaDYjm7I539uID26E03GnqRf419H6yY++oVogAETAMFwfA8uW6vvhpyP/9qSGqVRLHs+MOXYb8mQQGoBvfP2CQ0riqsMPU9Vuhdeb5CxLJ/RhT7cQGt11u85v/9bP9rfv42bLTinGI5uZ7HjkYlogAETAMFwfDc/fFykZQayuvZYyEar0nu1bWFnTCgt9ykjgxbx0/3bXp6oq+r7aGp77JC767WByIWiinSDjSgM4xE75baNmmmtxDrr9WLePZ8soI9FtmJAhAwDRQEQ7Or/aEv6hltABw3zdfbI0dHBOoHHMmKZBSA8vPOzSahbdIHS01/l1V6Gx1omrTYuI8PaK3exsrb9EVx7PETKcduGTdV5Nz77d+wxyMzUQACpoGCYGjSazjxCmz6JvZYDF5IPiliyguzbyYKQPlZfOSc0DZr1W7T32WV3lkrk0RMxUfPsR8f0Fq987YcFNqSzyl3/AbTpm20ZAqE24kCEDANFARD8/yuLJGMzsQcYY/FoNE3M23qhrATBvSWmydW7xHaXj1cYPq7rNL7yqF8EdOJNcnsxwe0Vu99UzYIbSmncMdv8EzMYRHT+aQT7LHITBSAgGmgIBiagdetJ/kMoPvzfsc3Qa+lQ5+XhQJQfiZ9uFScb40Vjaa/yyq9KRaKafdHy9iPD2id3pQ7Aq9bO+R53VqefVmq19KyEgUgYBooCIYmdUEQHRmqI+/IYAeNQuFOGPOyUADKTZpvKhZc/C68wt5uvSkWutmgQoFi5D5OoDV637lxR8rCvrm6RcS1891F7LHITBSAgGmgIBicYkDWEtG28TOkc6anOWJiXlb6+bASBvSWl1WFNyydb2ql3oF5WRdush8n0Bq9aU6nPt90D3vswQxeCY+FIEPrzV0/AIoDBcHgNOba0TwZ7lj605iXlb0uJayEAb3l5YU9+uKe02Eu7nFCb4pJXyxwkv04gdbonb02RWhKuYQ79v7c98V6EVvN5Sr2WGQlCkDANFAQDM5L+/JEEsqNSmOPpT8Nv6zkT1eGlTCgt7w0uiBcO1FkyfdZqXdZVpHeDWdpIvtxAq3Rm7z2ZPI3DWbupjTdfD8tjz0WWYkCEDANFASDM3OFbn9RklHIHkt/9nZ/74t+fopv828n+7q7vg05YUBveUnef8Jvr/KuJd9npd5Nt+7q/oQfmvcnBO1hOHpTzoh6dpLIIZRLuGPvz5L0Qv319Mok9lhkJQpAwDRQEAxOowOIFSsy7eDeSWtFfLXFt0NOGNBbTooB+Rn/gGzBAhCr9aaYKDYqGkK94QCdZTh61169LXJHqpZDuOMeiI3XG9ARJAS9uesHQHGgIBiYPfe/E0/Xop/7Qso7ZGLOxn1h9ShGASgv68vqhJYpE1Zb9p1W653y+WoRI8XKfbxAc3obPXfpVSt33ANRvOHQci/lYMrF3PHISBSAgGmgIBiYgTl2n4U+x85pGl0jskM06EUBKC/D1ZJDbzKCRkcQeRmO3ipoSfObZZ2jKANRAAKmgYJgYF49UiB99wPjqdHeiWtCThjQW04aT3MvHzhj2XdarTfFRjFSrNzHCzSnd8qENdI/zTW64tDNEXcsMhIFIGAaKAgG5sn1qZYPyFazu/ORMOclN3/yzgolYUBvOZlq2F5cqbbsO63Wm2ITtkharNzHC4xcb8oVRgcQmedzBm44NqSyxyIjUQACpoGCYGCGu8CCizvfWxxypxIUgHKSTMbtML61Wm+jU4mMxuhg6HobnTZ2/Wkxe8xDUfaFKtxEAQiYBgqCJxncI5OesnHHMxSpXyYlyeu5V0NKGNBbPrbUtNrS+soOvY3WiC21rezHDYxM7+s5V4WGGYvi2WMeisYbDmpDGMobDq8RBSBgGigIniT5sIk75PeXsMcyHM/tzBSx5sdlhJQwoLd8pOKdNExfEGvp99qh99H5sfoNx6li9uMGRqZ3fmy60PD8riz2mIcjPaWkWO9WNrPHIhtRAAKmgYLgSQa6HixJYI9lON44XSpiPfL19pASBvSWj1S8k4ZUzFv5vXbofS7Rf8MRP/wNB+gsQ9X7yNcxQsMbZ8rYYx6OVnfHcRNRAAKmgYLgSeYp1Pf0Xn27iDXh7QUhJQzoLR8Pf6UPyDfPWjsg26E3FQ36DUcM+3EDI9M74a35QsPW+g72mIej1f2x3UQUgIBpoCB4kvtnRImkU1V4gz2W4UiT8be9OEPES5P0h0sY0Fs+xr8xTx+QG6wdkO3Qm4oGijX+zXnsxw0MX++utodCv20vzVRiIU9VYYWI98DMzeyxyEYUgIBpoCB4nJQUt78ySySdznu97PGEwn1TNoRkIYICUD52tvYK7eics3pAtkNvijHmZf/10arG9eEVhqK3YeWTNnUDe7yhsLOlx399zFaiYHVab+76AVAcKAgep4pPOEI1EUYBKB+rL94S2u2fscny77ZL7/3TN4mYqy/dYj9+YHh6q2jmbdcTctWJAhAwDRQEj5PmYVGyoXlZ3LGEyquH9a4l2etShk0Y0FsuXtybK7Q7FX3A8u+2S+9Tm/eLmC+lnmI/fmB4emevTRHaUacj7nhDZd8c2WvsschEFICAaaAgeJy08IOSzZmYw+yxhMq6kpqQDFNRAMrHzBVJQrvSYxcs/2679C7RYqWYs1YmsR8/MDy9DYP7utJa9nhD5elth/2L8nLYY5GJKAAB00BB8DhpULNrQLaLAcPU3w1tmIoCUD7u+WSFON8aKxot/2679KZYKWaKnfv4gaHrTbmBTJVVMLgPZuCGY9Vu9lhkIgpAwDRQEDzOvRPlb5I+EHe+t0jv0FAzeIcGFIBysbf7e9/m304WpJ+t/n679LY7btAevZtv39M7zrwndwu4/qSnlRT3XrSEe0Jv7voBUBwoCPooLFXG65Yq9zus68nqBKmLBMVdcapkyIQBveWh3U/S7NTbzieXoD16U/cW0XFmYRx7rOGQ+mML65oX0YO6v97c9QOgOFAQ9LGtsVNfAfyGOiuADRYkHhexF8QfGzJhQG95SN0NSLPjy3ba8v126k0xiw4N2ZfZjyMYmt7UvUV0nEm0tuOME4x742sRe9udLvZYZCEKQMA0UBD00TAdPTg7mj2WcGm0hDs6f8eQCQN6y0OjBZxdPVnt1JtiRks4uTic3kfnbddbwGm5gjvWcHlwVrQy5vxO6s1dPwCKAwVBH4vS8nRLjs372WMJly21bSL2xHcWDpkwoLc8pFdxw722N0M79Q68TlwUx34cwdD0TnxngdDsXl0be6zhMjdKtx4qSjvNHossRAEImAYKgj6Sj55qHlkGA/MXn5446PxFFIByMenDpeJ8a6q8a8v326l30627IvbdHy1jP47g8HqLeXRablB1Hp3hdXpy3V72WGQhCkDANFAQ9JHaI4XSUk1Wpn6xXsRfW3x70IQBveVgb88PvujnvtBX0vbYs5LWTr1p9W/Us5PEPtC+cB9PcGi9KScIr1AtR3DHGQlrLlf5W9htZI9FFqIABEwDBUEft/9+tlI9gPsze02yiL8kvXDQhAG95WBztW7Jsev9JbZtw269d/1psdgHshfhPp7g0HoXp5/XuwWtHbpbkKw0egLv+MOX7LHIQhSAgGmgINDZ0exPMK/OYY8lUhptxcg5f7CEAb3lYCiLdszSbr0DiwrOlLEfT3BovU9vPSS0ohzBHWekpOJP3KBrxSB3LDIQBSBgGigIdN4uqtRfMUxT9xXDrfxysQ9Hvh64jzEKQHlYuDtbaHV2x1HbtmG33me2H9VbdO05yX48waH1Nvrp3iooZ48zUtLrXzFF53IVeywyEAUgYBooCHReOZSvTzJen8oeS6RsqW0d0ukfBaA8DPQAPn7Rtm3YrXcpegJLxaH0DnQKqlVvBbBBWgAiFukdVm+Rnl16c9cPgOJAQaAzNypNtxnYr67NAPX6jH5+ipicP1CLLhSA8tCJloN2602xo0WXPBxM78CCHS03DNUrXHaSBQydb2QJwx2LDEQBCJgGCgKdB2ZtFsml+uJN9ljMcPdHywe1FkEBKAeFZc+L9rcctFtvil206HppppLWIm7jYHoHLHs+Xs4eoxlWXbipG/XPUs+o3y69uesHQHGgINAZ98evRHJpb1K71RAZ89J+kFHvQAkDevOT2lk50XLQCb2NFl2qXzdu4GB6X8+9KjTKWBTPHqMZGtcNnXPcschAFIAewejRoxeNGTPmLY3rtJ9/Ntjnxo4d+0/aH3/31FNP/eOoUaNGh/LdKAj+4utqfygSS4wLnmQM1V4MBaAcNJ5k0FNnO7fjhN4HZrrjybkbOJjebmnbJ56cazlaPDlvt+/JuSpEAegBaAXfr7TCLpl+1v78qVYEZg32We3fKrXPPNKYPWLEiJ+E8v0oCP7iqyup0U1SXTCX6dqJIrEvmct3DZgwoDc/aZ6pPpcpzdbtOKF37iZ97uzlA2fYj6vXOZjex5ftFBpdy77MHqNZ0nxT2pe60lr2WLiJAtAD0Iq5pVoRONn4u1bkdQ7x2U/D/X4UBH/xlWQUiqRyYvUe9ljMsqG8QexLyoTVAyYM6M3PnI37hEa08tzO7Tih95WDZ8W+0D5xH1evczC9Uz5fLTRqvN7AHqNZZq3ao5vdH7vAHgs3UQB6AFrBF6fxg6C/d9Ar3oE+qxWAUaNGjXpF+3PJz3/+8/8RyvdTwnj0SD+ZvMrT2wyT1Bz2WMyyp+uR3vNz/AwtSfz5sX8jnaE3P/fP2KT7mRVV2rodJ/S+XXRLf509I4r9uHqdA+lNOWDr+OkiJ1Bu4I7RLC+m5Ijz7UzMYfZYuEk6W1VnAJJCK+YSR48e/V7Q37tHjBjxD4N8/Ef0n5/85Cf/TSsUy0L5fh/gO74oVvfIulbDHYol2PnOArE///LoB+5QgAGQ4F848a/f/Zk7FNP439o+0L4kvPk1dyjAAPiXb77XvUG1nOAGtJTpPY0zF8dxhyIFLCgxAJnhfwU8Mejv9wf63KhRo97Q/m2b/6//VSsA/zWU76eTyOtPhBL9BVNrfRt7LFbw4OzowMT8/neM0JuX940FRy/Psn1bTuhNT5hiXvZPzO94yH58vcyB9KYcIKxTtJzAHZ8VvFfXJvYn8d2F7LFwE08APQCtqPslPQWkn0eOHKnVdWNy6WetKBwV/DmtAHxB+/f/ST//4he/+O/a586F8v2UMOhk4p7PwMXurm99Uc9M9G0dN035FcAGDVPr/hPzSWev683NwIKjyets35ZTeqdiYr4UHEhvygFuMk8mI+st46aKnN1z/zv2eLj1tsWgBXwAACAASURBVLreACSEVuxt1IrA9/1z/Mje5Udagdes/f8f9/vcZHpaqP3bWqwCDo00MZoSZPJnK9ljsYrGxHxaodk/YXhdb246ueDIKb0xMV8ODqS3UwuOnGTypyv1RS0VjeyxcOttS8EBeAdeLwgM2xSySuCOxSpWX/RPzJ/5uM8cCkB+nt52WF9wlJJj+7ac0vtCct/EfO7j62UOpPf+GVH6dJBLt9jjs4pusrUxqzd3/QAoDq8XBPmx6YMaJ6tK6sowkGM+CkB+Hv4qRmhz8+w127fllN43z5aJfTrydQz78fUyB9K7r8PRffb4rGLA2DpObWNrK/Tmrh8AxeH1giB9gb4CuCKvhD0WqzhYr1kUgPzc+e4ifcV5bavt23JK75aaVn2l6XuL2I+vl9lfb+qW4cZezRWnSsR+pS+MY4+FW2/u+gFQHF4vCHa9v0Qkk7tVzeyxWMm9E9eI/aq/Vv9YwvC63pykSetRz0zybXlhqpjMbvf2nNKb9iX6+Sm+qGcn+Xq7v2c/zl5lf73ry+pEDtjrgg5Hwbxb2Sz2K+mDpeyxcOvNXT8AisPLBUFvz/e+zb+d7It+7gvxM3c8VjJzRZJIkmVZlx5LGF7Wm5t3bjYJTfZ8ssKR7Tmp9+6Pl4t9a9L2kfs4e5X99S7LvCg0yVqZxB6blTTyNtFteTtcvbnrB0BxeLkgaKq8q99Jfui+O8nC3dn6PJnY9McShpf15mZ5zhWhScbieEe256TeGYvixb5dz7nKfpy9yv56n92hz2+mXMAdm9Wkp3/izU2lu97chKs3d/0AKA4vFwTXTxXrc0kWxbHHYjVpTmP/eTIoAHlZkHhcaFKQcNyR7Tmpd0H8MbFv5xIz2Y+zV9lfb2N+843TpeyxWU3Ka2Lu9in3zN2ORG/u+gFQHF4uCM7tzNSfksW7bzWZMU9m90fLHksYXtabm8eWJAhNyk9ecWR7Tupdnn1Z7NuxpYnsx9mr7K83vdlw4/xmIq0Adpt7QyR6c9cPgOLwckFAg5UYkF3oJ0WT8cX8xuen+Hp7fggkDC/rzU2a+0fn250bdxzZnpN6kymvMFT/1D2G6qoxWG+65mlus1vnyV3z33C4yb81Er256wdAcXi5IDAGZLc6yu/602Kxf8237wUShpf15qRoYfWCsy2snNRbX+E8UbTpcmKFMzi03s3V98S1Ty4H3HHZQdxwoAAELIBXC4K+AXmSa3tKHvl6u990uCyQMLyqNzdbav1N7N9Z6Ng2ndY78Z0FYh/v1bWxH28vMljvG2d0c+6j87azx2UHccOBAhCwAF4tCMiIV5jXvute81pqzUX7SK26jIThVb25eaugXGhxeO42x7bptN60b7SPt85dZz/eXmSw3heST/rb8x1hj8su0s2UbqruzRsOFICAaXi1IKBWXG5vX1WSUSj28cTqPYGE4VW9uXlxb67Q4vTWQ45t02m987R9E32OtX3lPt5eZLDeWav2CC1Kjl1gj8suGm0Vb+WXs8fCpTd3/QAoDq8WBH13yO5tYF9XUiP2MfWL9YGE4VW9uXliTbI+IKcXOrZNp/UuTj8v9jFb21fu4+1FBuudOnmd0KKutJY9Lrt4etvjbzi8RhSAgGl4tSDIWrVbJI9SF98hd7U9FPu4/ZXZgYThVb25SUU4aVFbfNuxbTqtd+3V22If9/lvOEBnGaz39ldmCS262h+yx2UX6emm6HSyag97LFx6c9cPgOLwakEQ6JVbVscei52MfW2u2M+O5h4UgIwMDMitDxzbptN6074F33CAztLQu7OlW+gQ+/pc9pjsJD3ddGOv43D05q4fAMXhxYLgwYM/+7a9OEMkj/sd37DHYyfTpm0U+1lzpRoFIBM7mv0D8mvODsgcese+Oidww8F93L1GQ++aK1VCg/3TN7HHZCfvt38j9nPbSzNFTueOh0Nv7voBUBxeLAjaGjtF4oh/Yx57LHbz5Lq9Yl+vHilAAcjE20WVLAMyh96BG47LVezH3Ws09KZrnTQ4uT6VPSa7GffG12Jf2+50scfCoTd3/QAoDi8WBFWFN0TSODg7mj0Wu3lpX57Y17zogygAmXjlUD7LgMyhd+CG43AB+3H3Gg2986IPCA2K0vLYY7KbB2dFi32tunCTPRYOvbnrB0BxeLEgoMRISePU5v3ssdjNynPXxb4emrMVBSATc6P2+wfk045ul0NvL11bstHQ+9CcLUKDyvMV7DHZTa5rSwaiAARMw4sFQfBrUe5Y7Oa9+nZ/B4oFKACZSE+axVOKwhuObpdD76rCCv3p+pdb2I+712jonfi23pGltb6DPSa7SU+avfK6eyC9uesHQHF4sSBIm7ohsDCCOxa7SZOjqV0StU3q7f4OBSAD49+cp89Taux0dLscBWCrf35twlvz2Y+710g6//Xf/0Nc61vHTfPEwgiaa0rnW9rUjeyxcOjNXT8AisOLBcGOP3wpkkbnvV72WJwgNUyn/W26eQcFoMPs7nzk2/S0NiCPn+74gMxRANI+bv3dNLHPtO/cx99LFDq36AV48mcr2eNxgp0tPWJ/Kadzx8KhN3f9ACgOrxUEAa+y33vHq+zYkgSxz9dzrqAAdJj11+rFsU+ZsNrxbXO98k/5fLXY54byevbj7yWSzg0X9Vfwx5YmssfjFMl3UnhstrnX9HowvbnrB0BxeK0gMMxDUz1kHlqQeFzs87mdmSgAHWZZ5kVx7DNX7HJ821wFYObyXWKfy7IusR9/L5F0Lt6n95w+l5jJHo9TJCNoL5j6D6Q3d/0AKA6vFQRlWUVsAzIXy09eEft8fGkiCkCHeXZHujj2hbuzHd82VwF4PumE2Of82HT24+8lks65a/QWl+U5V9jjcYrGDce1E0XssTitN3f9ACgOrxUEBQnHPXeH3FjRqM8L+nQlCkCHeXR+rDj2N06XOr5trgKwIq9E7HP6glj24+8lks6pE/TX73du3GGPxykabzjoT+5YnNabu34AFIfXCoLjy3bqd4vZl9ljcYrdXd+KlYG0Gvhvf/ubp/Tm5q73l4jz7W5Vs+Pb5ioA71Y2i31O+mAp+/H3FB/84NvqX/Hfc/87/ngcIj35E284tNzOHYuTRAEImIbXCsC9E9fo80WueWuCeoLfG+zPD771lN6c7O35wbf5t5MFe3u+d3z7XAUg7Wvffv/AroNX2Brk+ckdi5OkuX+033s9NK+biAIQMA2vFYDbX5mlrxhr99aKsUNf6t0BWq/XekpvTrbUtIpjvvO9xSzb5zT+3vneIrHvLbWt7Dp4hZXn+7r+cMfiJGn1r3B2eMU7zg5EFICAaXipAOxs7fWsZ9Qpf3/QG5mFntGbm0YbvsNzt7Fsn7MApCLEK+3IZGGR0fd7y0H2WJwm2XqJG/vWB+yxOEUUgIBpeKkArCup0S1gJq9jj8VpGi2TCrYd9Ize3Czaf5q1Ly5nAWj0aL184Ay7Dl7hyfV6i8tiD7S47M9UvxUM2Xxxx+IUUQACpuGlApB8yXQLmCT2WJym0TLpyJfRntGbm7lRaaxFEGcBaBS/VAhy6+AV7p+2URzz2qvub3HZn2TrpXtPescKBgUgYBpeKgAL4o8FDJG5Y3GaHc16y6T4P37lGb25yf0alLMA5H797UXGvjZXb3HZ0sMei9MkWy/xhiPBO1YwKAAB0/BSAUjtkYRJqocsYIIZ8/JMsf/dHd+wx+IF9i2EaGPZPmcBSIs/OBfAeI20qE3Mb/79bM/k82CSrZfXrGBQAAKm4aUCMGXCGk/3KE3xm8Q2Xm9gj8XtlMEKhbMAfNwCB1YwdpNyGl3b+6es90w+D6bRc5tsvrhjcYooAAHT8FIBGPOyNy1gDB73PwG97qE2UVw0LGB2/YnvCRhnAUikp3+wgnGG5f4nYLlr93gmnwfTeAJKNl/csThFFICAaXilAOy857eAeXUOeyxcLEjQ50Ce35XFHovbeUuCOXDcBSDtu5gDqR0Lbj3cTprXLFYA78vxRD4fiGTvJeZAtvayx+IEUQACpuGVAjBgAfPFevZYuFiWeVEcg6yV3lsF7TSL0ngtYIjcBaBhBUMrgrn1cDvJ2UDYoJwr80Q+H4hk7+UlKxgUgIBpeKUARPHzF199qV4E7/NwEewUuS1giNwFIO07rGCcoVH8dDfc80Q+H4hGEUx2X9yxOEEUgIBpeKUAzI/P8Pzrz65WvAZ3ikbrvapCvk4Y3AUg2d94sTUZB43Xn//2l3/1RD4fiMZrcLL74o7FCaIABEzDKwVgwALmpHcXQJDOO4yWSR5dCOMUd77LawFj6M15ffdZwSxi18PN7OuFO4tVb26We8wKBgUgYBpeSRiGBUpDuXctUEhnsonwshWOEzQsYKKf+8L3oJfPAoW7AIQVjDMMtkDxSj4fiIYVDtl9ccfiBFEAAqbhlYQR85Jugny/3bsmyKQz2UR42QzbCTbfvqdbwLy/hF1v7uubbHDEk9AaWMHYRcMEOXP5Tna9OWlYwZDdF3csThAFIGAaXkgY1BqJEkOsx+e+kc5XU3M82w7PKd4qKGe3gDH05r6+DSuYW7CCsY1GG7RzCcfZ9eYmzW8WVjD33G8FgwIQMA0vJIy6Yqx+NRIG2USIpwUrvLsa2m4GLGCiD7DrzX19kw0OrGDsZeaKXeIYXztRxK43N8nmS1jBlNSwx2I3UQACpuGFhFF6HBYwRsIgmwjhhzh5HXs8bmXuJt0C5srBs+x6c1/ffVYwaey6uJWpk9bq83rL6tj15mbACibzInssdhMFIGAaXkgY+XGwgDESBtlECCuYP3zJHo9beVACCxhDb+7rO2AFox0Tbl3cyu3+lf332x6w681NyvF0LMj2izsWu4kCEDANLySMY0sS9IUPHu+BaxQEZBcBKxj7aFjA3Kvjs4AJ1pvz+iYbHFjB2Mc+C5jZUujNTbL5ouNBtl/csdhNFICAaXghYaR8rlvANF73rgWMkTAIZBdBx4PsI7hjchvJAibq2UnsFjDBenNe33QM6FjoVjDfs+vjNtaX1ekWMJPWSqE3N8nmS7eCWc0ei91EAQiYhhcSxjbDAqbDuxYwRsIgkFGqmDQOKxjL2VwthwVMsN7c17dhBUP2ONzHxG2khR+G+bEsenOSbL6EFYyW87ljsZsoAAHTcHvCCFjAvDaXPRZuGgME2UXACsYeBixgvophj0WWggBWMPbRsIApSDwujd7cjDWsYLTczx2LnUQBCJiG2xNGbfFt3QJmygb2WLhpDBDGUwOyj+COyW0sSssTxzYv+iB7LLIUBGSHI6xg0mAFYzUzl/dZwMiiNzf3GVYwxe62gkEBCJiG2xNG6bELugXMqt3ssXDTGCDqy2p1K5hJa9ljchtzNu6TwgImWG/u6ztgBbMJVjBWc6/fAobmAsqiNzfJ7ouOCdl/ccdiJ1EAAqbh9oSRH5uuW8AknWCPhZvGAEF2EbCCsYd9FjA32GORpSAgOxxYwdhDwwKGVgPLojc3A1Ywce62gkEBCJiG2xOGYQFzPecqeyzcDB4gyDbCGDi443ITE99ZqFvA1LezxyJLQUB2OMIK5l1YwVjJgAWMVgTKpDc3ye5LWMFouZ87FjuJAhAwDbcnjOTPVsECJihhGHoHrGDK6tjjcgsDFjDPT2G3gOmvN2cchhUMHRtYwVjHYAsYmfTmZsAK5nN3W8GgAARMw80J48GDP/u2vThDJIPuzkfs8XAzeICAFYz1lMkCpr/e3LHQMYEVjLUMLOZavks6vTlJdl90XLa53AoGBSBgGm5OGB3NfguY12EBYyQMQ2+yjRBWMImwgrGKt/J1C5gjX/NbwPTXmzsWssURVjAF5eyxuIX9r2GZ9OYm2X653QoGBSBgGm5OGLVXdQuYtKmwgDEShqF3WdbjTw9A87y0Tx4LmP56c8fSZwWTxx6LWxh4in+iSDq9uUm2X3RsyAaMOxa7iAIQMA03J4ySgAXMHvZYZGDwAGHMH4IVjHUMWMAcymePpb/e3LGQLQ6sYKxlsAWMbHpzk2y/hBWMNgZwx2IXUQACpuHmhGFYwBTuzmaPRQYGDxBdrQ8eW0EImufB2dG6BcyFm+yx9NebOxayxaFjcxBWMJax/0p+mfTmJtl+ud0KBgUgYBpuThgZi+N1C5hcWMAYCSNYb1jBWMvEdxZIYwEzkN6cNKxgyCaHOxY3cKAbOJn05ibZfrndCgYFIGAabk4YyZ+t1C1gKhrZY5GB/QeI/q+QwMjZ2y2XBcxAenNSWMFoxwZWMNZwoCkcMunNTbL9ouNDNmDcsdhFFICAabg1YQgLmPGwgOmfMIL1Du4jyh2b6myubhHHMumDpeyxDKY3NwNWMNWwgjHLwCKuoH7esunNScr5wgrmxRliLOCOxw6iAARMw60Jo6O5WySAuNe/Yo9FFvYfIAwbCfqTOzbVefPsNaksYAbSm5sBK5h8WMGYZUHCkzZOsunNTbL/omNEdmDcsdhBFICAabg1YdRcqYYFzAAJI1jv/kayYOQMWMBskcMCZiC9uUn2OLCCsYYDGbnLpjc3A1YwV2+zx2IHUQACpuHWhFGSUSgu/hOrYQETnDCC9e7fSgqMnLJZwAykNzfp2NAxomPFHYvqDLRyvFYvrd7cJPsvOkYlLrWCQQEImIZbE8bZHbCAGShhBOsdaCb/CqxgzPLgLLksYAbSm5sBK5jZ0eyxqM7tr8zSV/C3963gl01vblLuF1YwsenssdhBFICAabg1YWQs8lvAnCpmj0UWDjRAkI2EGEhaH7DHpzINC5jW+g72WIbSm5NkjwMrGPPsbO0Vx3HHH76UWm9ukv0XHSeyA+OOxQ6iAARMw60JI/lTWMAMlDD6650KKxjTFBYwz8hlATOY3pyEFYw1rCut1S1gJq+TWm9uUu7XrWBWssdiB1EAAqbhxoQBC5jBE0Z/vclGgo4T2Upwx6cq71Y1S2cBM5je3Oyzgmlhj0VVlmVd8lvAJEmvNycDVjDj3WkFgwIQMA03Joz2u34LmD/CAqZ/wuivN9lICCuYBFjBRMo+C5jt7LEMpzc3ySYHVjDmWBB/TLeA2Zn52P+XUW9ukg2YbgXTzR6L1UQBCJiGGxNGnwXMRvZYZOJAAwTZSNCxIlsJ7vhU5aXUU7oFzNZD7LEMpzc3ySaHjhXZ5nDHoioNC5jyIAsYWfXmJtmA0bGiMYE7FquJAhAwDTcmjIAFzJpk9lhk4kADBNlICCuYiWvY41OVORtSpbOAGUxvbsIKxjxTJugWMA3l9Y/9fxn15ibZgLnVCgYFIGAabkwYZ3ccFRf9hT0n2WORiQMNEGQjoVvBzGKPT1UaFjDVF+WxgBlMb26STQ6sYMwx5uUnLWBk1ZubhhUM2YJxx2I1UQACpuHGhJG+KA4WMIMkjIH0JjsJOl5kL8Edo4pMeNtvAdMgjwXMUHpzkmxydCuYBeyxqMjOe34LmFfnKKE3NwNWMIvcZwWDAhAwDTcmjD2frBAX/Z0bd9hjkYmDDRBkJ0HHi+wluGNUjbJawAylNycDVjDaMaNjxx2PaqwrqdEtYL5Yr4Te3AxYwXzqPisYFICAabgtYdBy/63jp/s2PT3R1931LXs8MnGwAaLPCuYSe4yqMWAB86FcFjBD6c1NssuBFUxkLMu8OKAFjMx6c9LNVjAoAAHTcFvCaG+6r1vAvPE1eyyycbABguwkYAUTGW+eLRPH7ug8uSxghtKbm2SXQ8eM7HO4Y1GNhgXM+V1ZyujNTbIDo2NG9mDcsVhJFIAewejRoxeNGTPmLY3rtJ9/ZvZzwXBbwqi5XKVbwEyDBcxACWMgvcthBRMxL+7NldICZii9uRmwgkk9xR6Lajy2NFG3gDl5RRm9uUl2YG60gkEB6AFohdyvxo4dm0w/a3/+VCvussx8rj/cljBK0nULmGxYwAyYMAbS27CCIXsJ7hhVo2EBc/VwAXssoerNTVjBRM6UCasHtICRWW9ukh2YsILJKGSPxUqiAPQAtGJuqVbcTTb+rhV2nWY+1x9uSxhntvstYJJhATNQwhhIb1jBRM4Dszb7LWBusccSqt7cJLscYQUzC1Yw4dKwgLnf/o0yenOT7MB0K5ij7LFYSRSAHoBWyMVp/CDo7x1PPfXUP0b6uf6ghPHokX4yuYHpC3ULmBt5JeyxyEbSeTC9yVZCeIu19rLHqRIT3povjltbYwd7LOHozcm2Br8VzNsL2GNRiXRt0nGL1a5VlfTmZsWpYr8VTBx7LFaSdLau0gCkxNixYxNHjx79XtDfu0eMGPEPkX6uP3wuQ6r/Fck397q4Q1EKB6fr82S66+9xh6IM/vM//uqLemaib+u4qb6//e1v3OEog7/9n//j2/LCVF/Us5N8//nXv3KHowzu17XoT05nbOIORSk8bOkSx23fxNXcoVgO6yoNQEr4X+1ODPr7fTOf6w86idxyx/jw4Z99W383TVjA9Nz/lj0e2TjUE4KslUkiSV7LusQepyps9lvA7P5oGXss4erNTbLN0a1gmtljUYWGBQxdq6rpzUkaC2hMIHswGiO447GKeALoAWiF3C/p6R79PHLkyDEaculnrdgbFcrnhgMlDDqZuOczWMH2pi5YwAwzZ2QwvclWQljBxB9jj1MV3jgjrwXMcHpzs88Kpow9FlWYH58xqAWM7HpzM2AF03SfPRarSDpbXW8AEkIr9jZqxd37GqNGjRo1WvtfP9IKvGbt//94mM8NCzcljNtFleIi3z99E3ssMnKoAcKwgiGbCe44VaFhAXNaQguY4fTmJtnmwAomPB5bkjCoBYzsenOTbMGEFczlKvZYrCIKQMA03JQwitPP6xYwa1PYY5GRQw0QZCsBK5jweHK93wLmiHwWMMPpzU2yzRFWMBtS2WNRhX0WMA3K6c3NbMMKJt09VjAoAAHTcFPCOBNzxG8Bk8Mei4wcaoAgWwk6dmQzwR2nKjwwU14LmOH05qZhBUM2OtyxqMKYl2bqFjAdT1rAyK43N8kWjI4d2YRxx2IVUQACpuGmhJG+IFZc5BV5JeyxyMjhBgjDCqbzXi97rCrQsIBpbexkjyUSvTnZ6reCSXh7AXssKrCzpSdgAaOi3tysOFUijh/ZhHHHYhVRAAKm4aaEseeTFeIib7rZxB6LjBxugEj9Yr04fnUlNeyxys6e+98JCxiyM5G1ybzMBQEds+jnp2jHcJKvt/t79nhkZ11xjW5lol2jKurNzTvamEDHj8YI7lisIgpAwDTckjBoQNk6zrCA+Y49Hhk53ABhWMGQ3QR3rLKzqfJuwAKGO5ZI9eamYQVzt7KZPRbZWXrcbwGzareyenOyu8tvBfO7adLesIVLFICAabglYbTd0S1g4t+Yxx6LrBxugDCsYMhugjtW2RmwgJm/gz2WSPXmJtnnwAomNObHDW0Bo4Le3CR7MN0Kpos9FiuIAhAwDbckjIAFzAxYwAyVMIbSm+wlYAUTGgMWMNsOs8cSqd7cPO23gqFjyR2L7AxYwOQMbAGjgt7cJHswN1nBoAAETMMtCaP46DndAmYdLGCGShhD6U32EroVzGr2WGXnyXV7pbaACUVvbhpWMGSnwx2L7Ez5XLeAabw+sAWMCnpzk+zB6BiSXRh3LFYQBSBgGm5JGGdiDsMCJoSEMZTeASuYl2ayxyo7AxYwl+S0gAlFb26SfQ6sYELjtmEsYFTQm5sBK5iYI+yxWEEUgIBpuCVhHJ2vW8DcOF3KHousDGWAiDWsYFp62OOVmYYFTJukFjCh6s1Jss8RVjDaseSORWYGLGBem6u03twkezBhBbMglj0WK4gCEDANtySM3R8v1y1gbt1lj0VWhjJA7DOsYIphBTMYAxYw4+S1gAlVb07SsSMbHTqWWLk/OGuLb+sWMFM2KK03N5tcZgWDAhAwDTckDDGQjMNAEkrCGE5vwwqGbCe445WVfRYwy9ljMas3N8lGB1YwQ7P02IVhLWBU0ZuTNDYIK5hx7rCCQQEImIYbEkab/1VS/JuwgBkuYQynd8AKJg5WMIORphnoFjByv0pSoSAgGx0xdeMMrGAGY35sum4Bk3RCeb25STZhYurGHfWtYFAAAqbhhoTRZwETxR6LzAxlgCCbCWEFsySBPV5ZeTElR3oLmFD15iasYIanYQFzPeeq8npzk2zC6FjSmMEdi1miAARMww0Jo/iIbgFD1hzcscjMUAYIspkQVjCfwwpmMBoWMHTeccdiVm9uko0OrGCGZvJnq3QLmIpG5fXmJtmEiWv3qNzXbihEAQiYhhsSBj2JEU8RUmABM1zCGE5vspmgY7kNVjCDkp40q/AUQYWCgGx0hBXMTFjBDESaq7btxRniGHV3PlJeb26STZhuBSP30/tQiAIQMA03JAxYwISeMELRm+wmYAUzOGmuqewWMOHozUlYwQzNjma/BczrQ1vAqKI3N435u26wgkEBCJiGGxIGrcYUFjCVsIAZLmGEojfZTdDxJPsJ7phlo2EBo8JKQhUKAqzgH5q1V3ULmLSpQ1vAqKI3N8kmTKzg/1juFfyhEAUgYBqqJwwMIOEljFD0JrsJYQVz7AJ7zLJRpQFElYIAN3CDsyRgAbPHNXpzUhUPz1CIAhAwDdUTRhteIYWVMELRm+wmYAUzMFWxgAlHb24GrGAwheMJGhYwhbuzXaM3NwNTOBS3gkEBCJiG6gkDk8jDSxih6E12E7CCGZiGBYwKk8hVKQgCi7hgBfMEMxbH6xYwuUNbwKikNzdVWcQVit7c9QOgOFRPGLCRCC9hhKK3YQVD9hPcMctGlWwkVCkIYOM0OJM/WxmSBYxKenNTFRunUPTmrh8AxaF6woCRbHgJIxS9yW4CVjADUyUjWVUKAuMpPozcH6ewgBkfmgWMSnpzUxUj91D05q4fAMWhesJAK6nwEkaoepPtBB1XsqHgjlsmqjR/SJWCAPN4B2ZHc7c4LnGvf+Uqvbmp0jze4fTmrh8AxaF6wkAz+fASdxfa6wAAIABJREFURqh6B6xgrt5mj1sWqmQBE67enMRK/oFZc6U6ZAsYlfTmJq02Fyv5P5J/Jf9wenPXD4DiUDlhiIHjBQwc4SSMUPUm2wlYwTzOpptNyljAhKs3NwNWMLdgBWPQsIA5sXp4CxjV9OakW6xgUAACpqFywkAXgfATRqh6k+2EsIKJTWePWxaq1kVApYIA3Xye5NkdoVvAqKY3N2nMUKGbz3B6c9cPgOJQOWFUX/RbwMyCBUyoCSNUvQ0rGLKh4I5bFvb1ET3CHovVenOTbHXQz/txZiwK3QJGNb25SbZhdGxpARJ3LJESBSBgGionjKuHYQETbsIIVW+ynYAVzOPMXquOBUy4enPTsIIhmx3uWGRhOBYwqunNTcMKhmzEuGOJlCgAAdNQOWHAAib8hBGq3gErmBdnKD1PxkqqZAETrt7cpGMKK5g+hmsBo5re3KQxQ3UrGBSAgGmonDCOztsuLuKbZ2EBE2rCCEfvPiuYbvbYZWD8G7oFTHuT/BYwkejNSbLVoWNLNjvcscjA9rvhWcCopjc3yTZMt4LZwR5LpEQBCJiGygkj6cOlsIAJM2GEozfZT8AKRmd317e+TU+rYwETid6cpGNKxxYr+nX2WcBsdKXe3OyzglnGHkukRAEImIaqCeNB7w++6OenaAPGJF9v9/fs8ajAcAcIsp+gJFkCK5iABcyeT1awx2KX3twkex1YwegsySjULWDWJLtWb04GrGBeUNcKBgUgYBqqJozWhg7dAubtBeyxqMJwBwjDCobsKLhj52ZFXoluAbMwjj0Wu/TmJtnrwApG59kdR8OygFFRb24aVjCtilrBoAAETEPVhFF98aa4eA/OimaPRRWGO0CQ/QSsYHReSD6plAVMJHpz07CCIbsd7li4GbCAOVXsWr25SfZhwgrmoppWMCgAAdNQNWFcOZQvLt6cDbCACSdhhKN3nxXMSvbYuRmwgEk/zx6LXXpzk+x1YAWjM/lT3QLmzo07rtWbm2QfJqxgDqtpBYMCEDANVRNGnt8C5lLqKfZYVGG4A0TACmY8rGD2T9ctYGouV7HHYpfe3OyzgtnEHgsnxYKY8dPDsoBRUW9uBqxgtLGEO5ZIiAIQMA1VE8aRrw0LmGvssajCSAYIsqGAFYx2HN74WikLmEj15mTACuYNb1vBBCxg/hi6BYyKenOT7MOEFcy87eyxREIUgIBpqJowkj7wW8BUwQImnIQRrt5kQyGefF2pZo+fiwELmN+pYwETqd6cNKxg6Fh72QomYAEzLXQLGBX15ibZh9FxJjsx7lgiIQpAwDRUTBiwgIk8YYSrd8AKJqOQPX4u3lHQAiZSvblJx1hYwWjHnDsWLpakh28Bo6renKSxg8YQGktUurEL1pu7fgAUh4oJo7Vet4BJfAcWMOEmjHD17rOCOcoePxcrTvktYBbFscdit97cJJsdOtZku8MdCxfPbNctYC7sOel6vblJNmLCCqahgz2WcIkCEDANFRNG1QVYwESaMMLVm2wohBXMIu9awQQsYLarVQSrWBCQzY7XrWDoRkMUwafCK4JV1JubfVYwN9ljCZcoAAHTUDFhBCxgNu5jj0UlRjJABKxgPvWuFUz2mmT9NXi6Wq/BVSwIyGZHWMGs9a4VjPEaPBwLGFX15ibZiNGxpjGFO5ZwiQIQMA0VE8ap6AO6Bcy+PPZYVGIkA4RhBUO2FCrOk7GCNBlfxYUwKhYEZLMjrGCme9MKRiyE+Z2+EIYWH7ldb27SGELnW170QfZYwiUKQMA0VEwYh+ZsFRdt5fkK9lhUYqQDBNlRCAuUu960gumzgLnPHosTenOSbHa8bAVD55iwgNHOOS/ozc3Kc9fF8T48dxt7LJHozV0/AIpDxYRBiz/oor1X384ei0qMdIBQ9QmYFQxYwCj4BFTFgsDMEzA30MwTUBX15ua9ujb/gsKF7LFEojd3/QAoDtUSBvmDRT0z0bdl3FRhB8Mdj0qMdIA4oegcOCtI87BUnQOpakEQmAPnQSuYwBzIMC1gVNabkzSGbHlhqrCDUc17EgUgYBqqJQxjQFbNk00GRjpAkB2FV61gVLWAMaM3N71sBROwgEkOzwJGZb25qeoNBwpAwDRUSxjlOVfExXpsSQJ7LKox0gFC5SLILFUuflUtCCL1wXMDzRS/qurNzYzF8eKYX8+5yh5LuHpz1w+A4lAtYZzbmSku1oKE4+yxqMZIBwgvP3XNWrVb7HvpsQvssTilNzdLtGNNxzxr1R72WJymmadRqurNzYL4Y+KYn9+VxR5LuHpz1w+A4lAtYRxftlNcrNeyL7PHohojHSBUXghhlnsnrRXnW11pLXssTunNzbqSGnHMU7Vjzx2LkzS7AEZVvbl57USRON9obOGOJVy9uesHQHGoljCSP1slLtbG6w3ssahGMwOEqlYoZkgD8raXZor9vt/+DXs8TurNya72h+KYx7w8iz0WJ2nWAkdVvbnZUN4gjnvK56vZYwlXb+76AVAcKiWMx+6QOx+xx6MazQwQASuYy1Xs++EUyfdQeLK9/hV7LE7rzc3Y1+eKY9/R7B3vydtFlaZMsFXWm5PC7F7BNxwoAAHTUClhtDZ2igSZ8NZ89lhUpJkBQtV2aGZYfemWPiDPiGKPxWm9ubl/xiZx7Kko4o7FKZptg6ey3tyMf3OeOPZt2hjDHUs4enPXD4DiUClhVBXeEBfpwdnR7LGoSDMDxIXkHHHsz8QcZt8Pp6h6z2mVCwKVe7RGytPbDvstYHI8pzc3D86KFse+6sJN9ljC0Zu7fgAUh0oJ4/KBM+IizY1KY49FRZoZIG6eLRPH/sjXMez74RTpPKN9pvOOOxan9eZm0f7T/mt9P3ssTvHwVzFin2+eveY5vbmZu0m9ax0FIGAaKiUMehIjngocPMsei4o0M0C01LSKY7/zvUXs++EUVXwqYJXe3PTi0/6d7y4S+9xS2+o5vbkZeLiwSZ2HCygAAdNQKWEcmLlZXKTVF2+xx6IizQwQ1DIp+vkpSrZMipS0GlPMC7rTxR6L03pzs80/35fmZnHH4gT1FpeTRFuySFtcqqw3N6sv3hTn24FZm9ljCUdv7voBUBwqJYw+KxI1B2Rumh0gdn+8XMmWSZFQrAzU9nXb+BlKrQy0Um9OihX/46d7ZsW/FWbrKuvNTbrJM2PBw0EUgIBpqJIw7nd8o/yAzE2zAwS13yMNqB0f977YzYbyet0bbIJa3mBW6s1N8mUjDcinjTsWu1l+0nyLS9X15mTghkPTQJUbDhSAgGmokjDcMCBz0+wAUZB43DNt+MqyLol9zVyxiz0WLr25mbl8l9CgLKuIPRa7abQjO5eY6Vm9uanaDQcKQMA0VEkYNAiIAXm5ugMyN80OEPTkjzSg5unc+2I382PT9f6gSSfYY+HSm5vUm5U0yI/LYI/FbmYsihf7ej3nqmf15magzegJNW44UAACpqFKwqBBQMWG3TLR7ABBc/9IA5oLyL0vdjN9QazY14q8EvZYuPTmZsWpEqFB+sI49ljs5u6P9Pm1TSbm16quNzcDNxzxatxwoAAETEOVhJG+KE6/Qz5VzB6LqjQ7QBgrFWk1cKQrFVVh0odLxfl2t7KZPRYuvbnZVHlXv+H4aBl7LHayt8e/wv7ZSb7e7u89qzc3r+de1d9wLFLjDQcKQMA0VEkYVtwhe51WDBDkAyi8ymoi8ypTgWJAfu4L3+bfTtZ+jnxA5qbqBQEVQ6QBaUGacMdjF5tv3/N7bC72tN7cVO0NBwpAwDRUSBhe9KCzK2GY1Zs6gejdCsrY98cuNlfrA/Ku95ewx8KtNzd3/Wmx0IKKJO5Y7OKNM0aXne2e15uTVngxOkkUgIBpqJAwWmrb9Dvkd73ThcKuhGFW7zMxR/z9Sk+y749dNAbko/PMDcjcdENBQEWR2284Luw5qffZ3n7U83pzM/GdhUKLe3Vt7LGEojd3/QAoDhUSxq2CcnFRHp67jT0WlWnFAFF67ILQImtlEvv+2EWrBmRuuqEg8MINR+aKJLGPpccvel5vbtIYQ1rcOnedPZZQ9OauHwDFoULCuLg3V1yUeVsPsceiMq0YIOrL6oQWeyeuYd8fu5i1arc+IGvFLncs3Hpzs8S44Vi1hz0Wu5gyYY3YR7q2vK43N/O2HBRaXEo9xR5LKHpz1w+A4lAhYWSvTREXZfGRc+yxqEwrBohAR5YX3duRZe+ktZYMyNx0Q0FQV1ortEjVNOGOxQ7SNUTdjWgf6dryut7cvHqkQGiRvS6FPZZQ9OauHwDFoULCSJu6UVyUNVeq2WNRmVYNEEZPZuqfyb1PVlMMyC/N1AfkdnMDMjfdUBB0tT8UWsS8PIs9FjvY1thpWQ9aN+jNzZrLVUKPtGkb2WMJRW/u+gFQHCokjNhX54iLsqO5hz0WlWnVAHFg1mahR9WFm+z7ZDXbm+6LfYv741fssciiNzfjXv9KaNJ+t5s9FqtZVXhD7NvBWdHQWwLSGEN6xL42lz2WUPTmrh8AxSF7wuhqfSAuyO2vzGaPRXVaNUDkRqUJTYr2n2bfJ6tZfemW2Lf9M6LYY5FFb27un7FJaHK7qJI9FqtZlHZa7Ftu1H7oLQm3vzJLaNLV9pA9luH05q4fAMUhe8KoK67R5wBNXscei+q0aoC4cihfaJKzIZV9n6xmYN827mOPRRa9uUnnGWlC2nDHYjVPrrdu39yiNzdT/XOA60pq2GMZTm/u+gFQHLInjJKMQtevAnQyYVihNz2JEU/Jpm9i3yeraTzdvHzgDHsssujNTXrSbNVTMtlIc83E/ObLVdBbEhouACWSuwCgAARMQ/aEcSbmsOt9wJxMGFboHZgn8+oc9n2ymjQXyy3zG91SEATmyc02P09ONu7wz2/ubDE/v9ktenMz4AMac4Q9luH05q4fAMUhe8Kgbgx0MVJ3Bu5YVKeVAwTNyRTzZFofsO+XlaTVmG5Z4eyWgiCwUvZN8ytlZWJna68+v/n31sxvdove3LxxulTvBDR/B3ssw+nNXT8AikP2hEH9WEUv0Gr39gJ1MmFYpfe+L9YLXWqv3mbfL6vY3flI9zgc7w6PQ7cUBKTF1vHTfZuenig04o7HKpKtFZ1v+6ZsgN4Ssbm6RYle4CgAAdOQOWH09nzv2/zbyYK9PfI355adVg4Q2WuSdXPuo+4x566/Vi/2iTozcMcim97cTJmwWmjTUF7PHotVJGN7YTq81hrTYTfpzcnHx53v2eMZSm/u+gFQHDInjLtVzUrcialCKweIQHu+LQfZ98sqlmVdEvuUuWIXeyyy6c3NzOW7hDZlWUXssVjFvGhr2465SW9u9r15amGPZSi9uesHwGaMHj160ZgxY97SuE77+WdDfXbs2LH/pP3xd0899dQ/jho1anQo3y9zwlBlLoYqtHKAoGbppM2hOVvZ98sq5semi30q3J3NHotsenPzfNIJoU1+XAZ7LFbx0JdbxD5VatcS9JaLgbnn2hjEHctQeltSZAByQiv4fqUVdcn0s/bnT7UiMGuoz2v/Xql97pHG7BEjRvwklG3InDACq7G2H2WPxQ20coBore8Q2iS8vYB9v6xi+oJYsU8VeSXsscimNzcrTpUIbdIXxrHHYhUT3pov9qm1oQN6S0ZaASy7+wQKQJdDK+SWakXgZOPvWoHXOcznPw13GzInDMOPqVRyPyZVaOUAISbm/26aL+oZ90zMT/pwqTjf7lY2s8cim97cbKq8K7TZ/dEy9lisoFhw9PREcQ1ZteDITXpzkzwAZfefRQHocmgFX5zGD4L+3kGvdwf7vFYARo0aNeoV7c8lP//5z/9HKNughPHokX4yycbUyboje31pDXssbiDpbKXeKZ+vEvo0Xm9g3zezfND7gy/6uS/ExO8Hvd+zxyOj3qz6+Cfmk0akFXc8ZtlY7l9w9Plq6C0hqQuI0YGKO5ah9LaizgAkhVbIJY4ePfq9oL93jxgx4h+G+JUf0X9+8pOf/DetWCwLZRs+ibHj97rX3L//7/+POxRgAJxap68Erjt/jTsU0/iuS+85nfzRMu5QgEGw5yP9Ce33mlaqo+5cmdiXU+tTuEMBBsC//cu/Cn12/GE2dyhDwmSJAXBDK+qeoWJNY2k/ZtGTPK0AnBj02fuDfc+oUaPe0P59m/+v/1X7/X8NZft0Esl4x9jZ0q13m3htLnssbqHVTwgKk7L8E/PT2ffNLG+e6VtwxB2LrHpz05iYf/NsGXssZtm34OgE9JaUsUFdWrhjGUxvk+UHIDO0gu6X9BSQfh45cqRW043JNf5NKwxHBX9WKwBf0D7zP+nnX/ziF/9d++y5ULZBCYNOJu75DP1JvTHp4qNemdyxuIWks5V6BybmL4hl3zezdOOCI6v15qYKE/ND5dH51i84cpve3Eyb6u/TfKWaPZbB9Lay3gAkhFbobdSKwPf98/sMa5cfaQVes/ZvP+732cn0xFD7t7WqrwK+eqRAN0ldZ41JKmj9AEGLJUijpA+Wsu+bWQYWHB2/yB6LrHpzs1SBifmh0vCZI69T6C0nyaBbmN0fkdPsHgUgYBqyJgyrTVJB6wcIVRzzQ+HeSf4FR2V17LHIqjc360pr9Yn5mlbcsZihXdeN2/Tmpuxm9ygAAdOQNWGQwTBdfLcsMkkF7Rkg6Omf1U8ynCbZcGx7aabYj/vt37DHI7PenOxqfyg0inl5FnssZhh4cv6htU/O3aY3N28VlAudDs/dxh7LYHpz1w+A4pA1YSS+s0BcfPfq2thjcQvtGCDcYJ7c3nRf7EPcH79ij0V2vbkZ9/pXQqv2u93ssURKu0yt3ag3J1tq24ROie8sZI9lML256wdAcciYMHruf+eLemaSb8sLU4XnF3c8bqEdA4SxmvH8riz2/YuU1ZduiX3YPyOKPRbZ9ebm/hmbhFa3iyrZY4mUdK3Y0dbOjXpzUniDPj9FjEU0JnHHM5De3PUDoDhkTBh3bjbprv8fL2ePxU20Y4AoyyoSWh1ftpN9/yLllYNnxT7kbNzHHovsenOTNCKtrhzKZ48lUtK1Qvtw7UQR9Jacuz9aLrSiMYk7loH05q4fAMUhY8K4ln1ZXHTHliSwx+Im2jFANJQ36AbKn61i379ImRuVJvbh8oEz7LHIrjc3i/afFlrlRu1njyVSJn+2MtBBB3rLzYzF8UKrcm1M4o5lIL256wdAcciYMMiLTbxWTDrBHoubaMcAYUdPU6d5cFa0ON+qL95kj0V2vblZdeGm0Org7Gj2WCKh6KE9zt9Du+tb6C05jdf1Z3fI5w+KAhAwDRkTBq260h3/r7HH4ibaNUAkvDVf6NVa38G+j5Ew/o15Iv62O13ssaigNyfbGjuFVvFvzmOPJRLeq28X8Se8vQB6K0DqOiPrSmAUgIBpyJgwKLmLgqJBzYJCVto1QBiWPZUKWvaIJ5ha7NtenKHsE0yn9eaksOwZP0M8dSbtuOMJl2RrZVdB4Ua9uUk3taJg125yuWMZSG/u+gFQHLIljK7WB7rX10szXTcgc9OuAYKMUlU17a6/Vi9iT5mwmj0WVfTmJmklTLs17bhjCZcBc+Gth6C3Agz2CO1qe8geT3+9uesHQHHIljCMHsD7pmxgj8VttGuAKD56Tm/bt1a9tn0l6YWuaS/mlN7cNNr2lWQUsscSLrPXJOvtxdLPQ29FuO+L9VL2BEYBCJiGbAmDVmK60ZJDBto1QNReva0X7Vqi5N7HcEmrSSn2orQ89lhU0Zubl/blCc1ObVZvJXCqv5ioLb4NvRVhzoZUKV0CUAACpiFbwshepzfgvnq4gD0Wt9GuAcJ4bb/9ldns+xgu06ZtVN5Y2Gm9uRkw7p6+iT2WcLn9lVn660TtmoHeapA8J0mzk+v2ssfSX2/u+gFQHLIlDGr0ThdbXXENeyxuo50DROyrc4RuHc097PsZKml+D/WVtWtA5qZbC4LO1l7/DccspeYJdzR3i7hjX5sLvRUiPa0l3VInr2OPpb/e3PUDoDhkShjCI2v8dLHC737HN+zxuI12DhD0NEZ46V26xb6foZJWmatsKcKpNzcN657Wxk72WEKl3U8u3aw3J++3fyPGJFp9LtMNBwpAwDRkShh9zbet98gC7R0gaD6WWAm8T525dAGPr69i2GNRTW9uqugVSqvkxdzF6APQWzGSbyNpd6+ujT2WYL256wdAcciUMG6cLhUX2dF529ljcSPtHCBKjl0Q2mWuSGLfz1BpuPznx6azx6Ka3tw8uyNd7xakacgdS6jMXLFLxFyqXSvQWy0e+Xq70I7GKO5YgvXmrh8AxSFTwjiXmKkPyPEZ7LG4kXYOEI0VjUK7PZ+sYN/PUJm+KE7EfD3nKnssqunNzfKcK0K7jEXx7LGEyt0fL9d7AGvXCvRWi/lxGUK7czsz2WMJ1pu7fgAUh0wJI32hf0DOdeeAzE07B4je7u990c994dv828m+nvvfse9rKNz53mJxvjVX32OPRTW9udlc3SK02/WnxeyxhEK6JujaoGukt+d76K0Y6SaRzje6aeSOJVhv7voBUBwyJQxK5m4ekLlp9wCR/OlKoV9DeQP7vg5HaiMW9cxE39Zx03wPen9gj0dFvTlJmpF2pKEKLeEayvWOM8mfrYTeCjJww/H+EvZYgvXmrh8AxSFLwuju+lYk8y3jprp2QOam3QMEddMQHRrS5e/QUFdSI2LdO2kteyyq6s3NvRPX6JZRpbXssQxH6vxBsZ5YbV/HGbfrzUkak7a8MFUboyaJsYo7HkNv7voBUByyJIz6sjrX9mSVhXYPEEVpp4WGuZvS2Pd1OJLRuGhft0699nWy6M1Naj0oTOOPyG8aT52NRMeZ/aeht6JM+VyuHtQoAAHTkCVhOHGH7HXaPUCo1MfZaO905eBZ9lhU1ZubKrWNdKKfrNv15qZsbzhQAAKmIUvCMHzk3NiTVRbaPUB0tT+U0jB1IAZ6sl69zR6Lqnpzk4opFXpQP2Zw326fwb3b9eZmoAe1TT6OkejNXT8AikOWhLF/hnqdJFSjEwNE4jsLhY4tNa3s+zsYaUCmItXtHWfcXhDI2qGhP5tv3xPXxM53F0FvhVl90d/JZUYUeyyG3tz1A6A4ZEkY238/W1xcnfd62WNxK50YINIXxEpv5dNS2+rvOLOQPRbV9eYmdQ0SNxy18nRo6M+AhcjCOOitMDtbeoSOO/7wJXssht7c9QOgOGRIGG13usSFFff6V+wXlZvpxABhdNegTg3c+zsYK06V6B1n5seyx6K63tw8On+H0LIir4Q9lsF4dsdRR7qWeEFvbtIYRVq2N3Wxx4ICEDANGRKG0QLOrT1ZZaETAwT1ZhVazt3Gvr+DsSD+mIixIPE4eyyq683NgoTjupYJ8mp5aM5WEeOt/HLorTiNHtQ3zpSxx4ICEDANGRIG9WL1woDMTScGiLbGTv1p7h/lfZpLvaZl6+upqt7cpCd/+tPcHeyxDEbjqRG96YDeatO44aDWcNyxoAAETEOGhHFwdrR+h1xg7x2y1+nUAEFzZEjPjuYe9n0eiAlv6/PG7tXJO29MJb05SXP/9PmcC9hjGYgdzd36vLFX50BvF5Ce4pKeB7/cwh4LCkDANLgTBq3e2/7KbKkLBrfQqQHiwKzNQs+qwgr2fe5PYVWjxbbtRblXjqqkNyfFiu4X9RXdpC13PP1Zeb5CLxhmRUNvF9Ao6GnRInf+QAEImAZ3wjDu4BPems9+cbudTg0Qp7ceEppe2HOSfZ/7s+rCTRFb2rSN7LG4RW9upk3dqFtIXbzJHkt/Fu7OFrGd3nYYeruENFbJ8AYBBSBgGtwJo/zkFUcsEkDnBohrJ4qEpseWJLDvc3+eTzohYjsTY/+AzE2vFARUXJGmVGxxx9KfdA1QbNeyL0Nvl9CwuirPucIaBwpAwDS4E0aexE+L3EanBoimyrtC013vL2Hf5/488rW+AISsYLhjcYve3Lx+qlhfCDJvO3ss/UnXAMV2t7IZeruEgae62tjFGQcKQMA0uBNG3+sbdABxImE4oXdvzw++LeOm+qKemeTr7nzEvt/BjH1trr4is7GTPRa36M3NVv/K89jX57LHEkw696OemSiuhQe9P0Bvl5CmGsgwjQQFIGAanAmDkqLRI1PGCdxuo5MDROrkdSJJ1lyuYt9vg631HdJb1KiqNzcNq5XWhg72WAzeLqoUMdG1AL3dQ6PnOY1dThT2Q+nNXT8AioMzYTTdkvdVoRvp5ACRF31Qulf7Rksut3cA4dCbm0ZHEJlaEBqvCvO2HITeLuOuPy0W2tJ0F64YUAACpsGZMEqPXRAX0fFlO9kvaC/QyQEiUGxJNC/La/NNvVQQyDIvK5jGfFOnilIv6c1NGrNI29LjF9liQAEImAZnwsjZuE9cREVpeewXtBfo5ABhdASJfXUOu1+WwX1TNujzTS95Y76plwoCmkMs5mVN3cAeC5HOeTJ/dqIDiBf15ualfXlC29xNaWwxoAAETIMzYeyduEZcRLXFt9kvaC/Q6QEi/o15Ql/yeuTe9+CFKfc7vmGPx416c/J++zdiwcXWcdOE1tzxtNS2inM//s150NuFrL16W+i7d9JathhQAAKmwZUweru/90U/P8UX9ewkX3fXt+wXtBfo9ACRsSheJMmyrCL2fW+83iBi2f3RcvZY3Ko3N3d/tExo3FjRyB5LWdYlEUvG4njo7UKKFd7a2EVjWG/P9ywxoAAETIMrYTSU14sEueeTFewXs1fo9ABxKfWU0Jhe9XPv+9XDBSKWE2uS2WNxq97cPLF6j9D46pEC9liM6S30qhB6u5O7P14uNG4ob2DZPgpAwDS4EsaVQ/meG5C56fQAUVdSIzRO/mwV+75nrdKLg+Ij59hjcave3KTCT+QUrRDkjiX5s5UilrrSWujtUgZuOA7z3HCgAARMgythUOHHefF4kU4PED33v+t7zc9sCJ304VJpXg+6VW/lQHKzAAARt0lEQVRukrb6a/5lrHE89nqw27nXg17Tm5vGQ4xspocYKAAB0+BKGPTql/PxuRfJMUAYhtBkisu137ItEHCz3pwkbUlj0po054ojYAD9xXro7WJyT2NCAQiYBkfCEAMywx2y18kxQJAJLiVJ8mnj2u9A66apvK2bvKA3N8kGhru1ZMAA2mFPQi/qzcnghYwczgIoAAHT4EgYt85dFwly//RN7Bexl8gxQBiG0GSKy7XfAZPgbYfZNXC73tw87Tf75rzhOPJ1DEtXEi/qzU3qB0xaV2pjmtPbRgEImAZHwqCBmC6ac4mZ7Bewl8gxQBiG0DsYDaGpG4kYkE8Vs2vgdr25SUWX3u5vB8v2hQH0H7501ADay3pzsyDxuND6TIzzN5coAAHT4EgYKRN0A+iay1XsF7CXyDVA9BlCtzq+zzQgx74+V2y/VStGuTXwgt6cbG3o0DvQaJpz3HC01DhvAO1lvblpzPekpgYcenPXD4DicDph6BPyJ/m2vDBVrBLlvoC9RK4Bos8Q+pLj+9xc3cI2IHPTqwWBccPRXH3P8W2XZV503ADa63pzMtjpwOmFRygAAdNwOmHcKijX5//NiGK/eL1GrgGC0xD6ysGzYttZq3azH3+v6M3NrJVJQnOy6XB62zkbUh03gPa63tzcP2OT0PyWw/MAUQACpuF0wjAmaZ/bifl/TpNrgOgzhF7p+D4fnR8rTTs6r+jNTaMNW/qCWMe3nfyp8wbQXtebmzSXnWORGQpAwDScThgpE1br8/+uVLNfuF4j1wARsEt4ZpKvq+2hY9t90PuDL+almeJ8a2+6z378vaI3N9ubuoTmMS/PEueAU9vtan0gznEueyuv6s1NmstO5xvNbXdab+76AVAcTiaMrvaHmP/HSM4B4uCsaMdX4taX1UnRGcKLenPT6PxSf63esW0aK5APzo6G3h4ijWU0ptHY5uQ8QBSAgCms/uePfvbnB986ljBu5evz/w7M3Mx+0XqRnAPExb25etuktSmObdPw/zu1eT/7sfea3tzMjdrvuB9gtr+9Jc15hd7eIs1pF/MAC8od22ZbQ4ePxnDuOgJQFNoJ2xL3+lxfb7czT+OM+X/nd2WxX7BeJOcA0XTrbmA1rlP2HHSjQdu8ebaM/dh7TW9u3jhTpt9sznLmZpPOaWP1cVPlXejtMdKcdifnAdJTR/JWpTGcu44AFMXGX08oFW2TLtxw5KRN+Rzz/zjJOUAED5B3K5tt315317ds9gyy0MsFgZhu4m836cR0Eyr6nL7Bgd7ykMY0fR7gake2V1VYIba36defl3DXEYCi2PTrz5Y59YqMJv+L+X/jpqL/LxO5B4gTxisyBywyqi7o/X9Tv1jPfty9qjc3Uyev8/cFvmn7tgyrI3oNDL29RxrTjHmAdPNh9/aMKQ4bf/P5Uu46AlAUa3/58T/RSbTz3UW2n7A3z15z9JUM+CS5B4jAJPkvt9i+rTPbj4pt5cdnsB93r+rNzfy4DHEOnN1x1PZt0cIP7naDXtebm8aUE5rrbve2Et9ZKLa14Z8//X+56whAXfwo4c2vHXktl4f5f+zkHiAMmwy6U6ZXtHZuK2A35OF2g9x6c9No02W3PUfwdAMnbY6gt1yksU3MA9TGOju3Q2M1bSfuj1/RKuAfcRcRgMLI36I/Sr6YkmPrSUsmwLSd2qu32S9Ur1KGAcJ4LVd5vsK2bXS29mqF5kTf1nHTPD3dQAa9OSnsOcZNFecC3XzYtZ3Kc9elmG7gdb25acwDtNvw/kJyjtjOyXUpsIEBzOFusX6XvH/6JttO2Ht1bQFj1t4e7w7I3JRhgDBc8/OiD9q2jYpTJWIbhxx41SwzZdCbmzTdgM6FirwS27ZxKvqAFN2NoDcvaWwzjOfv1bfbtp20aRsD7gbc9QOgOP7j3/7d9tcX9HRR78e6h/0i9TJlGCCoRRadC2TUa9c2jH6s5D3Ifcy9rjc3jdxjZx/qpA/8ptNlddDb46Se43bmHjGNxljd3vUIBSBgDpQwDs3R75LLT16x5aTdO3GN4yaZ4JOUYYCg1lzbX5klzofWhg7rv//BnwMTpBsrGtmPudf15mbj9QZxLtA5YYc9S2t9h/j+7a/MdrTtHPSWk0azg72T1try/eXZl/W3G3O2ohMIYB6UMC4fOCNOqszluyw/YelRuHj9+9JMT8/HkoGyDBDHliSIc6L46DnLv9t4wpjw9gI2PzZZKIvenKRzIOGt+bY9oSs+ck58N53T3PsKvflJY9w2/2tgujmw+vuPL9spvpvGbBSAgGlQwmitb7PtLtZoAZa1Mon94vQ6ZRkgSjIKxTmRvjDO8u/O3ZTmt/5IZz/e3JRFb26SDQydE7lRaZZ/d/qCWPHdJccusO8n9JaDmSuSbHkN3NvzgxijjTmGKAAB0zASxu6PlumrdItvW3rSpk5a65+weo39wvQ6ZRkg2pu6Aqt0rezSQZOwd/zhS9Z2XDJRFr25abQhpNZZNIha9b107tI5TOcyndPc+wm95SAtzhCrwievs/R7yUGDvnf3R8sDenPXD4DiMBLGmZgjlpum0hwv+s5tL85wpB0TODRlGiAM49zi9POWfectvx2H3TYMqlAmvbmZ/KluQ0WWLVZ9J01hcMrYHHqrQxrraMzb9PREX2tjp2Xfa5jb05+G3tz1A6A4jIRheBjten+JZXOnjPZImSusn1sIhk+ZBojynCuW3yUb82O8vvpXRr25aawGtnKes/F243rOVfb9g95ykc4zK9te0phMY7Mwt9fGakNv7voBUBxGwqBXI8ZkaXLQt+KkNUx/6ZE49wUJyjVA0F2ysRrYite13Z2PAq/j2u7wv46TgTLpzc22xk592sHvpolzxez3Ga+VaU6WLG83oLc8vHGmzFJzcKOrDY3RxjQGFICAaQQnjAt7TuqT8xfFmT5h6dE3PQLfNh6vf2WhbAOE0dA8z4LWSWVZRbqh+Ywo9v2ShbLpzc39MzaJc+TaiSLT35W35aD4rlOb97PvF/SWjzTmbR0/XYyBbRa8BqYFc3S+XUg++Zje3PUDoDiCE0ZnS0/AFNrs3IWitDxxwtJrOe6LEexLGDINEHdu3NEn5//hS9MWQeSLJVZjZhSy75cslE1vbpak66vPD8/dZup76Fw1FhvdudnEvl/QW04aU1KK0k6b+h6aS2+YP9MYHaw3d/0AKI7+CcNwMs+Py4j4hKX5Cns+WSG+58bpUvYLEexLGLINECkTVptu1dXR3B1IkF3t9nSzUZEy6s1J6nRk3OB2NPdE/D1Gq8GUCWvY9wl6y0sa++g8obHQzLz6/Nj0ATtpoQAETKN/wqi/Vh+wTIj01a2RIBPfWYDevxJRxgHiyqF8009lDCNzK6YuuIky6s1N41UanTORfgedq/QdVw8XsO8P9JaXNPaRIb2ZG1wag42nzQ3l9U/ozV0/AIpjoIRhrG6jeVXhnrB0p7P74+V4HSchZRwg6KnMlhem+qKemRTRXJng8w1Pm+XXm5s0EAsvNe2cieSpjL6YZJJvy7ip0j1tht7y0Zh2EOlTwLKsS4O6JaAABExjoIRhTKhPjaCf4fVTxYHem3j6JxdlHSDIJojOmfNJJ8L+XeM1C542q6M3J+kcoXMl0huG87uy/NZW8nU2gt7yMfh8ozdj4f7+Xv/DmIEWLqEABExjoIQhHju/Okfvn3mtPuSTldrIkUu5LK2RwCcThowDhGFxQOdcOJ1B6I6aTJ/F+ZaOp82q6M1NMh/XDcNXhfVUhs5NIy/WXK5i3w/orQaN1pfhPnWm3tX0e7GDTMdCAQiYxmAJgxaBiCbnSxNDPmHJEJV+Z+e7i/A0RkLKOkBQUjQsOsJZfETtBQPeWCZXEbuRsurNTTpXDM/TcFpUGpPxyWrIKrN86O1+6k8BF+qm4bmhm4YfW5Kg58T4gXMiCkDANAZLGGSmS8a6dAJWX7w57MmqP/3T+wmXHr/IftGBAycMWQeIhvIG4ZlF8wFDsSDq7vrWt/O9xVJOxpeFMuvNTTpnxM2qdg7RuTTc58mKg1YQ0znaeL2BPX7orRZLj10I9PGlsXK4z1dduCk+T2PwYMb2KAAB0xgqYVAbG+OJ3nBJ8lr2ZX9CXWRpw3XQOso+QNC8KjqHjs6PHfYJi2HES6+A8bRZTb05SeeMMX1gOCNyOhfpnBRWHCvlm/sHveUnjYk0jtI5VK6NlUN9ljrVGE8MyU93KL256wfAAYwdO3bKyJEjnx7uc6NHj140ZsyYtzSu037+WSjfPVTCoJPW8Gk7uT510EGZ2iJRx49IVw6DzlD2AYKe/Bnt4YId7/uT5gxSW6/Nv50slRGvbJRdb26SETmdQ3QuDdX+0uiQROemFV0doLc3aazo3fbiDDFmDvQZGmNprDV8Jod6mIIC0P34e62Qm6kVgBVaUffsUB/UPvcr7XPJ9LP250+1z2eFsoHhEkZjRaN4LUcn5JmYI08Uge1NXYH5NHR3LOPcGLAvYcg+QFQV3hADMpFWlPf/dxqoRYulCFcNe4kq6M1NOofEqzbtnBpoYQfN2dLPx0nitRx3vNBbXdLYSGOkmLf89gIxdvb/9zMxh8W/05hLY+9weltRZACSQyvm9g1XAGpF31KtCJwc9DudoXx3KAmDBmUx/8X/eo5WJ92ra/MVHz3ni3lZf2KTNnUjev5KTlUGCHr6R+cUMWdDqkiEdL6RBYdxHmavSQ5pLo2XqYrenKRziM4lY9Clc4zONTrnjCcx+hPpHPZYobf6pDEybeoGcU7R2Ekr0ul8ozH16Pwd4v9TjqMxNxS9zdYWgAIIpQDU/j1O4wdBf+946qmn/nG476aE8eiRfjINxcpz5b6tv5sWSIjBpBO3q7V32O8AeUk6h6o3Jx8+/LPv6pGCwJPn/qT5f/QZ7jhlpyp6c5POJWNOaX/SOUjnogrnG/RWgzRWHp23fcDzjcZYGmtD1duK+gKQHCE+AUwcPXr0e0F/7x4xYsQ/WBnH6l+9+39t+vXnqzQ2bfzNhLqNv/68cONvPnvdym0AgIGNv/x07MbffJ6mnWc3N/3m8x76ef2vJvyaOy7AnaBzi84xca5p55w497RzkDsuwJ2gsVMfQyfU0ZhKYyuNsdxxAQ5CK9Se0Yq7Mo2lQSwLnsMXxivgiUF/v29n3AAAAAAAAICNGKgA1Iq9UcF/1wq+X9JTQPp55MiR2sfH5DoZIwAAAAAAAGARtEJvulbM1WpM035+zv+/f6T9vVn7+4/7fXajVgS+rzFq1KhRo52PFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgTY8eOnTJy5Ming//f6NGjF40ZM+Ytjeu0n3/GFRtgHzTd/0n74++oXSAsg9wHXMPeAq5n76D/mI1rHYgEf6+dLDO1k6ki2GRa+3+/0v5fMv2s/fnT4I4kgHug6Vqp6ftIY/aIESP+//buFSeWIAoDcECS4EaNmkcIbIDrSAgOhyJgEATDErAI3EWQ4NkABskCmA2wAsi9O8BzKmlRaRrDdFPJ1PclNdOPESep/qf6NdOj0vXQHxmujzxX4cuYLesspf2UkeaRchfZ+vcylTGk6Oez0jUwDBmujzzXIx+zZZ2ltHcAY/ou2mk2/5YuK5SpjqE0T4s5jPeryWSyU7oe+iPD9ZHneuRjtqyzlI4zgPdxRHGczf8fj8cbZapjQGvpZTQabUb/L0oXQ39kuEryXInWGUBZp1tsDHvpyyDaS9YW+X0C31wCPs/m//123Szvm75P7XE+nx/F+tvmo+ux7KNosfRKhuvS5PlvMyvPK67jErCs8zMdO4B/0lFFmp7NZrFq66lcdQwhBoyD6NvdND2dTrejj59L10R/ZLgu8lyX1g6grPMzceRwGRvMa7SHmN7Plt/ERnXS3FfiLwVWULpxOB05Rt9f+9Xg6pHhushzHbrGbFkHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgLZPkYNIaNWAbQQAAAAASUVORK5CYII=\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# or equivalently\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10))\n",
" figure.savepath = \"/tmp/out.png\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Hacking with matplotlib"
]
},
{
"cell_type": "code",
"execution_count": 45,
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\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 = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# You can set the figure and axis attributes used by replot, to call extra methods and pass\n",
"# specific parameters to them, that replot would not expose.\n",
"import matplotlib.pyplot as plt\n",
"fig, ax = plt.subplots()\n",
"\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10))\n",
" figure.figure = fig\n",
" figure.axes = {\"_\": ax}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Some errors you might encounter"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "InvalidParameterError",
"evalue": "Second parameter in plot command should be a tuple specifying plotting interval.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-36-810be42c9f1a>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Invalid interval for plotting a function\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msin\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 314\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"__call__\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 315\u001b[0m \u001b[1;31m# We want to plot a function\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 316\u001b[1;33m \u001b[0mplot_\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_plot_function\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 317\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 318\u001b[0m \u001b[1;31m# Else, it is a point series, and we just have to store it for\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36m_plot_function\u001b[1;34m(data, *args, **kwargs)\u001b[0m\n\u001b[0;32m 780\u001b[0m raise exc.InvalidParameterError(\n\u001b[0;32m 781\u001b[0m \u001b[1;34m\"Second parameter in plot command should be a tuple \"\u001b[0m \u001b[1;33m+\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 782\u001b[1;33m \"specifying plotting interval.\")\n\u001b[0m\u001b[0;32m 783\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_values\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_values\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 784\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: Second parameter in plot command should be a tuple specifying plotting interval."
]
}
],
"source": [
"# Invalid interval for plotting a function\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.sin, None)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "InvalidParameterError",
"evalue": "You should pass at least one argument to this function.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-37-bb8eaf706fb0>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Invalid plot call, no arguments given\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 303\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 304\u001b[0m raise exc.InvalidParameterError(\n\u001b[1;32m--> 305\u001b[1;33m \"You should pass at least one argument to this function.\")\n\u001b[0m\u001b[0;32m 306\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 307\u001b[0m \u001b[1;31m# Extract custom kwargs (the ones from replot but not matplotlib) from\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: You should pass at least one argument to this function."
]
}
],
"source": [
"# Invalid plot call, no arguments given\n",
"with replot.Figure() as figure:\n",
" figure.plot()"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "InvalidParameterError",
"evalue": "Group name cannot be longer than one unicode character.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-38-8b04957bf3f0>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Invalid group argument, groups are one unicode character long\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcos\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroup\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"abc\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 308\u001b[0m \u001b[1;31m# kwargs\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 309\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 310\u001b[1;33m \u001b[0mkwargs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcustom_kwargs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_handle_custom_plot_arguments\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 311\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 312\u001b[0m \u001b[0mcustom_kwargs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36m_handle_custom_plot_arguments\u001b[1;34m(kwargs)\u001b[0m\n\u001b[0;32m 729\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"group\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 730\u001b[0m raise exc.InvalidParameterError(\n\u001b[1;32m--> 731\u001b[1;33m \"Group name cannot be longer than one unicode character.\")\n\u001b[0m\u001b[0;32m 732\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"group\"\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0m_DEFAULT_GROUP\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 733\u001b[0m raise exc.InvalidParameterError(\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: Group name cannot be longer than one unicode character."
]
}
],
"source": [
"# Invalid group argument, groups are one unicode character long\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"abc\")"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'Figure' object has no attribute 'apply_grid'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-39-c89b5aaa14ef>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcos\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroup\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"a\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply_grid\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m: 'Figure' object has no attribute 'apply_grid'"
]
}
],
"source": [
"# Invalid grid, no grid provided\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.apply_grid([])"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'Figure' object has no attribute 'apply_grid'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-40-c6ca6527d69a>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcos\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroup\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"a\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m figure.apply_grid([\"a\",\n\u001b[0m\u001b[0;32m 5\u001b[0m \"ba\"])\n",
"\u001b[1;31mAttributeError\u001b[0m: 'Figure' object has no attribute 'apply_grid'"
]
}
],
"source": [
"# Invalid grid, not a rectangular one\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.apply_grid([\"a\",\n",
" \"ba\"])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "physique",
"language": "python",
"name": "physique"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}