replot/Examples.ipynb

40649 lines
3.8 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nO3dB3BVZ57nfXcY75bHXbMzC+st4bVButJu7cy8U7Nvdde6G+d2226HcdPdGI/bSYDBZANuDDa2CRZCiCCSDCKbHEzGZJODBIgoCSQQyhKWwZ7Zt7eqA//3eY6CBUhG9+o++l/d8/1Vnb4B+tY5n+d/7Z9vOnfcQQghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIICSHx8fG9zPa62d4LBAL32vvM5TBzu4vZxtTdRwghhBBCoiCm3P0vU/LS7fX27dvfba4vM/c9kJCQkGHvM5cdzH1rdPeSEEIIIYSELabcvWNK3vAGt3PsbVMCezS4r0Rn7wghhBBCSNhjit5bZvug7rYpf1+ZwjfXbC/V3WeuF9tXB3X2kBBCCCGEhDVxcXH/xRS8WfZ6bGzsP5oC+H/MNseUwq51f8fcLo+Jibkr2Me+fv26EEIIIYSQxhPOThd0bPEzJfBZc/ljU/Yya98CTqz7c3O7LJTHtQdWXf1v8uWX/tzssWOAAQY4YIABBjg0ZRC+NhdkTNGLM+XvE3vdFkBz+217ae6bWXufuRq/IZTHtgtrD/DKFX9u9tgxwAADHDDAAAMcmjIIZ6cLKvatXVP63jXb7+xPv9Tdb64nJSQkdDNbclxcXCCUx2ZhGW4MMMABAwwwwKFpg/A1uggKC8twY4ABDhhggAEOTRtodzUnYWEZbgwwwAEDDDDAoWkD7a7mJCwsw40BBjhggAEGODRtoN3VnISFZbgxwAAHDDDAAIemDbS7mpOwsAw3BhjggAEGGODQtIF2V3MSFpbhxgADHDDAAAMcmjbQ7mpOwsIy3BhggAMGGGCAQ9MG2l3NSVhYhhsDDHDAAAMMcGjaQLurOQkLy3BjgAEOGGCAAQ5NG2h3NSdhYRluDDDAAQMMMMChaQPtruYkLCzDjQEGOGCAAQY4NG2g3dWchIVluDHAAAcMMMAAh6YNtLuak7CwDDcGGOCAAQYY4NC0gXZXcxIWluHGAAMcMMAAAxyaNtDuak7CwjLcGGCAAwYYYIBD0wbaXc1JWFiGGwMMcMAAAwxwaNpAu6s5CQvLcGOAAQ4YYIABDk0baHc1J2FhGW4MMMABAwwwwKFpA+2u5iQsLMONAQY4YIABBjg0baDd1ZyEhWW4McAABwwwwACHpg20u5qTsLAMNwYY4IABBhjg0LSBdldzEhaW4cYAAxwwwAADHJo20O5qTsLCMtwYYIADBhhggEPTBtpdzUlYWIYbAwxwwAADDHBo2kC7qzkJC8twY4ABDhhggAEOTRtodzUnYWEZbgwwwAEDDDDAoWkD7a7mJCwsw40BBjhggAEGODRtoN3VnISFZbgxwAAHDDDAAIemDbS7mpOwsAw3BhjggAEGGODQtIF2V3MSFpbhxgADHDDAAAMcmjbQ7mpOwsIy3BhggAMGGGCAQ9MG2l3NSVhYhhsDDHDAAAMMcGjaQLurOQkLy3BjgAEOGGCAAQ5NG2h3NSdhYRluDDDAAQMMMMChaQPVohYfH/9EXFzciwkJCT0DgcDf2/vM5TBzfxezjTHX7w3lcVlYhhsDDHDAAAMMcLh1Ky6okIV9xknSz14fF95W18y0a9fuR6bk9a+7ba6PNYXvAVMGM+xtc9nB3LcmlMf288Iy3BhggAMGGGCAQ2NbeUm1zE0cJeN+9oaM++nrq8PV6YLNnabknY6Njf3HDh06/GdT/vqa2yPMZY+6v2AKYEkoD+zXhWW4McAABwwwwACHxrbKimuyZNBEr/zNfPFd+eiB3/5d+CpdkLFv/5qS9wezrTc37zSXU832Ut2fm+vF7du3vzvYx/XjwjLcGGCAAwYYYIBDY1tV1Tfy2agMr/ylPTdILp27rPcZwI4dO/5H+7avKYE/NZdHA4HA7ISEhOnmsmvd3zG3y2NiYu4K9rHtwlZX1yyyHzd77BhggAEOGGCAAQ522zZthVf+Up94S/Kycr1jD2+rCyK1X/x4oPbmD0wJ3GPuG27uS2zwd8pCeWwhhBBCCCGSvX6PV/5SHukpl4/n1t8fljIXSkzhe8MUvJ83uD02Njb2x+Zypr1trpur8RtCeWx7YH5q9vzXDQYY4IABBhjgcPN2bPNBSX4wUcZ1TpSja/feYBCuPhdKfmh/8sVsr9gvftjyZ+8015NMMexmtuS4uLhAKA9sF9YeoPZ77ny+AQMM9DccMMAAAz86nNl3SlIefdN79e+LeRtvMQhvpYuQ+GFhGW4MMMABAwwwwKGx7cKJfJn0ZF+v/G1KXdyogXZXc5JoX1iGGwMMcMAAAwxwaGwrzCuRaS8M8crfyhEzpKry60YNtLuak0TzwjLcGGCAAwYYYIBDY1tpYZXMevk9r/wt6jteKsquNmmg3dWcJFoXluHGAAMcMMAAAxwa22zZW9ArySt/s18ZKaVFV77TQLurOUk0LizDjQEGOGCAAQY4NLbZt3mXD5vqlb/pXYZK0YXS2xpodzUnibaFZbgxwAAHDDDAAIfGNnuWjw3JC7zyN/npfpJ/sqBZBtpdzUmiaWEZbgwwwAEDDDDAoalt1+x1Xvmb8FgvOXfwTLMNtLuak0TTwjLcGGCAAwYYYIBDY9uhVbu98pf8YHc5/vmRoAy0u5qTRMvCMtwYYIADBhhggENjW/b2TEl+qLtXAA8s3xG0gXZXc5JoWFiGGwMMcMAAAwxwaGzLOXxOUh/v7ZW/HelrQjLQ7mpO0tYXluHGAAMcMMAAAxwa2wpOX5Ipzwzwyt+6sfO8L4GEYqDd1ZykLS8sw40BBjhggAEGODS2FeWXy4zfvOOVv2VDp0hlxa1n+WiugXZXc5K2urAMNwYY4IABBhjg0NhWVvylZLz2oVf+5vccK+WlX7XIQLurOUlbXFiGGwMMcMAAAwxwaGyrLL8mnw6Y4JW/9G7DpeRSZYsNtLuak7S1hWW4McAABwwwwACHxjb7Gb/VI9O98jf1+belMKc4LAbaXc1J2tLCMtwYYIADBhhggENT25bJy7zyN/EXfeT8sfNhM9Duak7SlhaW4cYAAxwwwAADHBrb9izc7JW/lEd6yuk92WE10O5qTtJWFpbhxgADHDDAAAMcGtsy1++XcZ0Tvc1eD7eBdldzkrawsAw3BhjggAEGGODQ2GZf7bOv+tlX//Yu2uLEQLurOUmkLyzDjQEGOGCAAQY4NLbZz/nZz/vZ8mc//+fKQLurOUkkLyzDjQEGOGCAAQY4NLZdyinyvulry9/qkZ+EdJaP5hpodzUnidSFZbgxwAAHDDDAAIfGNvvbfvY3/mz5s7/5Z3/7z6WBdldzkkhcWIYbAwxwwAADDPS3SHSwZ/WY13OsV/7mvP6Rd9YP1wbaXc1JIm1hGW4MMMABAwy0Nwwi08Gez3fZkMle+Zvxm9975/ttDQPtruYkkbSwDDcGGOCgvWGAAQaR6WA/47du7Dyv/E15ZoAUnL7UagbaXc1JImVhGW4MMNDfcMAAAwwi1WFH+hqv/KU+3ltyjuS0qoF2V3OSSFlYhhsDDPQ3HDDAAINIdDiwfIdX/pIf6i7Z2zNb3UC7qzlJJCwsw42B9oYBDhhggEFkOhz//IgkP9jdK4CHVu1WMdDuak6ivbDaWyQMt/aGAQY4YIABBpHocO7AGZnwWC+v/O2avU7NQLurOYnfB1x7uCNhwwADHDDAAINIc8g/WSCTn+7nlb8NyQuc/dBzcwy0u5qT+H3AeZJjgAEOGGCAQWQ5FF0oleldhnrlb/mwqVJV+bWqgXZXcxK/DzhPcgwwwAEDDDCIHIfSoisy+5WRXvlb0CtJKsquqhtodzUn8fuA8yTHAAMcMMAAg8hwsGVvYZ9kr/zNevk9KS2siggD7a7mJH4fcJ7kGGCAAwYYYKDvYN/mXTlihlf+pr0wRArzStSPv85Au6s5id8HnCc5BhjggAEGGOg7bEpd7JW/SU/2lQsn8tWPvaGBWknraJKQkDDqnnvu+euG9wcCgWHx8fFdzDbGXL83lMf2+4DzJMcAAxwwwAADXYfdczd45S/l0TflzL5T6sd9s0F42lwIMeXuEVPy/q8pgVfNdtlcLzXbQ+Z6hv1zc9nB3F4TymP7fcB5kmOAAQ4YYICBnsORtXtlXOdESX4wUbI2HVQ/5sYMwtvqgogpd782F3fa6+3atfuRKYSvmNI3wlz2aPB3SkJ5bL8POE9yDDDAAQMMMNBxOLnruIx/uIf36t++xVvVj7cpgzDVuZbFFL13zMX3zOVUs73U4P7i9u3b3x3s4/l9wHmSY4ABDhhggEHrO+QezZXUJ97yyt/WaSvUj/W7DMJa5EKJKXnPBAKB5+31hISEGeZ617o/M7fLY2Ji7gr2Me3CVlfXHKAfN3vsGGCAAQ4YYIBB6zlcOndZ0p4d6JW/zz6abYrWN+rH+l0G4exyIcWUvJ0dO3b8r7XX7VvAiQ3+rCyUxxRCCCGEkFbKH77+d5n9ryO88rdqWJr85U9/1t6l2yZcPS7U3GlK3h/N5Q/tDXP9J/ZVQHs9NjY23mRDKA9qD8zP/4XDf+VhgAEOGGCAQes4VJRWy9zEUV75s5f2tvYxNscgjF0u+HTs2PE/mcJX2PC+QCCQZO7rZrbkuLi4QCiPaxfWHqD2e+zR+PmGtrJhgAEOGGCAgWuHyoprsmTQRK/8zez6rhQXVKgfX3MNwtPkIix+H3Ce5BhggAMGGGDg1qGq6hv5bFSGV/7sZ/8unr2sfmzBGGh3NSfx+4DzJMcAAxwwwAADtw72W762/Nlv/eZl5qofV7AG2l3NSfw+4DzJMcAABwwwwMCdg/19P1v+7O/92d/90z6mUAy0u5qT+H3AeZJjgAEOGGCAgRsHe2YPe4YPe6YPe8YP7eMJ1UC7qzmJ3wecJzkGGOCAAQYYhN/BntPXntvXvvpnz/WrfSwtMdDuak7i9wHnSY4BBjhggAEG4XW4cCJfJj3Z1yt/myZ8qn4cLTXQ7mpO4vcB50mOAQY4YIABBuFzKMwrkWkvDPHK38oRM6Sq8mv142ipgXZXcxK/DzhPcgwwwAEDDDAIj0NpYZXMevk9r/wt6jteKsquqh9DOAy0u5qT+H3AeZJjgAEOGGCAQcsdbNlb0CvJK3+zXxkppUVX1Pc/XAbaXc1J/D7gPMkxwAAHDDDAoGUO9m3e5cOmeuVvepehUnShVH3fw2mg3dWcxO8DzpMcAwxwwAADDEJ3sGf52JC8wCt/k5/uJ/knC9T3O9wG2l3NSfw+4DzJMcAABwwwwCB0h12z13nlb8JjveTcgTPq++zCQLurOYnfB5wnOQYY4IABBhiE5nBo1W6v/CU/2F2Of35EfX9dGWh3NSfx+4DzJMcAAxwwwACD4B2yt2dK8kPdvQJ4YPkO9X11aaDd1ZzE7wPOkxwDDHDAAAMMgnPIOXxOUh/v7ZW/7TNXq++nawPtruYkfh9wnuQYYIADBhhg0HyHgtOXZMozA7zyt27MXO9LINr76dpAu6s5id8HnCc5BhjggAEGGDTPoSi/XGb85h2v/C0bMlkqK9r2WT6aa6Dd1ZzE7wPOkxwDDHDAAAMMbu9QVvylZLz2oVf+5vUcK+WlX6nvX2sZaHc1J/H7gPMkxwADHDDAAIPvdqiquCafDpjglb/0bsOl5FKl+r61poF2V3MSvw84T3IMMMABAwwwaNrh+vXrsnpkulf+pj7/tlzKKVLfr9Y20O5qTuL3AedJjgEGOGCAAQZNO+ydtcYrfxN/0UfOHzuvvk8aBtpdzUn8PuA8yTHAAAcMMMCg8W3vws1e+Ut5pKec3pOtvj9as6Dd1ZzE7wPOkxwDDHDAAAMMbt28s3x0TvS2zA371fdHcxa0u5qT+H3AeZJjgAEOGGCAwY3bwRU7a8rfz96QE2t3+9ahbha0u5qT+HnA6xYWAwwwwAEDDDCo2Q4s215f/uxbwH51aDgL2l3NSVhY/z7JMcAABwwwwKDhtm/xVq/42c1e96vDzbOg3dWchIVluDHAAAcMMMBg76ItNeWvc6IcWLrdtw6NzYJ2V3MSFpbhxgADHDDAwN8GexZsqi9/B5fv9K1DU7Og3dWchIVluDHAAAcMMPCvwe65G7zyl/xgohxaucu3Dt81C9pdzUlYWIYbAwxwwAADfxrsylhXW/66y+E1e3zrcLtZ0O5qTsLCMtwYYIADBhj4z2DHJ5/Vl7+ja/f61qE5s6Dd1ZyEhWW4McAABwww8JfB9hmra8rfQ90lc33TP/Ic7Q7NnQXtruYkLCzDjQEGOGCAgX8Mtk5b4ZW/8Q/3kKyNB33rEMwsaHc1J2FhGW4MMMABAwyi36Cq6hv5fMry+vJ3bPMhXzqEMgvaXc1JWFiGGwMMcMAAg+g2sOVvy6SlXvlLeaSnHP/8sC8dQp0F1aJ2//33d4qPjx8bFxf3YiAQ6GrvM5fDzH1dzDbGXL83lMdlYRluDDDAAQMMotfAlr9NqYtryt+jb8qJbUd96dCSWQhvowsyCQkJu9u3b393TExMO1P4NpvC94C5L6P2zzqY+9aE8rgsLMONAQY4YIBBdBrY8rdx/ML68pe9I8uXDi2dhfA2uiBiyt4jpuStbXDXneb2CHN/j7o7TAEsCeWxWViGGwMMcMAAg+gzsOVvfdJ8r/xNeKyXnNx13JcO4ZiFFhe5UGPK3hBT8DaawvecuewVFxf3M3M51Wwv1f0dc73YvkIY7GOzsAw3BhjggAEG0WVQVfm1rBszt6b8Pd5LTn1xwpcO4ZqF8La6IGLK3e/N9kXtze+b69mmFE6v+yygjbldHhMTc1ewj20Xtrq65gD9uNljxwADDHDAAINoMbhS9bWsHZ3hlb/Ux3vLmX0nfekQzlkIW6ELNqbcdTNlb2Hdbftqn9lGmvsSG/ydslAeWwghhBASFbn+l7/I5nHzvPI36Rd9pPRMvvYuRUXC0eVCSu0XP7bV3vyBuX4iNjb2x+Zypr3DXDdX4zeE8tj2wPze7DHAAAMcMMCgrRvYt31Xj0z3yt/EJ/rIuYNnfOngYhbCVuhCiSl4r5utfyAQeDchIeEn9j5zPcm+Omi25Li4uEAoj2sX1h6g9nvsmu/tY4ABBjhggEFbNqis+FpWvTezpvw92VdyDp/zpYOrWQhvo4uQsLAMNwYY4IABBm3XoLLimqwcPr3mbV9b/o7k+NLB5SxodzUnYWEZbgwwwAEDDNqmQWX5NVn++6k15e+pfpJ7NNeXDq5nQburOQkLy3BjgAEOGGDQ9gxs+Vs2dIpX/iY/3V/ysvJ86dAas6Dd1ZyEhWW4McAABwwwaFsGFWVXZengSV75m/LMADl//IIvHVprFrS7mpOwsAw3BhjggAEGbcfAlr8lgyZ65S/t2YFy4US+Lx1acxa0u5qTsLAMNwYY4IABBm3DoLz0K/l0wISa8vfcIMnPLvClQ2vPgnZXcxIWluHGAAMcMMAg8g3KS6plUb/xXvmb+vzbUnDqoi8dNGZBu6s5CQvLcGOAAQ4YYBDZBrb8Lewzrqb8vTBYCk5f8qWD1ixodzUnYWEZbgwwwAEDDCLXoKz4S1nQO8krf9N+NUQuni30pYPmLGh3NSdhYRluDDDAAQMMItOgrOhLmf/mx175m95lqFw6d9mXDtqzoN3VnISFZbgxwAAHDDCIPIPSoisyr8cYr/zN+M07UphT7EsH7Y0CGKUbw40BBjhggEGkGZReviJzE0d55W/mb4dJYV6JLx0iYaMARunGcGOAAQ4YYBBJBiWFlTLnjY+88pf+4rtyWan8aTtEykYBjNKN4cYAAxwwwCBSDEouVUrGax/UlL9uw6XoQqkvHSJpowBG6cZwY4ABDhhgEAkGxQUVMvuVkV75++RfR5jyV+ZLh0jbKIBRujHcGGCAAwYYaBsUF5TLrJff98qfvbS3tQ2YhW8NtLuak7CwDDcGGOCAAQZ6BvaVPvuKny1/9hXAkosV6sfPLNxooN3VnISFZbgxwAAHDDDQMbCf8bOf9bPlz372z34GUPvYmYVbDbS7mpOwsAw3BhjggAEGrW9gv907s+u7Xvmz3/q13/7VPm5moXED7a7mJCwsw40BBjhggEHrGhTmFnu/72fL39zuo73f/dM+ZmahaQPtruYkLCzDjQEGOGCAQesZ2DN62DN72PJnz/Rhz/ihfbzMwncbaHc1J2FhGW4MMMABAwxax8Cey9ee09eWP3uOX3uuX+1jZRZub6Dd1ZyEhWW4McAABwwwcG9w8WyhTPvVEK/8LeidJGXFkV3+mIVvDbS7mpOwsAw3BhjggAEGbg0KTl+SqS8M9srfwj7JUl5SrX6MzELzDbS7mpOwsAw3BhjggAEG7gwKTl2Uqc+/7ZW/T/ultJnyxyx8a6Dd1ZyEhWW4McAABwwwcGOQn10gac8Nqil/AyZIeelX6sfGLARvoN3VnISFZbgxwAAHDDAIv8GFE/ky5dmBXvlbMmiiVJRdVT8uZiE0A+2u5iQsLMONAQY4YIBBeA3OH78gU54Z4JW/pYMntcnyxyx8a6Dd1ZyEhWW4McAABwwwCJ9BXlaeTH66v1f+lg2dIpXl19SPh1lomYF2V3MSFpbhxgADHDDAIDwGuUdzTfnr55W/5cOmtunyxyx8a6Dd1ZyEhWW4McAABwwwaLlBzpEcmfRkX6/8rRw+XSor2nb5Yxa+NdDuak7CwjLcGGCAAwYYtMzg3KGzMvEXfbzyt+q9mab8fa1+DMxC+Ay0u5qTsLAMNwYY4IABBqEbnDtwRiY+UVP+Vo/8JGrKH7PwrYF2V3MSFpbhxgADHDDAIDSDM/tOSeoTb3nlb82Hs6WqMnrKH7PwrYF2V3MSFpbhxgADHDDAIHiD03uyJfXx3l75Wzt6TtSVP2bhWwPVopaQkPBP5uIH7du3vzsQCMTZ+8zlsPj4+C5mG2Ou3xvK47KwDDcGGOCAAQbBGZz64oRMeLyXV/7WfzxPqqq+Ud9nZsGdQVgLXbAxJS/blMBqs62NiYlpZwrfA+Z6hv0zc9nB/PmaUB6XhWW4McAABwwwaL7Bqd3HZcJjNeVvw7gFUVv+mIVvDcLb6IKMKXmv3nR7hCmBPepumwJYEsrjsrAMNwYY4IABBs0zOLkzS1IefdMrfxtTFkV1+WMWvjVoaYdrUUzhS46Li3valL53O3bs+D9M4Ztqtpfq/txcL7ZvDwf7uCwsw40BBjhggMHtDU5sz6wvf5tTF0d9+WMWvjUIb6MLPt+z/9OuXbsfmbJ32BTC6aYMdq37Q3O7PCYm5q5gH9QubHV1zQH6cbPHjgEGGOCAAQbfZXBi6xFJeaSnV/62TF5qisE36vvILLSeQTjLXFCJi4t7wRS8ibU3v28K4B/M7eGmACbW/R1zuyyUxxZCCCGENJn8A9n15W/fnLVy/fp17V0irZywlLlQYgrgY7GxsT+21zt16vTfTQHcbm+by5n2PnPdXI3fEMpj2wPze7PHAAMMcMAAg8YMjm0+KOMf7uGVv23TV6rvF7OgYxDOThd07Bc+7Ct+puiNtt8Crr0vKSEhoVvt5wMDoTyuXVh7gNrvsfP5Bgww0N9wwACDbw3y9hyT5Ie6e+Vv+8zV6vvELOgZhLfRRUhYWIYbAwxwwACDG7fDq3fXl7+ds9aq7w+zoGug3dWchIVluDHAAAcMMKjZ7Dd7t05b4RU/u+2es159n5gFfQPtruYkLCzDjQEGOGCAwb9JRdlVWTlihlf87Of+zmw95DsDZqFxA+2u5iQsLMONAQY4YOB3g+KCcpnXY4xX/iY91U/O7Mn2nQGz0LSBdldzEhaW4cYAAxww8LPBhex8mf7rd7zyN/O3w6Tg1EXfGTAL322g3dWchIVluDHAAAcM/Gpgz+s78cm+Xvlb0OtjKblY4TsDZuH2BtpdzUlYWIYbAwxwwMCPBgeW76j/jb/V76d7nwH0mwGz0DwD7a7mJCwsw40BBjhg4CeDqsqvZcukpfXf9LW/8XfzeX2j3YBZCM5Au6s5CQvLcGOAAQ4Y+MWgvKRalv9+qlf87Ondjqzd6zsDZiF4A+2u5iQsLMONAQY4YOAHg6ILpTLnjY+88jf56f5ydv9p3xkwC6EZaHc1J2FhGW4MMMABg2g3OH/8gkz71RCv/KV3Gy4XzxT6zoBZCN1Au6s5CQvLcGOAAQ4YRLNB9vZMSX3iLa/8LewzTkoKK31nwCy0zEC7qzkJC8twY4ABDhhEq8G+xVsl+cGac/p+9tFsqSy/5jsDZqHlBtpdzUlYWIYbAwxwwCDaDOw3fTelfFrzTd/OibJr9rpbvukb7QbMQvgMtLuak7CwDDcGGOCAQTQZlBV/KUsHT6r5pu+jb0rmhv2+M2AWwmug3dWchIVluDHAAAcMosWgMK9EMl79wCt/U54dKOcOnfWdAbMQfgPtruYkLCzDjQEGOGAQDQa5R3Nl6vNve+Vv1svvyaWcIt8ZMAtuDLS7mpOwsAw3BhjggEFbNzj++WFJfby3V/4+7Z8ipUVXfGfALLgz0O5qTsLCMtwYYIADBm3ZYM+CTZL8YKJX/tZ/PE8qK5r3Td9oMmAW3BpodzUnYWEZbgwwwAGDtmhQWfG1rE+a7xU/WwC/mL/JdwbMQusYaHc1J2FhGW4MMMABg7ZmYN/iXTxgglf+JjzeS45tOew7A2ah9Qy0u5qTsLAMNwYY4IBBWzIozCmWWS+/75W/tOcHSe7RHN8ZMAuta6Dd1ZyEhWW4McAABwzaikHO4XOS9uxAr/zNfmWk97MvfjNgFlrfQLurOQkLy3BjgAEOGLQFg6yNB2XCY7288rdk0ETvB5/9ZsAs6BhodzUnYWEZbgwwwAGDSDawp3DblbHeO6WbLX8bxy/0vgDiJwNmQddAu6s5CQvLcGOAAQ4YRKpBZfk1WTsqo/abvt1l75CTffMAACAASURBVKItvjNgFvQNtLuak7CwDDcGGOCAQSQalBZWyaK+473yl/rEW3Jie6bvDLQ3HCiAUbsx3BhggAMGkWdw8WyhpHcb7pW/aS8MkbysPN8ZRMKGAwUwajeGGwMMcMAgsgzOHjgtk3/Z3yt/c974SIoulPrOIFI2HCiAUbsx3BhggAMGkWNwdN0+SXn0Ta/8LRuaJuUl1b4ziKQNBwpg1G4MNwYY4ICBvoH9pu+O9DVe8bPb5olLpKrS7Td9I80gEjccKIBRuzHcGGCAAwa6BhVlV2XNB5/UfNP3oe5yYOl23xlE6oYDBTBqN4YbAwxwwEDPoORSpSzoleSVv4m/6CMndx1XP37mAIebDbS7mpOwsAw3BhjggIGGQcGpSzKz6zCv/E3vMlQunMhXP3bmAIfGDLS7mpOwsAw3BhjggEFrG5zeky2Tnurnlb953UdLcUG5+nEzBzg0ZaDd1bzEx8enBQKBe+11cznM3O5itjF19wUbFpbhxgADHDBoTYPDq3fL+Id7eOVv5fDpUl76lfoxMwc4fJdBeJtcCDEl759N2bsQGxt7n7n+QEJCQoa931x2MPevCeUxWViGGwMMcMCgNQzsN323TltR/03frVNXePdpHy9zgMPtDMLb5oLPnab0/Yspe7ttATSXI8ztHnV/aApgSSgPysIy3BhggAMGrg3sN33tq322+NlX/w6t2q1+nMwBDs01CF+VCyGm7P3GXPywrgCawjfVbC/V/bm5Xty+ffu7g31cFpbhxgADHDBwaWA/3zevxxiv/NnP/dnP/2kfI3OAQzAGYS10wcSUv783xe+f7HVT9L7o1KnT/eb2DHN/17q/Y26Xx8TE3BXsY9uFra6uOUA/bvbYMcAAAxwwcGOQfzJfZvz6Ha/8zfztMCk4fVH9+JgDHII1CGenCyqm3L1au71mCmCOKX6DzeVIc5nY4O+UhfLYQgghhDjI5eO5Mrn2m75L+o2XP3zz79q7REhICV+ja0HsK4C1nwH8ibk+095nbpur8RtCeTx7YH5v9hhggAEOGITX4ODyHfXf9F39frpUll9VPy7mAIdQDcLb5EJIIBB42b7SZ7aJ995779+Z20n2c4DmdnJcXFwglMe0C2sPUPs9dj7fgAEG+hsOGLTUwJ6/d8ukpfXf9N0+c3XEftOXOcChuQbh7nMRERaW4cYAAxwwCIdBeUm1LP/9VK/4pTzSU46s3at+LMwBDuEw0O5qTsLCMtwYYIADBi01KLpQKnPe+Mgrf5Of7i9n959WPw7mAIdwGWh3NSdhYRluDDDAAYOWGJw/dl6m/WqIV/7Suw2Xi2cK1Y+BOcAhnAbaXc1JWFiGGwMMcMAgVIPs7ZmS+sRbXvlb2CdZSgor1fefOcAh3AbaXc1JWFiGGwMMcMAgFIN9i7dK8oPdvfL32agMqSy/pr7vzAEOLgy0u5qTsLAMNwYY4IBBMAb2m74bUxbVfNO3c6LsyljXJr/pyxzg0FwD7a7mJCwsw40BBjhg0FyDsuIvZengSTXf9H30TcncsF99f5kDHFwbaHc1J2FhGW4MMMABg+YYFOaVSMarH3jlb8qzA+XcobPq+8oc4NAaBtpdzUlYWIYbAwxwwOB2BrlHc2Xq82975W/Wy+/JpZwi9f1kDnBoLQPtruYkLCzDjQEGOGDwXQbHPz8sqY/39srfp/1TpLToivo+Mgc4tKaBdldzEhaW4cYAAxwwaMpgz4JNkvxgolf+1n88TyorouebvswBDs010O5qTsLCMtwYYIADBjcb/OXPf5H1SfO94mcL4BfzN6nvF3OAg5aBdldzEhaW4cYAAxwwaLiVFV+Rle9M9sqffev32JbD6vvEHOCgaaDd1ZyEhWW4McAABwzqtrysPO90brb82S992C9/aO8Tc4CDtoF2V3MSFpbhxgADHDCwP+RsP++X8khPr/wt6DFaLp8vUd8v5gAH7Y0CGKUbw40BBjj43aAov1wWD0ytP7PH5omL5c9//JOvDJgDHL7LQLurOQkLy3BjgAEO/jU4uTNL0p4d6JU/e2lv+82AOcDhdgbaXc1JWFiGGwMMcPCfQUXZVdmcuth7xc+WvyWDJnqvBPrJgDnAobkG2l3NSVhYhhsDDHDwl0HBqYuS8VrNKd3sZ/7sZ//sZwD9ZMAc4BCMgXZXcxIWluHGAAMc/GFgS97BFTvrz+phv+2bl3nrt3yj2YA5wCEUA+2u5iQsLMONAQY4RL9B6eUrsnL49Jovepht7eg5Ul5S7SsD5gCHUA20u5qTsLAMNwYY4BDdBmf3n5bpXYZ6xW/Sk30lc+MB3xkwBzi0xEC7qzkJC8twY4ABDtFpUFnxtWyfuVqSH+xe89t+vT6WwpxiXxkwBziEw0C7qzkJC8twY4ABDtFnUJhb7BW+mnP5dveKoC2EfjJgDnAIl4F2V3MSFpbhxgADHKLLwL7Fa9/qteXPvvVr3wL2mwFzgEM4DbS7mpOwsAw3BhjgEB0G9ksd9ssddV/0sF/6KC2s8pUBc4CDCwPtruYkLCzDjQEGOLR9g7ysPO9nXWzxsz/zYn/upeFv+/nBgDnAwZWBdldzEhaW4cYAAxzaroEtefaHnO0POtvyZ3/g2f7Qs58MmAMcXBtodzUnYWEZbgwwwKFtGhQXlHuncKt7y3dT6mLvFG9+MmAOcGgNA+2u5iQsLMONAQY4tD2DkzuzJO3ZgV7xs5fZO7J8Z8Ac4NBaBtpdzUlYWIYbAwxwaDsGleXXZHPqYhnXOdErf4sHpkpRfrmvDJgDHFrbQLurOQkLy3BjgAEObcPAfrYv47UPveJnP/NnP/sX6hc92qoBc4CDhoF2V3MSFpbhxgADHCLf4ODKXd63e235s9/2zcvM9Z0Bc4CDloF2V3MSFpbhxgADHCLXoPTyFe/3/Oq+6GF/58/+3p+fDJgDHLQNtLuak7CwDDcGGOAQmQb2DB72TB62+Nkze2Ru2O87A+YAB+1NvQAGAoGX4+Pjf222tISEhF/W3jfM3O5itjHm+r2hPC4Ly3BjgAEOkWVgz9lrz91rz+Fry9/8Nz+WwpxiXxlobxjg0NAgvI0uiNx///2dTOk7Za/HxcU9Za4fM4XvAXOZYe8zlx1MCVwTymOzsAw3BhjgEDkGhbnFsqBXklf8bAHcPmO1Vwj9ZBAJGwY4NDQIZ6cLOvfdd9/f2ktT9N4z5e9DU/pGmMsedX9u7i8J5XFZWIYbAwxwiAyDrI0Hvbd6bfmb9qshcmbfKd8ZRMqGAQ4NDcLV5ULNX8XFxb1oit5cU/z+g7mcaraX6v7QXC9u37793cE+KAvLcGOAAQ66BvZLHWvHzKn/oseKd6dJaWGVrwwibcMAh4YG4a1zISYhIaGb2daZbbopgl0b3F8eExNzV7CPZxe2urrmAP242WPHAAMMcNAyOJ+VJ5+8NNwrfvZnXg6t3Gn+pfONrwwiccMAh4YG4W1yISY2Njbe5LrZRpoCmFh3vymAZaE8nhBCCGn1XL9+XY6t3ikpj/as+aJH91FytaRSe7cIIY0kfC0uyJhy19MUvlX2url8yGylpgj+2FzOtPfVlsINoTy2PTC/N3sMMMAAh9Y0KLlYLksGTax/y9ee2q2y/Kr6sTMHGODQuEE4O11Q6dSp0z2m4L1e+/ZvRlxc3D/Y+wOBQFLtfcnmvkAoj20X1h6g9nvsfL4BAwz0NxzcG5zcmSVpzw70it8Uc5m9I0v9mJkDDHD4boPwtroICQvLcGOAAQ7uDSrLr3mv9I3rnOiVv8UDJkhRfrn68TIHGOBwewPtruYkLCzDjQEGOLg1KDh1STJe+9ArfimP9JQv5m+Sqqpv1I+VOcAAh+YZaHc1J2FhGW4MMMDBncHBlbu8b/fa8pf+4ruSl5mrfozMAQY4BGeg3dWchIVluDHAAIfwG5ReviIrh0+v/6LH2tFzvN/70z4+5gADHII30O5qTsLCMtwYYIBDeA3O7j8t07sM9YrfxCf7SuaG/erHxRxggEPoBtpdzUlYWIYbAwxwCI+BPWfv9pmrvXP4er/t9+bHUphTrH5MzAEGOLTMQLurOQkLy3BjgAEOLTcozC2WBb2SvOJnC+D2Gau9Qqh9PMwBBji03EC7qzkJC8twY4ABDi0zyNp4UCY92dcrf9N+NUTO7DulfhzMAQY4hM9Au6s5CQvLcGOAAQ6hGdgvdawdM6f+ix4r3p0mpYVV6sfAHGCAQ3gNtLuak7CwDDcGGOAQvEFeVp6kdxvuFb8Jj/eSg8t3RvRv+zEHGOAQuoF2V3MSFpbhxgADHJpvYEvengWbvR90tuUv47UPJP9kgfp+MwcY4ODOQLurOQkLy3BjgAEOzTMoLiiXJYMm1r/luyl1sVSUXVXfZ+YAAxzcGmh3NSdhYRluDDDA4fYGJ3dmSdqzA73iN8VcZm/PVN9X5gADHFrHQLurOQkLy3BjgAEOTRtUll+TzROXyLjOiV75WzxgghTll6vvJ3OAAQ6tZ6Dd1ZyEhWW4McAAh8YNCk5dkozXPvSKn/3M3xfzN0XNFz2YAwxwaL6BdldzEhaW4cYAAxxuNTi0cpekPt7bK3/pL74reZm56vvGHGCAg46BdldzEhaW4cYAAxy+3cqKrsiGUbPqv+ixdlSG93t/2vvFHGCAg56BdldzEhaW4cYAAxxqft7FntHDnsnDFj97Zo/M9fvV94s5wAAHfQPtruYkLCzDjQEGfne4kJ0vi/qNr3/Vb3HfZCnMKVLfL+YAA+0NBwpg1G4MNwYY+NehtOiK91t+4x/uUfPzLs8M8D77d/36dd8YMAcY4HB7A+2u5iQsLMONAQZ+c7Bv9x5evVvSnhvkFb/kh7rLxpRFUnr5im8MmAMMcGi+gXZXcxIWluHGAAM/OeQezZV5PcfWv927sE+yXDh+wVcGzAEGOARnoN3VnISFZbgxwMAPDiUXK2Td2HmS/GDNDzpPe2GIZG7Yf8vv+kWzAXOAAQ6hGWh3NSdhYRluDDCIZofKiq9l3+KtMumpfjU/6Pzom7J16oomf9olGg2YAwxwaJmBdldzEhaW4cYAg2h1OLPvlGS8+kH9271LB0+Si2cKfWXAHGCAQ8sNtLuak7CwDDcGGESbw+XzpbL6/fT64jez6zA5sT3TVwbMAQY4hM9Au6s5CQvLcGOAQbQ4VJZfk91z1kvqE295xc+eym3X7HVSUXbVNwbMAQY4hN9Au6s5CQvLcGOAQTQ4nNyZJendhte/6rdyxAwpzCvxlQFzgAEObgy0u5qTsLAMNwYYtGWHi2cvy7KhU+qL36zfvS+n92T7yoA5wAAHtwbaXc1JWFiGGwMM2qJDeelXsm36Ku9bvbb4TXyyr+xdtMX71q9fDJgDDHBoHQPtruYkLCzDjQEGbcnB/m5f1qaDMr3L0JpX/TonytpRGVJcUO4bA+YAAxxa10C7qzkJC8twY4BBW3HIzy6QT/ul1L/dO7f7aMk5fM5XBswBBji0voF2V3MSFpbhxgCDSHcoK/pSNqculvEP9/CK35RnBsjBlbtuOYtHNBswBxjgoGeg3dWchIVluDHAIFIdbME7vHq3pD03yCt+yQ91l40pi6T08hXfGDAHGOCgb6Ba1AKBwFtm6xEfH7+kU6dO99feN8zc7mK2Meb6vaE8LgvLcGOAQSQ65B7NlXk9x9a/3buwzzi5cPyCrwyYAwy0NxyUC2BcXNzTZvuH2usvmMK30RS+BxISEjLsfeayg7lvTSiPzcIy3BhgEEkOJRcrZN3YeZL8YKJX/Ka9MEQy1+938nZvpBpobxhggMONBuHsdEHFlLsBpvBNs9fN5f80he+U2YbbVwQb/J2SUB6bhWW4McAgEhzsz7fsW7xVJj3Vzyt+KY/0lK1py6W8pNo3BpGyYYABDjcahKvPhZIfxMbG/o29Uvs2cIrZ0sz2Ut1fMNeL27dvf3ewD8zCMtwYYKDtcHb/acl49YP6t3uXDp4kF88U+sogkjYMMMDhRoNwFrqQ0q5dux+ZovfZPffc89cJCQkzTBnsWvdn5nZ5TEzMXcE+pl3Y6uqaA/TjZo8dAwww0HEoyi+V1SPT64vfzN8Ok+ztR31lEIkbBhjgcKNBeNtc8PmeKX9j77vvvr+1N0zhG2EKYGLdH5rbZaE8qBBCSCvnz3/6kxxdvk0m/aJPzVk8ft5bjizZIn/+45+0d40QQm5JuIpcSDEFr2enTp3usdftN39jY2N/bC5n2tvmurkavyGUx7UH5vdmjwEGGLSew8mdWZLebXj9q34rR0yXy+dL1I+dWcAAAxyaMghnnwsq9pu/pgD+myl5V2q3+fb+QCCQZO7vZrZk83cCoTy2XVh7gNrvsfP5Bgww0N9cOlw6d1mWDU2rL36zfve+nN6TrX7MzAIGGOBwO4PwtroICQvLcGOAgUuH8tKvZNuMVZLy6Js1b/c+2Vf2LtrifetX+3iZBQwwwKE5BtpdzUlYWIYbAwxcONjf7cvadFCmdxla86pf50RZOypDigvK1Y+TWcAAAxyCMdDuak7CwjLcGGAQbof87AL5tH9K/du9cxNHSc7hc+rHxyxggAEOoRhodzUnYWEZbgwwCJdDWdGXsjl1sYx/uIdX/KY8M0AOrtgpVZWR+XYvs4ABBjg0x0C7qzkJC8twY4BBSx3s272HV++WtOcGecUv+aHusjFlkZRevqJ+TMwCBhjg0FID7a7mJCwsw40BBi1xyMvMlfk9x9a/3buwzzi5cPyC+rEwCxhggEO4DLS7mpOwsAw3BhiE4lByqVLWfzxPkh9M9IrftBeGSOb6/d6rgdrHwSxggAEO4TTQ7mpOwsIy3BhgEIyD/fmWfYu3yuSn+3nFL+WRnrI1bbmUl1Sr7z+zgAEGOLgw0O5qTsLCMtwYYNBch7P7T0vGqx/Uv927dPAkuXimUH2/mQUMMMDBpYF2V3MSFpbhxgCD2zkUXSiV1SPT64vfzN8OkxPbjqrvL7OAAQY4tIaBdldzEhaW4cYAg6YcKsuvye456yX1ibe84pf6eG/ZOWutVJRdVd9XZgEDDHBoLQPtruYkLCzDjQEGjTmc3HlM0rsNr3/Vb+Xw6VKYV6K+j8wCBhjg0NoG2l3NSVhYhhsDDBo6fF1RLcvfSasvfrNefl9O78lW3zdmAQMMcNAy0O5qTsLCMtwYYGC30qIrsn3GKpnwWC+v+E18sq/sWbjZ+9av9r4xCxhggIOmgXZXcxIWluHGwN8Gl8+XypZJS2TiL/rUvOrXOVHWjs6Q4oJy9X1jFjDAAAftjQIYpRvDjYFfDS5k58uaD2fXn7fXbosHTpCK3EJfOTALGGCAw+0MtLuak7CwDDcG/jI4s++U9/t99pU+W/psAbQ/8XL+2HlfOTALGGCAQ3MNtLuak7CwDDcG0W9QVfm1ZG06KPO6j65/tS/1571l04RPpTC32DcOzAIGGOAQioF2V3MSFpbhxiB6Dezv9e1fuk1mdn23vvilPTfI+y2/0sIq3zgwCxhggENLDLS7mpOwsAw3BtFnUFJYKTs++UzSnh1YX/zsb/odWLb9O3/EOdocmAUMMMAhHAbaXc1JWFiGG4PoMSjMKZaNKYu8t3frit+8nmPl2OZD3tvAfnFgFjDAAIdwGmh3NSdhYRluDNq+QV5Wnqx6b6YkP9S9/qdclg2ZLGf3n/aVA7OAAQY4uDDQ7mpOwsIy3Bi0TYOqqm/k1O7j8umACfWv9qU80lM+G5Uh+dkFvnFgFjDAAAfXBtpdzUlYWIYbg7ZlYM/McXTdPsl47cP64md/xHnL5GVSdKHUNw7MAgYY4NBaBtpdzUlYWIYbg7ZhUF5SLXsXbZHpv36nvvhNfWGw7J67QcqKvvSNA7OAAQY4tLaBdldzEhaW4cYgsg2KCypk27SVMvnp/vXFb9bL78uhVbulsvyabxyYBQwwwEHLQLurOQkLy3BjEJkGF88Uyvqk+TLhsV71xW/hW+PkxPZM7/N/fnFgFjDAAAdtA+2u5iQsLMONQWQZ5Bw+JyuGTZPkB2tO1WYv7W17v58cmAUMMNDfcKAARu3GcGMQCQb2FT37yp59ha/+G72Pvum9AmhfCfSLQyRsGGCAAQ43G2h3NSdhYRluDPQM7Gf47Gf57Gf66orf5Kf7eZ/5Ky4o941DJG0YYIABDjcbaHc1J2FhGW4MWt/AfmvXfnvXfou3rvhN7zLU+5av/bavXxwiccMAAwxwuNlAu6s5CQvLcGPQegb2d/rs7/VNfLJvffGzv+dnf9fP/r6fXxwiecMAAwxwuNlAu6s5CQvLcGPg3sCemcOeocOeqaOu+NkzeNgzebj6Rm8kOrSFDQMMMMDhZgPtruYkLCzDjYE7A3suXntOXntuXu8bvQ91987Za8/dq33MzAIGGGCAQ/MMtLuak7CwDDcG4TWoqvxajm0+JPN6jq1/tS/18d6yMWWRXMopUj9WZgEDDDDAITgD7a52R0JCwpuxsbGd624HAoFh8fHxXcw2xly/N5THZGEZbgzCY1BRdlUOLNsu6d2G1xe/Kc8OlB3pa6SksFL9GJkFDDDAAIfQDMLX5ILPnabg9TUFMMuUvYfsHeb2A+Z2hr1uLjuY+9eE8sAsLMONQcsMSgurZOestZL23KD64jez6zDZv3SbVwq1j41ZwAADDHBomUE4C11IMSVvfl0BNKVvhCmBPRr8WUkoj8nCMtwYhGZQmFssmyZ8Kqk/711f/OZ1Hy1Zmw56bwNrHxOzgAEGGOAQHoNw9biQ07AAmsupZnupwZ8Vt2/f/u5gH5OFZbgxCM7g/LHzsnpkuox/uEdN8eucKEsHT5Iz+06pHwezgAEGGOAQfoNwdrmQctMrgDMCgUDXuj8zt8tjYmLuCvYx7cJWV9ccoB83e+wYYHA7gytXvpHTe07I4oGp9a/22QL42UezJT87X33/mQUMMMAAB3cG4exyIaWRt4AT6/7M3C4L5TGFENJk/vLnv0jenmOysOeY+uI36ck+sueT1fLvX17T3j1CCCGtkHD1uJBzUwH8iX0V0F6PjY01d8dvCOUx7YH5vdljgMHNBhWl1bJv8ecy4zfv1Be/qc+/Lbvnrpey4ivq+8ssYIABBji0nkE4u1zQCQQCb5mSd9ZsC8z1R2rvSzIlsJvZkuPi4gKhPK5dWHuA2u+x8/kGDCLBoORShWybsUomP92/vvh98q8j5ODKXVJZfk19P5kFDDDAAIfWNwhroYuUsLAMt98N7KnYzh/Lkx1TlsiEx3vVF78FvZLkxNajEXWqNmYBAwwwwKH1DbS7mpOwsAy3Hw1sqcs9miNbJi/zfrOvrvQlP5goy38/Vc4dOqu+j8wCBhhgoL3hQAGM2o3h9o+BLX222G1OXSzTf/3tZ/vsNu2FIbJr2nK5ePqS+n4yCxhobxhggMONBtpdzUlYWIY7mg3sDzKf3X/aOw+vLXkNS9/0LkO9Mljzat83UWvALGCAAQY4tMxAu6s5CQvLcEebgS19p/dky4ZxC7xv7jYsfTN/O8x729e+/dvws33RZsAsYIABBjiEz0C7qzkJC8twR4NBZcXXcmr3cVk3dp6kPTvwhtKX3m24bJ26QvKy8pr8Qkc0GDALGGCAAQ5uDLS7mpOwsAx3WzWorLgmJ3dmydrRc2TyL/vfUPpmvfyebJu+Ss4fvxDVBswCBhhggIN7A+2u5iQsLMPdlgzsb/Gd2HZU1nw4WyY91e+G0jf7lZGyI32N5GcXRLUBs4ABBhjg0LoG2l3NSVhYhjvSDSrKrsqxLYdl9ch0mfhk3xtK35zXP5Kds9ZKQQu/vRvpBswCBhhggIOegXZXcxIWluGORIPy0q8ka+NBWTlihqQ+8dYNpW9u99Gye856uXj2clQbMAsYYICB9oYDBTBqN4Y7cgzKS6rl6Pp9smLYNEl9vPe3pa9zoszvOVa+mL9JCnOLo9pAe8MBAwwwwOFWA+2u5iQsLMOtaVBW9KUcWbtXlg1NkwmP9brhjBwLeifJ3kVb5PL50qg2iKQNBwwwwACHWw20u5qTsLAMd2sblF6+IodX75algydLyqNvNih93WVR3/Gyb/FWKcovj2qDSN1wwAADDHC41UC7qzkJC8twt4ZBSWGlHFyxU5YMmijjH+5RX/rs9U/7p8iBZduluKAiqg3awoYDBhhggMOtBtpdzUlYWIbblYEtdAeWbvcK3s2lzxZBWwhLLlWqHz9zgAMGGGCAw3cZaHc1J2FhGe5wGhRdKPPewl3YJ9l7S7eu9Nm3eu1bvvatX/sWsPYxMwc4YIABBjg010C7qzkJC8twt9TAfkljz8LNsqBXkvfljbrSZ7/UsfydNO9LHvbLHtrHyRzggAEGGOAQioF2V3MSFpbhDsXA/hyL/VkW+/Ms9mda6kqf/fmWFe9Ok8z1+72fddE+NuYABwwwwACHlhpodzUnYWEZ7uYaXDp32fsBZvtDzA1/mNn+UPOq92ZK1qaD3g84ax8Pc4ADBhhggEM4DbS7mpOwsAz3dxnYU6zZU63ZU641LH32lGyrR34ixz8/7J2qTfsYmAMcMMAAAxxcGWh3NSdhYRnumw3yTxbIjvQ1MvuVkTeUvslP95PPPpotJ7ZnSmX5NfX9Zg5wwAADDHBoDQPtruYkLCzDbY/9y8Iy2T59lcx6+b0bSt+UZwbI2jFz5OTOY1JZEV2ljznAAQMMMMChOQbaXc1JWFj/Dbf91q5963abKXxLB0+Sqf/y9g2lL+3ZgbL+43lyavcJU/q+Vt9f5gAHDDDAAAdNA+2u5iQsbPQOd1XVN1KYU+x9OWNr2nJZPDBV0p4bdEPZq9tmdBkqG5MXyJm9J6Wq0h+lzy9zgAMGGGCAQ8sMtLuak7Cw0THctuxdPFvo/fzKlsnL5NN+KTL5l/0bLXtpzw/yzsSxddoKObb5kFw+XxIVBswBDhhggAEOLgy0u5qTsLBtb7ht2Ss4ddH7geXNqYtlYZ9x617DfgAACp9JREFUMunJvo2WvWkvDJFlQybL9hmr5fjnR6ToQmlUGDAHOGCAAQY4tJaBdldzEhY2sofbvh17ITvfO4XaxpRFsqDXxzLxiT6Nlr3pv37HO/PGjk8+k+ztmd65eKPBgDnAAQMMMMBB00C7qzkJCxs5w22/ZXv+2Hk5uGKnbBi3QOb1GOOdWeOWstc5UWZ2HeadcWNXxjo5ueu4lBRWRoUBc4CD9oYBBhjgcLOBdldzEhZWZ7jt7+jlHs2VA0u3y7qx82Ru4ihJefTNW8qePbduerfh3pk2ds/dIKf3ZEtp0ZWoMIikDQMcMMAAAxyaMtDuak7CwrofbnumjJzD52Tf4q2ydlSGZLz2oaQ80rORstfd+x0+e4aNPQs2yZl9p6Ss+MuoMIj0DQMcMMAAAxyaMtDuak7CwoZ3uMtLquXsgdOyd9EWWfPhLO9sGuMf7nFL2bP32T+zZ9awf/fcwTNq59HlCY4BDhhggAEOTRtodzUnYWFDH+6yoi+93837Yv4mWf1+unzyryO8V/FuLnv21T57Ll17Ro39S7Z5rwZG0vlzeYJjgAMGGGCAQ9MG2l3NSVjY5g136eUr3pkxds9ZLyuHT5f0F9/1voxxc9mb8Fgvmdt9tHcmjQPLd0heZm7EnzeXJzgGOGCAAQY4NG2g3dWchIW9dbhLLlXKyZ1ZsnPWWlkxbJrM+M3vG/3ZldSf95b5PcfKhuQFcmjlLjl//EKbPHUaT3AMcMAAAwxwaNpAu6s5iV8X1v6Ysn0LtzDnslw8ckZ2pK+RZUPTZHqXoY2WvYm/6CMLeifJppRP5fCaLyQ/uyBqTpnGExwDHDDAAAMcmjbQ7mqNJhAIDIuPj+9itjHm+r3B/v/b8sLaAmZ//+7imULJOZIjJ3cek6Pr93mfs7Ov3m2ZtNT73J19FW9Rv/He5/Dsq3mTn+4vyQ/d+lm9um3SU/1kYZ9k2TxxiRxdu1cKTl/yCqP28boc7rY8BxjggAEGGODg0sBFf2tRTOF7ICEhIcNeN5cdTAlcE+xjaC+s/fHj4oJy79Rm9puwJ7ZnypHP9njfjLWvym1KXex9U9a+OrfwrXGS8eoH3qt0E5/s6/1GXlMl7nab/RbulGcG1Pyg8pBJ8vmUZZK5Yb9cOnc5qsteU8OtPQfaGwY4YIABBjg0ZRD+BtfCmNI3wpTAHnW3TQEsCfYxwrGw9hut9hyzF07ke79dd/zzw3Jo1W7Zs2CzbJuxSjaOX+j9tt3SwZO8U5nNevl9mfrCYO8zdKEWuLovXKQ9P0g+eWmEd9aMJYMmej+YbM+isXXaCu+Hk+1ZNY5tPuT9gLI9y0ZhbrH3Uy11JY/hxgADHDDAAAMcvssgvO0tDDGFb6rZXmpwu7h9+/Z3B/MYdmGvXPnGK0W2HOVl5XllKWvTQa882RK1deoKWZ803ytXtmTZsmXPTpH23KBGz14RzJb6xFsy7YUhXim05XDp4Mmy5oNPvPPe2vJoS6Q9D+7xz4/I2f2nvZJpy2a4fkaF4cYAAxwwwAADHL7LIPwNroVJSEiYEQgEuja4XR4TE3NXc/6/Yx94tUPST984lPbswEZ/qLi5m30bdtJTfb23Ze3bswv7jJPl76R5Z7zYnLpYdn6yRvYt/tz7LF32jkzJOXRGCk5flJKLFVJVec2D1dyqq2uG215q7wsGGGhvOGCAAQY43GrgrsmFmNq3gBMb3C5r7v939E9+90/jfvrGH22JS/rZG38y25Wkn71+3lweMZefm3K41Gwzk376+sdJD7wxNOmB17on/e/Xu3z8s1cfHf3Aq//80f9+veOw//e3f/PRHXd838nBEUIIIYSQW2MK30/sq4D2emxsbLzJhmD+/0P/n1f+2m7m6vec7CAhhBBCCAl/AoFAkimB3cyWHBcXF9DeH0IIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgiJ8gQCgWHx8fFdzDbGXL9Xe3+0kpCQ8GZsbGxn7f3Qiln7t8zWw8zBkk6dOt2vvT9aMQYvG4Nfmy3NzMQvtfdHM9bAr/9MMGv/T+biB+3bt7/br6fXvP/++zuZGRhrjv9FMwddtfdHIx1NzCyMuueee/5ae180Y+bgCTsHxqKnufwH7f3RiDHoZbbXzfaeMfhv2vvT4pgn9QNmQTPsdXPZwRzYGu19UsidxqGvOf4sc/wPae+MRswwP133pDaXLxiHjdr7pBH7LzwzB6fsdePwlJ0J7X3SinlO/LOZgwvmP4ru094XjZhjzzbrX222tTExMe2090cj5th32wJsj994bNbeH42Y58Ej5tj/r7G4arbL5nqpeU78WHu/WjPt2rX7kTnu/nW37X8UaO6PRswc/C9z3On2un1OmOvLtPepxTEDPcK+6lN32xxUieb+aMYc+3y/FkBz3APMHEyz183l/zS3T2rvk1buu+++v7WX9r/yjMUH2vujFPsfRf9iC4BfC6A59le190EztvjY8tvgrjvVdkYx9t2AO2qP3RYh4/KK8i5p5E4zC6fNPwv+sUOHDv/ZvmCivUOtHTMH7xiD4Q1u52juT1hiDmKq2V5qcLvYtlvNfdKKnwugyQ/Mk/tv7JXat4FTtHdIMX9l3+owBnPv8Om/9MwM/MZc/NAYfOHjAphsXxm3/9Dv2LHj/9Den9aOOe4h9p0AMwvPmcvexuJn2vukHVsCzMX3tPdDI7X/TPyD2dabm3+lvT+tndqPSNW/IGCeH1/Z/yDQ3KcWxxzEjIaf7TC3y2NiYu7S3Cet+LwAeql9qf8zv3/excY8F7qZbZ32frR2zD8P/r728293+LkA3lH7L/ra58Rh7Z1p7Zhj/r1d/9qb37dviavukHLM8T9jnhvPa++HRsx/AP3H2s+C/tRcHjXbLO19au2YY/8vdcdtXwk1/4z89zbflWrfAk5scLtMc380QwG843v2SV73FqjfY57khiP+ut8+/2Xf+qzdXjNbrvnnw2D7to/2frVm7OdgzbFPrL1py8//p7pDCrH/AWTWfmHdbT+/O2RjPHaaIvRftfdDI/aLH/b7ArU3vXcG/PjvCVv8zLE/az8DakwytfenxTEH8RP7KqC9XvsvvA3a+6QVvxdA+yTv1KnTPfa6/Va49v5oxBqYY19lr9tZsB/4Nle/r7xbavHrK4CmAD5W90F/85z478Zhu/Y+tXZqv/ixrfbmD8z1E6o7pBv7Gbg/mssfau+IRszav2GO/+cNbtsvgfjqbWBTgOPMcX9ir9t/Npjbb2vvU1hiDiSp9u2uZL/+3IF9f98s7lmzLbAfftben9ZO7Sse/2aO/0rtNl97nzRiC7D9mn/t8yHD/hef9j5pxf4cjn1HwL4Sdu+99/6d9v60duxnYe27I2YeRvvtVeC61P7kRX/j8K59sUB7f7TSsWPH/2SOv1B7PxTzQ/tzcfYLMPZ54bdvQdvYt3vt88Bsv7MW2vtDCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCERnv8fHnjwTao+i18AAAAASUVORK5CYII=\">"
],
"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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\">"
],
"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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nO3dbYic53kvcCd2fIqi0CbVVmWlI2l3XlqahNCCDbJLCKWFpq86cqtYpEojoTQnhBRaOVXioL4pyKKQD7Ejt7VOTlqc0g9FdatQREuJD/pS+oLTlJIDBTtBa0mQqgXH56jQD9lz3asZeyTtLWnGc+vS8fP7w5N55tnNMPO7rnX+3tnd3HWXiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIzJDBYPDhOD4Yx6f6/f7Wci1uD8f93XEcHV8TERERkddBotz9UJS83y3nCwsLG+P8j+PazuFweLJci9stce1U7rMUERERkbklyt3Ho+R9cuL+18r9KIEHJ66t5Dw7EREREZl7ouh9JI5fH9+P8vdvUfg+H8fe8bU4P1e+O5jzDEVERERkrun1et8TBe/3y/ny8vI7owD+nzj+R5TCPePPifsXFhcXN0z72N/+9rdXRURERGT9zLPTTZ1S/KIE/lTc3hdl7+9GbwEfGH887p+f5XHLC7t06Vur//qv3TzKa2fAgAEHBgwYcKgZzK/NTZkoer0of79XzksBjPu/Um7j2pOja3E6OD3LY5fBlhf4zW928yivnQEDBhwYMGDAoWYwz043Vcpbu1H6PhHHL5Q//TK+HufHhsPhw3Ec7/V6/Vke22AtNwMGHBgwYMChbjC/RncHxWAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMDh1ePs02dWV56/+IrBuDP95s6ff9uxnfs/nNnb5pYuDtZyM2DAgQEDBhzWO0r5e+zB/atP7TuyVgLHBbCUv8ce2P9c+djrogR2bbCWmwEDDgwYMOBQO0rpK+XvlRL4wsXVyfJXbsv97P72mtO1wVpuBgw4MGDAgMONjskS+MSuQ6vHHtj/jbTyNxgMfqzX671vOBx+qN/vv71ci9vDcX13HEfjfOssj9vFwVpuBgw4MGDAgMONjlICS/lbK37lbd8ogbe9/G3atOktUfI+Nr4f55+OwrczyuDJcj9ut8S1U7M8dlcHa7kZMODAgAEDDrXjjiiAkXuj5P3T8vLyO7ds2fLdUf4+GvcfjduD40+IArgyywN3dbCWmwEDDgwYMOCw3nFHvQVc3v6Nknc5jj+Pu/fG7eNx7B1/PM7PLSwsbJz2cbs4WMvNgAEHBgwYcFjvuKN+CWTHjh3fUd72jRL4QNz+bb/ff2o4HH4ubveMPyfuX1hcXNww7WOXwV66dGXIXTzKa2fAgAEHBgwYcCjH2S+euar8ldde+lLKn4EZ/eLHztHdu6ME/q+49sm4dmDic87P8tirIiIiIvJKnnvm2dXLL738yv1xZ7rtfwg6Ct/+KHg/OnH/08vLy/fF7ZPlfpzH6eD0LI9dXliXmr1/u2HAgAMDBgw4TGMwrz43S+4pf/Iljn3lFz9K+SsX4/xYFMOH4zje6/X6szxwGWx5gdnvufv5BgYM8g8ODBgw4HC9wXwr3R0Sg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBdldrEoO13AwYcGDAgAGHukF2V2sSg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBdldrEoO13AwYcGDAgAGHukF2V2sSg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBdldrEoO13AwYcGDAgAGHukF2V2sSg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBdldrEoO13AwYcGDAgAGHukF2V2sSg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBdldrEoO13AwYcGDAgAGHukF2V2sSg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBdldrEoO13AwYcGDAgAGHukF2V2sSg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBdldrEoO13AwYcGDAgAGHukF2V2sSg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBdldrEoO13AwYcGDAgAGHukF2V2sSg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBdldrEoO13AwYcGDAgAGHukF2V2sSg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBdldrEoO13AwYcGDAgAGHukF2V2sSg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBdldrEoO13AwYcGDAgAGHukF2V2sSg7XcDBhwYMCAAYe6QXZXaxKDtdwMGHBgwIABh7pBWknbERkOh7+1efPmN09e7/f7hweDwe44jsb51lke22AtNwMGHBgwYMChbjCfNjdDoty9J0ref0QJ/Pc4vhHnL8bx7jg/WT4et1vi/qlZHttgLTcDBhwYMGDAoW4w31Y3RaLcPRQ395bzTZs2vSUK4b4ofY/G7cGJz1mZ5bEN1nIzYMCBAQMGHOoGc6pzry1R9D4eN2+I28fj2Dtx/dzCwsLGaR/PYC03AwYcGDBgwKFuMNciN0ui5P1kv9//mXI+HA5PxPme8cfi/oXFxcUN0z5mGeylS1deYBeP8toZMGDAgQEDBhxqBvPscjMlSt5f79ix43tH5+Ut4AMTHzs/y2OuioiIiEg18+pxs+beKHn/Gbf3lDtxfn/5LmA5X15eHkROz/Kg5YV1vdkzYMCAAwMGDDjUDObY5abPjh07visK39cnr/X7/WNx7eE4jvd6vf4sj1sGW15g9nvsfr6BAYP8gwMDBgw4XG8wnyZ3h8VgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGAwPs4+fWZ15fmL1zmUa+Vj2c8vYxeyu1qTdHXBJwfLgAEDDgwYMLhS/h57cP/qU/uOrBW+scPKCxfXrpWPda0EKoCv06OrX+QMGHBgwIDBtUcpfeOit1YCo/hdfunlq6+NvjvYlUMBfJ0eXf0iZ8CAAwMGDNY7JkvgE7sOrZ546JHOlr/xLmR3tSbp6oJPDpYBAwYcGDBg8OpRil4pf6X4jYtgF8vfeBeyu1qTdHnBx4NlwIABBwYMGLx6KIBX70J2V2uSLi/4eLAMGDDgwIABgyuHt4Cv34XsrtYkXV3wycEyYMCAAwMGDPwSSG0Xsrtak3Rxwa8dLAMGDDgwYMDAn4Gp7UJ2V2uSLi74tYNlwIABBwYMGFw5/CHo63chu6s1SVcXfHKwDBgw4MCAAQMONYPsrtYkBmu5GTDgwIABAw51g+yu1iQGa7kZMODAgAEDDnWD7K7WJAZruRkw4MCAAQMOdYPsrtYkBmu5GTDgwIABAw51g+yu1iQGa7kZMODAgAEDDnWD7K7WJAZruRkw4MCAAQMOdYPUorZ9+/alwWDw6V6v975+v7+nXIvbw3FtdxxH43zrLI9rsJabAQMODBgw4FA3mG+jmzLD4fDLCwsLGxcXFzdF4fuLKHw749rJ0ce2xLVTszyuwVpuBgw4MGDAgEPdYL6NbopE2XtPlLxnJi7dG/cfjesHxxeiAK7M8tgGa7kZMODAgAEDDnWD11zkZk2UvUNR8L4Uhe+n4/bDvV7vwbh9PI6948+J83PlO4TTPrbBWm4GDDgwYMCAQ91gvq1uikS5+7U4nh3dfWOcfyVK4efGPwtYEvcvLC4ubpj2sctgL1268gK7eJTXzoABAw4MGDDgUDOYW6GbNlHuHo6y94fj++W7fXEciWsHJj7n/CyPvSoiIiIi1cyjy82U0S9+/OXo7t1x/tzy8vJ9cftkuRDncTo4PctjlxfW9WbPgAEDDgwYMOBQM5hboZslUfA+GMfH+v3+J4bD4f3lWpwfK98djON4r9frz/K4ZbDlBWa/x+7nGxgwyD84MGDAgMP1BvNtdHdIDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoGqUVtOBy+K27uXlhY2Njv93vlWtweHgwGu+M4GudbZ3lcg7XcDBhwYMCAAYe6wVwL3bSJkveVKIGX4nhmcXFxUxS+nXF+snwsbrfEx0/N8rgGa7kZMODAgAEDDnWD+Ta6KRMl7wPX3H80SuDB8f0ogCuzPK7BWm4GDDgwYMCAQ93gtXa415QofMd7vd57o/R9YseOHd8fhe/xOPaOPx7n58rbw9M+rsFabgYMODBgwIBD3WC+jW76vKH8x6ZNm94SZe9vohB+LsrgnvEH4/6FxcXFDdM+aBnspUtXXmAXj/LaGTBgwIEBg7NfPLO68sLF6wzKtfKx7OdnF/IM5lnmpkqv19sVBe8zo7tvjAJ4Oe5/MgrggfHnxP3zszz2qoiISMfz3DPPrj724P7V/7n/N1Yvv/TyK9fLeblWPlY+R7qZuZS5WRIF8EeWl5fvK+dLS0vfFwXwr8r9uH2yXIvzOB2cnuWxywvrerNnwIABBwbdNijf5Xtq35G1olduX/z6xbXyN3lt/N3BLh1d3IX1DObZ6aZO+YWP8h2/KHq/XX4LeHTt2HA4fHj084H9WR63DLa8wOz32P18AwMG+QcHBl02WHn+1RL4xK5DqyceeuTV8hcfy35+diHPYL6N7g6JwVpuBgw4MGBw5ShFr5S/UvzGRbCr5a/ruzBpkN3VmsRgLTcDBhwYMLhyKIB2YT2D7K7WJAZruRkw4MCAgbeA7ULdILurNYnBWm4GDDgw6LrBZPkb/8LHdb8E0sES2MVdWM8gu6s1icFabgYMODDousHZp89cVfTGBpO/HVw+J/t52oUcg+yu1iQGa7kZMODAgMGVEjj+Lt+kQbnWxfLX5V241iC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6utZTAYfLbf728t53F7OO7vjuPo+Nq0MVjLzYABBwYMGHCoG8y3yc2QKHk/GGXvX5aXl7fF+c7hcHiyXI/bLXH91CyPabCWmwEDDgwYMOBQN5hvm5s+90bp+9koe18uBTBuH437B8cfjAK4MsuDGqzlZsCAAwMGDDjUDeZX5WZIlL2fi5t7xgUwCt/jcewdfzzOzy0sLGyc9nEN1nIzYMCBAQMGHOoGcy100yTK39uj+L2rnEfRe3ZpaWl73D8R1/eMPyfuX1hcXNww7WOXwV66dOUFdvEor50BAwYcGDBgwKFmMM9ON1Wi3H1gdPxiFMCvRfH71bg9ErcHJj7n/CyPvSoiIiIi1cyv0b2GlO8Ajn4G8P44f7Jci/txOjg9y+OVF9b1Zs+AAQMODBgw4FAzmG+TmyH9fv/95Tt9cXxm69atb4v7x8rPAcb9471erz/LY5bBlheY/R67n29gwCD/4MCAAQMO1xvMu8/dETFYy82AAQcGDBhwqBtkd7UmMVjLzYABBwYMGHCoG2R3tSYxWMvNgAEHBgwYcKgbZHe1JjFYy82AAQcGDBhwqBtkd7UmMVjLzYABBwYMGHCoG2R3tSYxWMvNgAEHBgwYcKgbZHe1JjFYy82AAQcGDBhwqBtkd7UmMVjLzYABBwYMGHCoG2R3tSYxWMvNgAEHBgwYcKgbZHe1JjFYy82AAQcGZ58+s7ry/MXrDMq18rHs52cPOGQaZHe1JjFYy82AAYduG5SC99iD+1ef2ndkrfCNDVZeuLh2rXysayWwi3vAoW6Q3dWaxGAtNwMGHLptUErfuOitlcAofpdfevnqa6PvDnbl6OIecKgbZHe1JjFYy82AAQcGkyXwiV2HVk889Ehny1+X94DD+gbZXa1JDNZyM2DAgUE5StEr5a8Uv3ER7GL56/oecLjeILurNYnBWm4GDDgwKIcCaA84rG+Q3dWaxGAtNwMGHBh4C9gecKgbZHe1JjFYy82AAYduG/glEHvA4cYG2V2tSQzWcjNgwKHbBv4MjD3gcGOD7K7WJAZruRkw4MDAH4K2BxzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoGqUWt3++/fzAYPBTHZ4fD4U+Mrh2O+7vjOBrnW2d5XIO13AwYcGDAgAGHusF8G90U2b59+1KUvq+W816v9+Nx/g9R+HbG7clyLW63RAk8NctjG6zlZsCAAwMGDDjUDebZ6abOtm3b3lpuo+h9Ksrfb0TpezRuD44/HtdXZnlcg7XcDBhwYMCAAYe6wby63Kx5U6/Xe18Uvc9H8fsvcft4HHvHH4zzcwsLCxunfVCDtdwMGHBgwIABh7rBfOvcjBkOhw/H8WdxfC6K4J6J6xcWFxc3TPt4ZbCXLl15gV08ymtnwIABBwYMGHCoGcy3yc2Y5eXlQeTbcRyJAnhgfD0K4PlZHm9VRERERKqZX4ubMlHuPhSF70/Kedy+O44XowjeF7dPlmujUnh6lscuL6zrzZ4BAwYcGDBgwKFmMM9ON1WWlpY2R8H74Ojt35O9Xu8d5Xq/3z82unY8rvVneewy2PICs99j9/MNDBjkHxwYMGDA4XqD+ba6OyQGa7kZMODAgAEDDnWD7K7WJAZruRkw4MCAAQMOdYPsrtYkBmu5GTDgwIABAw51g+yu1iQGa7kZMODAgAEDDnWD7K7WJAZruRkw4MCAAQMOdYPsrtYkBmu5GTDgwIABAw51g+yu1iQGa7kZMODAgAEDDnWD7K7WJAZruRkw4MCAAQMOdYPsrtYkBmu5GTDgwIABAw51g+yu1iQGa7kZMODAgAEDDnWD7K7WJAZruRkw4MCAAQMOdYPsrtYkBmu5GTDgwIABAw51g+yu1iQGa7kZMODAgAEDDnWD7K7WJAZruRkw6LrD2afPrK48f/E6g3KtfCz7+dkDBhxyDbK7WpMYrOVmwKDLDqXgPfbg/tWn9h1ZK3xjg5UXLq5dKx/rWgns4h4w4HAjg+yu1iQGa7kZMOiyQyl946K3VgKj+F1+6eWrr42+O9iVo4t7wIDDjQyyu1qTGKzlZsCg6w6TJfCJXYdWTzz0SGfLX5f3gAGHmkF2V2sSg7XcDBhwuFICS/krxW9cBLtY/rq+Bww4rGeQ3dWaxGAtNwMGHBRAe8CAQ90gu6s1icFabgYMuu7gLWB7wIDDjQyyu1qTGKzlZsCgyw5+CcQeMOBwM4PsrtYkBmu5GTDosoM/A2MPGHC4mUF2V2sSg7XcDBh03cEfgrYHDDjcyCC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gu6s1icFabgYMODBgwIBD3SC7qzWJwVpuBgw4MGDAgEPdILurNYnBWm4GDDgwYMCAQ90gtaj1+/2PxHFwMBj80dLS0vbRtcNxf3ccR+N86yyPa7CWmwEDDgwYMOBQN5hvo5sivV7vvXG8Y3S+Kwrfl6Lw7RwOhyfLtbjdEtdOzfLYBmu5GTDgwIABAw51g3l2uqkS5e6Xo/A9Uc7j9gei8H01jk+W7whOfM7KLI9tsJabAQMODBgw4FA3mFefmyV3Ly8vf2c5Gb0N/DtxfDaOveNPiPNzCwsLG6d9YIO13AwYcGDAgAGHusE8C91M2bRp01ui6P3p5s2b3zwcDk9EGdwz/ljcv7C4uLhh2scsg7106coL7OJRXjsDBgw4MGDAgEPNYL5tbvq8Icrfp7dt2/bWcicK36NRAA+MPxj3z8/yoKsiIiIiUs28itxMiYL3oaWlpc3lvPzm7/Ly8n1x+2S5H+dxOjg9y+OWF9b1Zs+AAQMODBgw4FAzmGefmyrlN3+jAH4rSt43R8cXyvV+v38srj8cx/H4nP4sj10GW15g9nvsfr6BAYP8gwMDBgw4XG8w31Z3h8RgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtNwMGHBgwYMChbpDd1ZrEYC03AwYcGDBgwKFukN3VmsRgLTcDBhwYMGDAoW6Q3dWaxGAtN4NuG5x9+szqyvMXr3Mo18rHsp+fXWDAgEO2QXZXaxKDtdwMumtQCt5jD+5ffWrfkbXCN3ZYeeHi2rXysa6VwK7uAirQfN4AAA0KSURBVAMGHOoG2V2tSQzWcjPorkEpfeOit1YCo/hdfunlq6+NvjvYlaOru8CAAYe6QXZXaxKDtdwMum0wWQKf2HVo9cRDj3S2/HV9Fxgw4LC+QXZXaxKDtdwMGJSiV8pfKX7jItjF8mcXGDDgsJ5BdldrEoO13AwYKIB2gQEDDnWD7K7WJAZruRl028BbwHaBAQMONzbI7mpNYrCWm0F3DfwSiF1gwIDDzQ2yu1qTGKzlZtBdA38Gxi4wYMDh5gbZXa1JDNZyM+i2gT8EbRcYMOBwY4PsrtYkBmu5GTDgwIABAw51g+yu1iQGa7kZMODAgAEDDnWD7K7WJAZruRkw4MCAAQMOdYPsrtYkBmu5GTDgwIABAw51g+yu1iQGa7kZMODAgAEDDnWD7K7WJAZruRkw4MCAAQMOdYPsrtYkBmu5GTDgwIABAw51g+yu1iQGa7kZMODAgAEDDnWD7K7WJAZruRkw4MCAAQMOdYPsrtYkBmu5GTDgwIABAw51g+yu1iQGa7kZMODAgAEDDnWD7K7WJAZruRkw4MCAAQMOdYPsrtYkBmu5GTDgwIABAw51g+yu1iQGa7kZMODAgAEDDnWD7K7WJAZruRkw4MCAAQMOdYPsrnbXcDj8peXl5R8e3+/3+4cHg8HuOI7G+dZZHtNgLTcDBhwYMGDAoW4wvyY3fe6NgvfRKIB/H2Xv3eVC3N8Z90+W87jdEtdPzfLABmu5GTDgwIABAw51g3kWupkSJe8L4wIYpe/RKIEHJz62MstjGqzlZsCAAwMGDDjUDebV42bOZAGM28fj2DvxsXMLCwsbp31Mg7XcDBhwYMCAAYe6wTy73Ey55juAJ/r9/p7xx+L+hcXFxQ3TPmYZ7KVLV15gF4/y2hkwYMCBAQMGHGoG8+xyM2Wdt4APjD8W98/P8pirIh3Nc888u3r5pZevu16ulY+JiIiUzKvHzZxrCuD95buA5Xx5eTkuD07P8pjlhXW92TPonsHZL55ZfezB/atP7TuyuvLCxVcMXvz6xbVr5WPlc7Kfp11gwIABh3yDeXa5qdPv9z8SJe+f4/iDOH/P6NqxKIEPx3G81+v1Z3ncMtjyArPfY/fzDQxu57Hy/KtFb1wCy3f+rroWn5P9PO0CAwYMOOQbzLXQ3SkxWMvdVYPJEvjErkOrJx56pNPlr8u7wIABAw43Msjuak1isJa7ywal6JXyV4rfuAh2tfx1fRcYMGDAoWaQ3dWaxGAtd5cNFEC7wIABAw43M8juak1isJa7qwbeArYLDBgw4HArBtldrUkM1nJ30cAvgdgFBgwYcLhVg+yu1iQGa7m7aHD26TNXFb2xQSmCr/wZmPic7OdpFxgwYMAh3yC7qzWJwVrurhqUgjf+Lt+kQbnWxfLX5V1gwIABhxsZZHe1JjFYy82AAQcGDBhwqBtkd7UmMVjLzYABBwYMGHCoG2R3tSYxWMvNgAEHBgwYcKgbZHe1JjFYy82AAQcGDBhwqBtkd7UmMVjLzYABBwYMGHCoG2R3tSYxWMvNgAEHBgwYcKgbZHe1JjFYy82AAQcGDBhwqBtkd7UmMVjLzYABBwYMGHCoG2R3tSYxWMvNgAEHBgwYcKgbZHe1JjFYy82AAQcGDBhwqBtkd7UmMVjLzYABBwYMGHCoG2R3tSYx2G4ut/8fXHvAgQEDBhxuzSC7qzWJwXZvuUvBe+zB/atP7TuyVvjGBisvXFy7Vj7WtRLYxT3gwIABAw63ZpDd1ZrEYLu33KX0jYveWgmM4nf5pZevvjb67mBXji7uAQcGDBhwuDWD7K7WJAbbzeWeLIFP7Dq0euKhRzpb/rq8BxwYMGDA4eYG2V2tSQy2u8tdil4pf6X4jYtgF8tf1/eAAwMGDDjc2CC7qzWJwXZ3uRVAe8CBAQMGHG5ukN3VmsRgu7nc3gK2BxwYMGDA4dYMsrtakxhs95bbL4HYAw4MGDDgcOsG2V2tSQy2e8vtz8DYAw4MGDDgcOsG2V2tSQy2m8vtD0HbAw4MGDDgcGsG2V2tSQzWcjNgwIEBAwYc6gbZXa1JDNZyM2DAgQEDBhzqBtldrUkM1nIzYMCBAQMGHOoG2V2tSbo4WD//dv1yd3EPGHBgwIABh1sxyO5qTdK1wfoN2PWXu2t7wIADAwYMONyqQXZXa5KuDdbfwFt/ubu2Bww4MGDAgMOtGmR3tSbp4mD9v2Bcv9xd3AMGHBgwYMDhVgyyu9q66ff7hweDwe44jsb51pt9/rGd+z/8mzt//m3j+139+Tf/P7hXL7cvcAYcGDBgwGF9g7ZNboZE4ds5HA5PlvO43RIl8NSNPr+Uv7XC88D+58YlsKs//6YAXr3cvsAZcGDAgAGH9Q1uR6ebKlH6Ho0SeHB8Pwrgyo0+v5S+Uv4mS2AXf/7NW8DXL7cvcAYcGDBgwGF9g/aNbspE4Xs8jr0T988tLCxsvNF/Z7IEHntg/ze6Vn78Esj6y+0LnAEHBgwYcFjfoH2jmzLD4fBEv9/fM3H/wuLi4oab/fdKCSzl75W3P//bobUiVF7k6/04+8UzV5W/S5euLPeLX594Gzw+J/t53s5jbFBus58LAw7ZBwMGDDhca9C2zc2Q0VvABybun7+V/961BbCcT/5iyOs91/4izDhrLvGxjOckIiIickuJwnd/+S5gOV9eXh5ETt/sv3PtW8CvFMGJXwwRERERkTs4/X7/WJTAh+M43uv1+jf63PV+CWS9a7fruYuIiIhI46z3Z2BKrvquoLdARURERF5f8fNvIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiK3If1+//BgMNgdx9E435r9fLIyHA5/aXl5+Yezn0dWYvYfieNg7MEfLS0tbc9+PlkJg/eHwUNxfDZ24ieyn09mikFX/5kQs39X3Ny9sLCw8Wb/95qv12zfvn0pduDT8frfF3uwJ/v5ZGRHJHbhtzZv3vzm7OeSmdiDHyt7EBYfitt3ZD+fjITBh+P4YByfCoP/mv18XnPii3pnDPRkOY/bLfHCTmU/p4TcGw4fjdf/9/H63539ZDISy/ze8Rd13O4Khy9lP6eMlP/Biz34ajkPhx8vO5H9nLISXxM/GHvwL/EvRduyn0tG4rV/JeZ/KY5nFhcXN2U/n4zEa/9yKcDl9YfHX2Q/n4zE18F74rX/R1j8exzfiPMX42vivuzndTuzadOmt8Tr/tj4fvmXgsznk5HYgx+K1/275bx8TcT5H2c/p9ecWOhHy3d9xvfjRa1kPp/MxGv/QlcLYLzuX449eKKcx+0PxP1/zH5OWdm2bdtby235t7yw+PXs55OU8i9FP1sKQFcLYLz2D2Q/h8yU4lPK78Sle9OeTGLKuwF3jV57KULhsi/5KWXk3tiFf4p/Frxzy5Yt312+YZL9hG53Yg8+HgafnLj/tcznM5fEi3g8jr0T98+Vdpv5nLLS5QIYuTu+uL+znIzeBv6d7CeUmDeVtzrC4PN3dfR/9GIHfi5u7gmDZztcAI+X74yXf+jv2LHj+7Ofz+1OvO5D5Z2A2IWfjtv/HhYPZj+n7JQSEDdvyH4eGRn9M/FyHH8ed9+U/Xxud0Y/IvXKNwTi6+Pfyr8QZD6n15x4EScmf7Yj7l9YXFzckPmcstLxAriW0bf6/7TrP+9SEl8LD8fxZ9nP43Yn/nnw9tHPv93V5QJ41+h/6EdfE3+T/WRud+I1/1qZ/+juG8tb4qlPKDnx+n8yvjZ+Jvt5ZCT+Beg7Rj8L+kDc/m0cv5/9nG534rV/z/h1l++Exj8jX/7/viuN3gI+MHH/fObzyYwCeNcbyhf5+C3Qrie+yINj8O2u/fxXeetzdPxiHP87/vnwq+Vtn+zndTtTfg42XvtnRndL+fm/qU8oIeVfgGL2fzi+3+V3h0rC46+jCH1v9vPISPnFj/L7AqO7a+8MdPF/J0rxi9f+U+VnQMPk77Kfz2tOvIj7y3cBy/nof/BOZz+nrHS9AJYv8qWlpc3lvPxWePbzyUgxiNf+J+W87EL5ge84fWPy00pLV78DGAXwR8Y/6B9fE98XDn+V/Zxud0a/+PGXo7t3x/lzqU8oN+Vn4P4zbu/JfiIZidnvj9f/oxP3yy+BdOpt4CjAvXjdv1fOyz8b4v6vZD+nuSReyLHR213Hu/rnDsr7+zHcf47jD8oPP2c/n9ud0Xc8vhWv/5uj4wvZzykjpQCXX/MffT2cLP/Gl/2cslL+HE55R6B8J2zr1q1vy34+tzvlZ2HLuyOxD7/dte8CjzP6kxcfC4dPlG8WZD+frOzYseO74vV/Pft5JOae8ufiyi/AlK+Lrv0WdEl5u7d8HcTxC8Ui+/mIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiNzh+X+FgN4h9dzkWwAAAABJRU5ErkJggg==\">"
],
"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": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Plotting broken lines\n",
"# TODO"
]
},
{
"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": [
"<div id='976f49ad-ac9c-4ac2-87e8-976edcdcf9e1'></div>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# You can use \"x\" and \"y\" keywords if you wish, to specify data\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" y = [i**2 for i in x]\n",
" figure.plot(x=x, y=y, line=False)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"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": [
"# 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": 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nO29eXQV173vWbm3X/5I56ZXd9vrrkWy7o1B8N7q19139Xr90suJceJgx3biODZxsB3HE2DAgDG2wYAxeMCAEPMkRjOJGYQQ8wxmEjOIGSEQmsVgY6fffe/e+zrZXXsfSQgsVR1Jp85vV9Xnu9Y3SOEY7froW6e+p4a9HQchhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCKVXHTp06NG2bduHvF6TkZExqH379p1dj3C//lG6xoYQQgghhFKr77plro9bAI+6xe7hpl7kvuZB9zVz9Nfunz90X5ubviEihBBCCKGUyy10870KoFv6PnBLYPcGry9Pz8gQQgghhFAg8iuA7t9Ncf1ig+/L7r///u+nZ3QIIYQQQijlSuIM4PSMjIwuDb6vatOmzffSMzqEEEIR13dGP/injM8efOXZ0T99bdCon76ePeqnry1zvXH0z15bN+pnr+W6X892/+6jkQ+++srI/+eV/7PHf/pP/0560AiFXkleAu7a4PvKZP/tv/71rwohhBBqqP/2zX9RZ7YcVGuGTleTn3pbjf7Z683y2Ed6qOXvjFeHl21Rt6tuSm8OQt9Sa7tZWnRvAXTLXruGf+8Wvp/os4D667Zt27ovbb8u2X9bQ7h168/q5k18rzUX+MAHPvCJC58b179WJ7cdUcsGTFKZD3e7q9BNf26gWjF4qtoyZYU6sGKHOr7poDq9+4Qq3HXc/DcFq3epHbPWqNzhM9Xsl4d967+f132EOrB8m6qu/DK0fMJk+PjzSV1LC0hu2XvTLXRnXS9wv/6F+399x/262P36B/e8bpRbAl9wndmuXbuMZP99HRAN48YNfK81F/jABz7wiTqfmurb6uDKnWrG84PrC1vWIz3U0ncnmLJXWlTR7H+zovSGOrbxoMr7ZI6a8Hif+n934q/fUlunrlQVJddDwyeMho8/n1T3tdCJgHgHBD7wgQ98osrn+vVv1JH1+9X0596vL2i6BO6ev0GVX61J2c+prvxKHVm3Ty3oObL+5+hSuHP2WvN3tvIJs+Hjz0e6f4mLgHgHBD7wgQ98osin6MRlt5CNqi9k+rKtLmnXa74OdLvOF5xTS/qPb3Bp+X11YtsR6/iE3fDx5yPdv8RFQLwDAh/4wAc+UeJTU3VbbZ+Rq7J+8YYpYJOf7m8u/wZd/O71mb2Fau7rH9cXwZVDpjXrrCP5gU9r+Uj3L3EREO+AwAc+8IFPVPhcOVvilq5PTOHK7NhVrR+zUFWW3RTbRl069y7eosb/qnd9GT214yj5sTQ/UTIF0KEA+gUEPvCBD3yiwOdI/j41/rFE0cruMkid3X9afBvrXHKhTC3qMyZxNvChruYhEb8zkuQnvfmJmimADgXQLyDwgQ984BNmPrpIbZ60rP5S6+phM0XP+jU5zuvfqN3z1qsxP+9uxpnzVpYqL2n6kjD5SU9+omoKoEMB9AsIfOADH/iElY8uenUPXOh7/vYv3y6+XX7W9wbqS8F1TyRfOVNCfoTyE2VTAB0KoF9A4AMf+MAnjHxKL1epOa9+lLi37qm3rbrk6zv2oor6exUnPvlWo2MnP8HmJ+qmADoUQL+AwAc+8IFP2Pjos2Z65Q5doGa++IEqOV8mvj3NdVX5LbX8/SmJZeU69fzWwyHkJ7j8xMEUQIcC6BcQ+MAHPvAJE5/iwitqyu/eMcVpfo+RnvfR2W59/2L+qPlmW/S9gUfXHyA/AecnLqYAOhRAv4DABz7wgU9Y+OjJnfXlXvMQRb+xqqriS/HtaK31wyF6/WEzdc3D3dTRDQfIT0D5iZMpgA4F0C8g8IEPfOATBj7FhVfry9+Sdya0eIk1W7195pr6M4F6jWHyk9r8xM0UQIcC6BcQ+MAHPvCxnY++x2/qM+/Vlz+92of0+IPwtuzV9SWwcNdx8uNh9i9/PtL9S1wExDsg8IEPfOBjMx+9fFp2l8GmGC3snRm5M3/3esvk5WZbxz3aS1VfvEZ+mjD7lz8f6f4lLgLiHRD4wAc+8LGVjy57C3qOMoXo866fWDnBc6qt7wlcO+LzxPQ2v+mnik9fER+TjWb/8ucj3b/ERUC8AwIf+MAHPjby0UVo9bAZpghN+/1AM++f9JjT5Zrqr+uniMn+wyBVfqVafEy2mf3Ln490/xIXAfEOCHzgAx/42Min7n648Y/3UUUnL4uPN92urvxS5fQaWT/dTdQvfTfX7F/+fKT7l7gIiHdA4AMf+MDHNj6H1uy562EI6bFK8fnn239W03+fmPA696PZ4mOyyexf/nyk+5e4CIh3QOADH/jAxyY+elk0va6vLj0Hlu8QH6c0n8unLqtxj71peOxbslV8XLaY/cufj3T/EhcB8Q4IfOADH/jYwqesuEpNeTqxysemCUvFx2gLH71CiGaii/G5g2fFx2aD2b/8+Uj3L3EREO+AwAc+8IGPDXz0smg5b2WZorOo7xjzvfQYbeKjC7FmM+WZd01Rlh6ftNm//PlI9y9xERDvgMAHPvCBjw186h76mPx0fwpOI3z0k8ELe49OFOQ+Y8z30mO0iQ/+Nh/p/iUuAuIdEPjABz7wkeajH/TI7NjVrIV7Zm+h+NhscJOXyJ9515TAzZOWi4/RNj74bj7S/UtcBMQ7IPCBD3zgI8mntKhCTfpNP1Nqds7JFx+XLW4qP+cOnDFPR2teJ7cfFR+nbXzwHT7S/UtcBMQ7IPCBD3zgI8XnL//fX9SCXqPq1/jVkz9Lj8sWe+Vnz4KN9ZfL4zpJNPuXPx/p/iUuAuIdEPjABz7wkeJzaOlmU2SmPvueWfNXekw22Ss/uijn9E08MKNXDIljcWb/8ucj3b/ERUC8AwIf+MAHPhIuOn5JZT3yhhr9UFd1es9J8fHYZr/8XLtYriY80deUwIMrd4qP1zY+cTcF0KEA+gUEPvCBD3zS7Zqq22r2y8NMedkwNkd8PDY6mfwcWbfPMNQTRV85e018zLbxibMpgA4F0C8g8IEPfOCTbm+ZssIUlzl/+tCseSs9HhudbH5WD5uZWC/4jc9iNTUM+5c/H+n+JS4C4h0Q+MAHPvBJp/VKFpkdu5kpX6ovXoNPE042PxWlN9S0zgNMCdwxK0983LbxiaspgA4F0C8g8IEPfOCTLleV31Iznh9sysrWaSvh4+Hm5EfPnajvpcx6pIcqLrwiPnbb+MTRFECHAugXEPjABz7wSZc3jFucuPT76nB1vfo2fDzc3Pzkj5pv2C7oOSoWTwWzf/nzke5f4iIg3gGBD3zgA590+MLhC+bSr57E+NLxIvj4uLl89KXgKb97x5TA/Uu3iY/fNj5xMwXQoQD6BQQ+8IEPfIK2fjhh7usf37WEGXy83RI+xzYVGMbjH++jrl2qEN8G2/jEyRRAhwLoFxD4wAc+8AnaXyzaZIrJ9OcGqqqKL+GThFvKZ8WgqfUTREtvg4184mIKoEMB9AsIfOADH/gEaT1hsZ6nTpeSUzvurF0LH2+3lI9eW1mfAdS8j208KL4dtvGJiymADgXQLyDwgQ984BOk9ZkoXUZWDc2GTzPcGj77l283zKc8/Y65N1B6W2zjEwdTAB0KoF9A4AMf+MAnKB/fnLgnbcLjfVTp5Sr4NMOt4aOfAl745ujESivjFotvi2184mAKoEMB9AsIfOADH/gEYT3n39Rn32vyqdS48/Fza/kUHS8yk23rp64vnywW3x7b+ETdFECHAugXEPjABz7wCcJbp6405W9e9xGNzksXdz5+TgWf9WMWmt9BTr+x4ttjI58omwLoUAD9AgIf+MAHPqn21fOlZlUKvTrFhcPn4dMCp4JPxbUbatJv+kXygRDy489Hun+Ji4B4BwQ+8IEPfFLtlUOmmdKx5pM58GmhU8Wn7oGQab8fqKorvxLfLtv4RNUUQIcC6BcQ+MAHPvBJpc98ccoUDj31S2lRJXxa6FTxuV5zZxLu7TNyxbfLNj5RNQXQoQD6BQQ+8IEPfFJlXTbmvDLclI2dc/Lh0wqnks+5A2fM5fixnXqqkgtl4ttmG58omgLoUAD9AgIf+MAHPqly3eXG7D8M8r3cGEc+zXGq+eR+NMv8bvTleelts5FP1EwBdCiAfgGBD3zgA59UWE84POmptxMPHGwqgE8rnWo++nL8uEd7md/P+YJz4ttnG5+omQLoUAD9AgIf+MAHPqnwpglLElOO9M1qdNqXuPNproPgsy17tfkdLeg5Kqnfkc0mP/58pPuXuAiId0DgAx/4wKe11veV6WlfMjt2VZeOF8EnBQ6Cj56ce/Jv+5sSeHzzIfFttI1PlEwBdCiAfgGBD3zgA5/WOvej2aZU6D/hkxoHxUevyqJ/VzNf/EDVVH8tvp228YmKKYAOBdAvIPCBD3zg0xqbJcc6djVnAJvzhGlc+LTUQfHRpW/GC0MSS/Qt3y6+nbbxiYopgA4F0C8g8IEPfODTGi99d6IpExvHLYZPCh0kn+ObC8zvbPLT/c1lYelttY1PFEwBdCiAfgGBD3zgA5+W+szeQlMkxj/eR5VfrYFPCh0kH/0AiH4QJMyTQ5Mffz7S/UtcBMQ7IPCBD3zg0xLrEjHvjc9MidgxKw8+KXbQfM4dPFu/YktZcZX49trGJ+ymADoUQL+AwAc+8IFPS6zn+tMFYsrT77ToMmLU+bTW6eCzYtBU8zvckJUjvr028gmzKYAOBdAvIPCBD3zg01zrBwlm/vGDxIMES7fBJwCng8/lk8Uqs2M38wDPtUsV4ttsG58wmwLoUAD9AgIf+MAHPs11wepdpvzNeH6wWwZvwycAp4vP6mEzze8yf9R88W22kU9YTQF0KIB+AYEPfOADn+ZYFz691q8uDYfz98InIKeLz5UzJSrz4W5qzM+7q6vnS8W32zY+YTUF0KEA+gUEPvCBD3ya4wMrd5ryN+uloep6TcsnEo4qn1Q5nXzyPpljfqf6T+nttpFPGE0BdCiAfgGBD3zgA59krc/+TX9uoCkLR9btg0+ATicffeZPnwHUZwL1GUHpbbeNTxhNAXQogH4BgQ984AOfZK1XjtDlb/bLw8w0MPAJzunmo+8B1L9bfU+g9LbbyCdspgA6FEC/gMAHPvCBTzKuqbqtpnUeYErC0Q0H4BOw081HPwWsnwbWy/rpp4Olt982PmEzBdChAPoFBD7wgQ98kvG+pVtN+ZvzyvBWn/2LIp9UW4KPng9Q/45XDpkmvv028gmTKYAOBdAvIPCBD3zg4+fqyq/U1GffM+VATwANn+Atwaf0cpUa26lnKM4Ckh9/PtL9S1wExDsg8IEPfODj572Lt5jyN/e1j1Ny9i9qfIKwFJ+6s4Crh80QZ2Ajn7CYAuhQAP0CAh/4wAc+Xtb3/tWd/Tux5TB80mQpPnfuBeymrpy194lg8uPPR7p/iYuAeAcEPvCBD3y8fGDFjsS9f6+m5t6/qPEJypJ86p4Izvt0rjgHG/mEwRRAhwLoFxD4wAc+8GnKeqLn7C6DE/P+rd8PnzRakk/dvIDaJRfKxFnYxicMpgA6FEC/gMAHPvCBT1PWS72ZNX9fGNKqVT+iyidIS/NZ8/Fs87tfl7lAnIWNfGw3BdChAPoFBD7wgQ98GrO+3KsnfNYl4OCqXfBJs6X5FJ++au4D1PcDlhZVivOwjY/tpgA6FEC/gMAHPvCBT2PWD3zo8qcnf9ZLwMEnvbaBz6qh2SYDG8ctFudhIx+bTQF0KIB+AYEPfOADn8Y8743PzMFfTwEDn/TbBj5FJy6r0Q91VeM69VLlV6rFmdjGx2ZTAB0KoF9A4AMf+MDnXp/ec9KUv8m/7W8mgYZP+m0Ln+XvTzFZ2Dp1pTgTG/nYagqgQwH0Cwh84AMf+NzrnL5Z5qC/a24+fIRsC5/zh86bLEx8sq+qKr8lzsU2PraaAuhQAP0CAh/4wAc+DX2+4Jw54E94oq+qLLsJHyHbxGdh70yTiT0LN4qPxUY+NpoC6FAA/QICH/jABz4NvWLQ1LRc8gsrn3TZJj4ntx8N9IGgsPOx0RRAhwLoFxD4wAc+8KmzXvpLT/0x9pc9VVlxsDf9h5FPOm0Tn4ZTAh3K+0J8PLbxsdEUQIcC6BcQ+MAHPvCpc90SYPkj58FH2LbxKcjdY7Khi2AqlwSMCh/bTAF0KIB+AYEPfOADH209zYc+85fZsauZBBg+sraNj770O/XZ90wJPLXjqPh4bONjmymADgXQLyDwgQ984KO9LXu1ObgvHzgZPhbYRj57FmwwGVnUZ4z4WGzkY5MpgA4F0C8g8IEPfOBTVfGlmvSbfubgfu7AGfhYYBv56KfC9dPhOicXDp+Hj8WmADoUQL+AwAc+8IHPviVbzUF9fo+R8LHEtvLZMmWFycqKwVPhY7EpgA4F0C8g8IEPfOLN53rN1yq7yyBzUD+28SB8LLGtfMqKq1TWIz3M0+JXz12Dj6WmADoUQL+AwAc+8Ik3n6MbDpjyN+P5waYMwscO28wn79O5JjMbxubAx1JTAB0KoF9A4AMf+MSbz7w3PjMH8/1Lt8HHItvMp+jkZZOZ8Y/1VpWlwa0WE1Y+NpgC6FAA/QICH/jAJ7586pZ90w+AVFd+BR+LbDufnH5jE8vDLdgAHwtNAXQogH4BgQ984BNfPquGZqdl2bew8pG07Xzqloeb/tzAtN46EBY+0qYAOhRAv4DABz7wiSefaxfL1ZifdzcuLaqEj2W2nY9eDWTmHz8wJVDfRwofu0wBdCiAfgGBD3zgE08+myctNwfv1cNmwsdCh4GPvm803dMHhYmPpCmADgXQLyDwgQ984sdHT/w88cnEhL4Xj1yAj4UOAx+To1+/ZXJ0/lB6J4YOAx9Jh6IAZmRkDGrfvn1n1yPcr3/U1Os6dOjwT+4ff3v//fd/v127dhnJ/vsExDsg8IEPfOLHp+7MzYJeo+BjqcPCp25iaH0/KXzssfUF0C18D7rFbo7+2v3zh24JzG3qte7fnXRfc8t1Xps2be5L9mcQEO+AwAc+8IkXn4b3bqVz4uew8LHFYeFTWlRRfy+pvq8UPnbY+gLolrkP3BLYve57t+SVe7z2lZb8DALiHRD4wAc+8eJzascxU/6m/V7m6U3b+djiMPHJHT7TZGrzpGXwscTWF0C38E1x/WKD78v0Jd7GXusWwMx27do96f455Mc//vF/SPZnEBDvgMAHPvCJF58l/cebg/Xu+TLzt9nOxxaHic+FwxdMpvT9gOmaTzJMfCRsfQF0y9z0jIyMLg2+r2rTps33mnj5d/T/3HfffX/nFsWCZH+GDsitWwkY+G5rLvCBD3ziw6f49BU1+qGuatxjb6rKshvwsdhh4zO/dkWZgtW74GOBNZdWVrRgVXsJuGuD7ysbe127du2ecf9ufO23f+MWwH9O9mcohBBCRtsnLzUH6R1TlkkPBUVM53ccNtla2OMz6aGgWrWyogUrt9T9RJ8F1F+3bdvW7XXt1+mv3VLYruHr3AL4S/fv/7P++oEHHvj37uu2JfszNAQ+ITT9CQE+8IFPPPhUld80a7fqM4D6TKD0eGzjY5vDxud69W01+am3E1PCFJyFj7CtPwOo5Za9UW4JfKH2Hj89vct33IJX7P7/P7jndd312UL37z7lKeDU3SMAH/jAJx589i7eYg7OOW9liY/FRj62OYx89JKCicnFZ8BH2JpLygtb2ERAvAMCH/jAJ/p89NQvs14ampj6ZVOB+Hhs42Ojw8jn2qXElDBZv3hDlRVXwUfQFECHAugXEPjABz7R53N6z8nE1C+dB6iaarmpX2zlY6PDymfF4Kkma9tnroGPoCmADgXQLyDwgQ98os9n+aApiYc/ZuWJj8VGPjY6rHzO7C00WZvyzLuBftgIK590mQLoUAD9AgIf+MAn2nz06gyZD3dTWY/0UGXF1eJcbONjq8PKR99uMPvlYaYEHl1/AD5CpgA6FEC/gMAHPvCJNp87N+bPFGdiIx9bHWY++5cl1ppe2Hs0fIRMAXQogH4BgQ984BNdPjVVt9Xk3/avnZrjnDgT2/jY7DDzqSq/pSY83sfkruh4EXwETAF0KIB+AYEPfOATXT6H1+41B+G5r38szsNGPjY77Hw2jFtssrf2s3nwETAF0KEA+gUEPvCBT3T5zO8x0hyED6zcKc7DRj42O+x8rpwtSSw72KmXqrh2Az5pNgXQoQD6BQQ+8IFPNPlcPHrRlL+JT/ZVVRVfivOwjY/tjgKfJf3HmwzuWbABPmk2BdChAPoFBD7wgU80+eSNmGsOvhvHLxFnYSMf2x0FPie3HzUZzO4yyDwdDJ/0mQLoUAD9AgIf+MAnenwqSq6rsZ16qsyOXdWVs9fEWdjGJwyOAh9d+nT50yVQl0H4pM8UQIcC6BcQ+MAHPtHjs3v+BnPQXfLOBHEONvIJg6PCZ/e89SaLywZMhk8aTQF0KIB+AYEPfOATLT6Jsy6DE2ddth0R52Abn7A4KnzKr9aYScj1ZOR6rWD4pMcUQIcC6BcQ+MAHPtHic2rHscR9V38YpK7X2LHur018wuIo8Vn94QyTyW3Zq+GTJlMAHQqgX0DgAx/4RItP3bq/u+bmizOwkU9YHCU+Z/edNpmc+ux7KVsfOEp8gjAF0KEA+gUEPvCBT3T4lBZVqjE/766yfvGGVev+2sInTI4SH31bwqyXhpoSeHzzIfikwRRAhwLoFxD4wAc+0eGzY1aeOciuHDJNfPtt5BMmR43PnoUbU/pgUtT4pNoUQIcC6BcQ+MAHPtHgo+/3m/7cQHOQPb3npPj228YnbI4aH70aSGJqom6q5EIZfAI2BdChAPoFBD7wgU80+JzakZh0d8bzg1M+6W4U+ITNUeST+9Fsk9GtU1fCJ2BTAB0KoF9A4AMf+ESDz/KBkxMPf3y+TnzbbeQTNkeRz7mDZ01Gpzz9jqqpvg2fAE0BdCiAfgGBD3zgE34+pUUVZp41/fBH+RW7H/6Q4BNGR5XPnFeGmxJ4bONB+ARoCqBDAfQLCHzgA5/w89k+c03i4Y8Ppotvt418wuio8tm7eIvJ6uJ+Y+EToCmADgXQLyDwgQ98ws1HP/wxrfOA0Dz8kW4+YXVU+VSW3lTjHu2lRj/UunWqo8onVaYAOhRAv4DABz7wCTefk9trH/54YUgoHv5IN5+wOsp88kbMNZndPGkZfAIyBdChAPoFBD7wgU+4+SwbEK6HP9LNJ6yOMp8Lhy+YzE5+6m1VU9Wyh0GizCcVpgA6FEC/gMAHPvAJL59rl2of/nikR2ge/kgnnzA76nzmvv6xKYFH8vfBJwBTAB0KoF9A4AMf+ISXz/YZueYgumpotvj22sgnzI46n/3Lt5vsLuozBj4BmALoUAD9AgIf+MAnnHwaPvxx5otT4ttrG5+wO+p8qspvqfGP9Tb5LT59FT4pNgXQoQD6BQQ+8IFPOPmc2HYklA9/pItP2B0HPvkj57X4YZA48GmNKYAOBdAvIPCBD3zCyWfZgEnm4Ll73nrxbbWRT9gdBz71D4M83b/ZK4PEgU9rTAF0KIB+AYEPfOATPj71K3/ohz+u1ohvq218ouC48Jnzau3KIJsK4JNCUwAdCqBfQOADH/iEj8+OWXmhW/kjnXyi4Ljw+WLRJpPlpe9OgE8KTQF0KIB+AYEPfOATLj76fr/sLoPMQbNw13Hx7bSNT1QcFz4VJdfNmezMjt3MtEbwSY0pgA4F0C8g8IEPfMLFRz/xq8vftN8PDOXDH0HziYrjxGf1hzNMpvWZbfikxhRAhwLoFxD4wAc+4eKzethMc7Dclr1afBtt5BMVx4mPXsNaZ3r6c+8n/aEmTnxaYgqgQwH0Cwh84AOf8PCpKL2hxnbqqTI7dlUlF8rEt9E2PlFynPjcdVvD7hPwSYEpgA4F0C8g8IEPfMLDZ9+SreYgubjfWPHts5FPlBw3Pjtnr23WqjZx49NcUwAdCqBfQOADH/iEh8/c1z9JrJ+6rmXrp9pk8gOfhi4tqrwztVGJ/9RGcePTXFMAHQqgX0DgAx/4hIPPpeNFpvxN/PVbqqaqeZPm2mjyA597vey9iSbjexZuhE8rTQF0KIB+AYEPfOATDj7rxyw0B8cNWTni22Yjn6g5jnyObz5kMj775WHwaaUpgA4F0C8g8IEPfOznU135lZr4ZF9zcCw6cVl822zjE0XHkU9N9ddqytPvmJyfLzgHn1aYAuhQAP0CAh/4wMd+Pkfy95mD4ufdPhXfLhv5RNFx5bNl8nKT9bUjPodPK0wBdCiAfgGBD3zgYz+fnH5jzUFx/9Jt4ttlI58oOq58rpwtUaMf6qrGP9ZbVZXfgk8LTQF0KIB+AYEPfOBjNx8935+e929cp16qsvSm+HbZxieqjjOfRX3GmA88B1buhE8LTQF0KIB+AYEPfOBjN59t01ebg2HuR7PEt8lGPlF1nPkczvvCZH7+G5/Bp4WmADoUQL+AwAc+8LGXz/War9W0zgPMwfDM3kLxbbKNT5QdZz76oacJTyQeeiouvAKfFpgC6FAA/QICH/jAx14+p3YeNwfBGc8PTnqN1LCY/MDHy/mj5pvsb5q4DD4tMAXQoQD6BQQ+8IGPvXxWDplmDoI756wV3x4b+UTZcedz4fB5k309LYyeHgY+zTMF0KEA+gUEPvCBj5189HJYelksvTyWXiZLents4xN1w+fPatafPjQl8MS2I/BppimADgXQLyDwgQ987OSjl8PSBz+9PJb0ttjIJ+qGz5/V7vkbzD6wYtBU+DTTFECHAugXEPjABz528tHLYemD3/HNBeLbYiOfqBs+f1ZlxdVqzM+7q6xfvKHKr9bApxmmADoUQL+AwAc+8LGPT939T5Of7t/o/U9RMPmBTzJeNmCy2Rf0GXH4JG8KoEMB9AsIfOADH/v45I+c5/kEZBRMfuCTjPUZcL0vzHl1OAzL3mMAACAASURBVHyaYQqgQwH0Cwh84AMfu/hUVXypxj/eJzEH2umr4tthG5+4GD4J11TfVpOfetvsDxePXoRPkqYAOhRAv4DABz7wsYvPodpVEBb0HCW+DTbyiYvhc8cbxy02+8T6MQvhk6QpgA4F0C8g8IEPfOzik/NWlu86qFEw+YFPsi46ednsExN//ZaqqboNnyRMAXQogH4BgQ984GMPn5KL5SqzY1c1rlMvVVl2U3wbbOMTJ8Pnbn/e9RNTAo+uPwCfJEwBdCiAfgGBD3zgYw+fHbPyzEEud/hM8fHbyCdOhs/d3rdkq9k3lvQfD58kTAF0KIB+AYEPfOBjBx+91q9e81cf5E7vOSk+ftv4xM3wudsV124kVsbpqFfGqYCPjymADgXQLyDwgQ987OBzbv8ZU/6mdR5gyqD0+G3jEzfD59teNTS7fm1s+HibAuhQAP0CAh/4wMcOPnkj5pqD29Zpq8THbiOfuBk+3/apncfNPjLjhSHu99/Ax8MUQIcC6BcQ+MAHPvJ8zNx/v+ptDm5Xzl4TH7ttfOJo+Hzb12u+VlOffc/sJ+cPnoGPhymADgXQLyDwgQ985PkcWrMnMfdfr2jP/ddSPnE0fBr3lqkrzL6ydsRc+HiYAuhQAP0CAh/4wEeeT07feMz911I+cTR8GveVsyVmXxn/WG/1b//yr/BpwhRAhwLoFxD4wAc+snxKLpTFZu6/lvCJq+HTtPWZcl0Cz20rgE8TpgA6FEC/gMAHPvCR5bN95prYzP3XEj5xNXya9sFVu8w+s6z/OPg0YQqgQwH0Cwh84AMfOT56upfsLvGZ+6+5fOJs+DTtqvJbatxjb6rRD3VVJefj8dBUc00BdCiAfgGBD3zgI8fn7P7TsZr7r7l84mz4eDvvkzlm39k2PR7TJjXXFECHAugXEPjABz5yfPI+jdfcf83lE2fDx9vnYvzhKRlTAB0KoF9A4AMf+MjwMXP/PRavuf+awyfuho+fv1Gz//hBLG+fSMYUQIcC6BcQ+MAHPjJ84jj3X3P4xN3w8edTkLMxlg9QJctHun+Jix3IOyDwgQ98ZPjEce6/5vCJu+Hjz+fPN75KTKH0aLymUEqWj3T/Ehc7kHdA4AMf+KSfT/3cfzE+cJEf+KSCT07fMeaD1MGYfpDy4iPdv8TFDuQdEPjABz7p51M/999Hs8THaSMfDJ9k+dTdSrGw92jxMdlkCqBDAfQLCHzgA5/08knM/Tco9jevkx/4pIJPdcWtxMNUD3VVV8+Xio/LFlMAHQqgX0DgAx/4pJfP2X2101f8fmCsp68gP/BJFZ81dXMCZq8WH5ctpgA6FEC/gMAHPvBJL5+6CWy3xnwCW/IDn1TxObO30OxT0597P9Yfqu7lI92/xMUO5B0Q+MAHPunjo5ewqr9cdS5+c//58cHwaQkfXfp0+dMlUJdB6bHZYAqgQwH0Cwh84AOf9PEpyK29Yf1NblgnP/BJJR99+VfvW/pysPTYbDAF0KEA+gUEPvCBT/r4LGLKCk8+GD4t5aMfANFn1sc99qY50y49PmlTAB0KoF9A4AMf+KSHD3P/efPB8GktHz0VjP6Apc+0S49P2hRAhwLoFxD4wAc+6eGzfUZu7Of+8+KD4dNaPvrMut7H9Jl26fFJmwLoUAD9AgIf+MAneD7M/efNR3osNho+zeejz6zrM+z6TLs+4y49Rmk+0v1LXOxA3gGBD3zgEzwf5v7z5iM9FhsNn5bx0WfY9b6mV9uRHqM0H+n+JS52IO+AwAc+8AmeD3P/efORHouNhk/L+Ogz7Hpfy+4yONYftiiADgXQLyDwgQ98guVz11JVMZ/7rzE+5Ac+qeSjS9+0zgNMCTy3/4z4OCX5SPcvcbEDeQcEPvCBT7B8DuXuZu4/Dz7kBz6p5rN16kqzz+WNmCs+Tkk+0v1LXOxA3gGBD3zgEyyfRX2Y+8+LD/mBT6r5XDlbYva58Y/3UVUVX4qPVYqPdP/yVUZGxqD27dt3dj3C/fpHrX3dvWIH8g4IfOADn+D4fHP9y8TktMz91ygf8gOfoPgs6DnKlMDDeV+Ij1WKT2paWkByi9yDHTp0mKO/dv/8oVvuclvzusbEDuQdEPjABz7B8Tm4aANz/3nwIT/wCYrPgeU7zL6X02+s+Fil+KSmqQUkt8x94Ja77nXfu8WuvDWva0zsQN4BgQ984BOUv1GzXhjM3H9NmPzAJ0g+laU31dhOPVVmx27q2sVy8fFK8GldQwtYbpGb4vrFBt+X3X///d9v6esaEzuQd0DgAx/4BOOz+wpN+ZvO3H+NmvzAJ2g+qz+cYfbBnbPXio9Xgk9qmlpA6tChw/SMjIwuDb6vatOmzfda+rrGpANy61YCRlxcuOu4OrJun+/rNJc48knW8IFPa5z3aWLuv23Zq8THYqPJD3yC5qOPhXofnPniB0qfkZcec7r5pKapBaTaS7tdG3xf2ZrXNSYVQ819ZZgJ/VflNdJDQSiW+rd/+Vc14fHE3H9fV9+SHg5CsdRf//IXNfP5QWZpuP/+L/8mPZy0q3UNLWC5Re4n+uye/rpt27btXa3TX7tlr10yr0tGGkLcPkGtGz3fFMAtk5f7fkKII59kDR/4tNSH1uwx++DSflnwacLkBz7p4HPlzFVzO4b0eCX4pLKvBSK37I1yy90LrjPbtWuX4f5f33ELXrH7///A53VJSQdEw5C+Hp9Ony84Zw4+U555V12v+drzHoE48knW8IFPS72ob2LuvzObD8CnCZMf+MAnWD4pL2xhUxwDom84n/nHD8wB6NSOY54BiSOfZA0f+LTEJRfKzCWncZ16qX/9r/8CnyZMfuADn2D5SPcvccU1IDvn5JsCuGpotmdA4sonGcMHPi3x9plrEnP/DZ8JHw+TH/jAJ1g+0v1LXHENSGlRhZn/KOuRHqri2o0mAxJXPskYPvBprvXZ9+wuibn/zuw5CR8Pkx/4wCdYPtL9S1xxDsiS/uPNgWj/0m1NBiTOfPwMH/g012f3nzb73LTOA5SedgI+TZv8wAc+wfKR7l/iinNAjuTvMwejeW981mRA4szHz/CBT3Od9+lcs89tnboSPj6GD3zgEywf6f4lrjgHpLryKzXhib7mgFRceKXRgMSZj5/hA5/muKriSzX+V73N/nblbAl8fAwf+MAnWD7S/UtccQ9I/qjEnICbJy1vNCBx5+Nl+MCnOT6U94XZ1xb0HAWfJAwf+MAnWD7S/UtccQ9I3ZyAU59571tzArIDeRs+8GmOc97KMvvagRU74JOE4QMf+ATLR7p/iSvuAblrTsCdx78VkLjz8TJ84JOsSy6W18/9V1l2Ez5JGD7wgU+wfKT7l7gISNNzArIDeRs+8EnWO2blmX1s9bAZ8EnS8IEPfILlI92/xEVA7swJOPaXPVVF6Z05AdmBvA0f+CRjfZZ9xgtDTAEs3HUCPkkaPvCBT7B8pPuXuAhIwvVzAi67MycgO5C34QOfZHzuwJn6uf8a3mcLH2/DBz7wCZaPdP8SFwFJ+HD+XnOQmt9gTkB2IG/DBz7JeO2Iz82+tWXqCvg0w/CBD3yC5SPdv8RFQBI2cwI+3qd2TsCr9QGBT9OGD3z8bOb+q92vrpwpgU8zDB/4wCdYPtL9S1wE5I7zR85LnKmYvLw+IPBp2vCBj58P1879N7/HSPg00/CBD3yC5SPdv8RFQO743jkB2YG8DR/4+Hlxv7GJe2uXb4dPMw0f+MAnWD7S/UtcBOSOzZyAL96ZE5AdyNvwgY+Xr5m5/7qpsZ16qsrSm/BppuEDH/gEy0e6f4mLgNztnXPW1s8JyA7kbfjAx8s7Zyf2pdUfzmj07+POx8/wgQ98guUj3b/ERUDu9rVLd+YErCy7wQ7kYd5g4NOUG879d+8KO/BJzvCBD3yC5SPdv8RFQL7txW+PS6xZunw7O5CHeYOBT1M+d/Bsk2tswyc5wwc+8AmWj3T/EhcB+bbr5wTsMZIdyMO8wcCnKd/7RD18mm/4wAc+wfKR7l/iIiDfdsM5AW9XXIdPE+YNBj6NubE5NeHTfMMHPvAJlo90/xIXAWncdWcw9s7Ng08T5g0GPo25sVV14NN8wwc+8AmWj3T/EhcBadx1cwJmPzdQ3bje+D1McTdvMPBpzHX30O5fus3zdXHlk6zhAx/4BMtHun+Ji4A07oZzAhbuavwpxribNxj43OvSojtP0VeU3oBPKwwf+MAnWD7S/UtcBKRp180J2NQ8ZnE3bzDwudc75+TXz6MJn9YZPvCBT7B8pPuXuAhI0y69VK4yH256JYO4mzcY+DT0XSvp7DgGn1YaPvCBT7B8pPuXuAiId0BWDpzY5FqmcTdvMPBp6Lr7Zqc8826Tc//FmU9zDR/4wCdYPtL9S1wExDsgF3YdrZ8TUHo8tpk3GPg0dP6o+WZf2TxpGXxSYPjABz7B8pHuX+IiIN4B+e//+m935jQ73fScZnE0bzDwqbOZ+++JvrVz/12BTwoMH/jAJ1g+0v1LXATEOyBa9asaTFkhPiabzBsMfOp8JH+f2UfmdR8BnxQZPvCBT7B8pPuXuAiId0C0zhck1jWd1nlAUvc2xcW8wcCnzov7jTX7yL6lW+GTIsMHPvAJlo90/xIXAfEOiNaNG9+oGS8MqZ0T8IT4uGwxbzDw0S65WK4yO3Y1T8v7zf0XRz4tNXzgA59g+Uj3L3EREO+A1PHZOZs5Ab34SI/FRseFz/YZuYl9Y9hM+KTQ8IEPfILlI92/xEVAvANSx+fapQYrHFxL/ixHlM0bDHz03H/Tn3vfFMDTe07CJ4WGD3zgEywf6f4lLgLiHZCGfJb0H28OdHsXbxEfmw3mDQY+uvTpfUKXQF0G4ZM6wwc+8AmWj3T/EhcB8Q5IQz5HNxwwB7u5r38iPjYbzBsMfPRlX71P6MvA8Emt4QMf+ATLR7p/iYuAeAekIZ+aqttq0m/6mQPepeNF4uOTNm8w8eajH/jQD37oB0D0gyDwSa3hAx/4BMtHun+Ji4B4B+RePhvGLTYFcH3WIvHxSZs3mHjz2b90m9kXFr89Dj4BGD7wgU+wfKT7l7gIiHdA7uVTdOKyOehNfPIts/qB9Bht44Pjw+fzbp+afeHIun3wCcDwgQ98guUj3b/ERUC8A9IYn3mtPPBFxbzBxJdPKj4IRZlPKgwf+MAnWD7S/UtcBMQ7II3xqb/01W+s+Bht5IOjz6f+VogxC+ETkOEDH/gEy0e6f4mLgHgHpDE+laU3W3Xze1TMG0w8+TR8GOri0YvwCcjwgQ98guUj3b/ERUC8A9IUn9zhLZ/+IirmDSaefI5tPJiYDum1j+EToOEDH/gEy0e6f4mLgHgHpCk+Z/YW1k6AO7DZE+BGxbzBxJPP0ncnpGRC9KjySZXhAx/4BMtHun+Ji4B4B6QpPrr0ZXcZZA6EhbtPiI/VNj44mnxKiypU5sPdVNYjPVRFyXX4BGj4wAc+wfKR7l/iIiDeAfHis2NWnimAqz+cIT5WG/nE3VHks3P2WpP5VUOz4ROw4QMf+ATLR7p/iYuAeAfEi8+1SxUqs2M3NfaXPVXFtRvi47WNT9wdNT76rPeM5wcnznrvOg6fgA0f+MAnWD7S/UtcBMQ7IH58lryTmvuhwmjeYOLF5+y+0ybr0zoPUNdrvoZPwIYPfOATLB/p/iUuAuIdED8+RzccSDwR+XrrnogMo3mDiRefNR/PNlnfOn0VfNJg+MAHPsHyke5f4iIg3gHx41NTfVtNeuptc2C8dOyS+Jht4xNnR4lPZdlNNe7RXmr0Q11Vyfky+KTB8IEPfILlI92/xEVAvAOSDJ9UrIoQRvMGEx8+B1bsMBnP6ZsFnzQZPvCBT7B8pPuXuAiId0CS4VN0sm5d1L4tXhc1jOYNJj585vcYaTJ+OO8L+KTJ8IEPfILlI92/xEVAvAOSLJ953UeYA+SR/H3i47aRTxwdFT7FhVdMtic83ielH3Ciwicowwc+8AmWj3T/EhcB8Q5Isnz2L9uWuETWb6z4uG3kE0dHhc+mCUtMtvNHzYdPGg0f+MAnWD7S/UtcBMQ7IMnyqSy9qcZ16qUyO3ZVJRdSc5O87eYNJvp8aqruPOR08ehF+KTR8IEPfILlI92/xEVAvAPSHD65H80yB8pt2avFx24jn7g5CnyOrNtXO83RJ/BJs+EDH/gEy0e6f4mLgHgHpDl8zuwtTOlEubabN5jo88l5K8tkev/SbfBJs+EDH/gEy0e6f4mLgHgHpDl8zFJZLwwxB8yT24+Kj982PnFz2PlcOXvNzPun5//T8wDCJ72GD3zgEywf6f4lLgLiHZDm8tk9b70pgMsHThYfv4184uSw89kyebnJct6nc+EjYPjABz7B8pHuX+IiIN4BaS6f8ivVKuuRHirz4W6qtKhCfBts4xMnh5mPXuFmytPvmAJ4vuAcfAQMH/jAJ1g+0v1LXATEOyAt4bNqaLY5cO6YlSe+DTbyiYvDzOfYxoMmw3NeGQ4fIcMHPvAJlo90/xIXAfEOSEv4nN5z0hw8pz83MNIPg/AGE10+S/qPNxnem7MZPkKGD3zgEywf6f4lLgLiHZCW8DEPgzw/2BxAT+04Jr4dtvGJi8PKR89jqeezHNupp6q4dgM+QoYPfOATLB/p/iUuAuIdkJby2fX5usTDIIOmiG+HjXzi4LDy2Tp9lcmuntcSPnKGD3zgEywf6f4lLgLiHZCW8ikrrlZZv3hDjfl5d1V6uUp8W2zjEweHkY++ZWHqM++ZAnhu/xn4CBo+8IFPsHyk+5e4CIh3QFrDZ+WQaeZAunP2WvFtsZFP1B1GPie2HjaZnfXSUHMrA3zkDB/4wCdYPtL9S1wExDsgreFTuPtE7cMg7wd+MA0jn6g7jHyWDZhkMrtnwUb4CBs+8IFPsHyk+5e4CIh3QFrDR5e+7C6Jh0EKdx0X3x7b+ETdYeOj563U81fqeSzLS2rgI2z4wAc+wfKR7l/iIiDeAWktn11z800BXDF4qvj22Mgnyg4bn+0z15is6nks4SNv+MAHPsHyke5f4iIg3gFpLR/9MIh+EES7rDhaD4PwBhMdPvrhDz1vpS6AZ744BR8LDB/4wCdYPtL9S1wExDsgqeBT/zDInGg9DMIbTHT4nNpx1GRUz1+ZrvtVw8RHwvCBD3yC5SPdv8RFQLwDkgo+hbsSD4Nk/2FQpB4G4Q0mOnzqHv7Q81fCxw7DBz7wCZaPdP8SFwHxDkgq+JiHQdzyl3gY5IT4dtnGJ6oOC5+Si+Uqs2M3NfaXPdPy8EfY+EgZPvCBT7B8pPuXuAiId0BSxUdf/jUPgwyKzsMgvMFEg8+WqStqV/6YDR+LDB/4wCdYPtL9S1wExDsgqeKjHwCpXxmkqEJ822zjE0WHgU9N1W01+bf9TQE8X3AOPhYZPvCBT7B8pPuXuAiId0BSyWf1hzPMgXbb9NXi22Yjn6g5DHyO5O8zmZz7+sfwsczwgQ98guUj3b/ERUC8A5JKPnptVX2wnfK7d1RN9W3x7bONT9QcBj4L3xxtMnlg+Q74WGb4wAc+wfKR7l/iIiDeAUklH/0wyJxXhpsD7pH1+8W3zzY+UbPtfIpOXjZZnPB4H1VVfgs+lhk+8IFPsHyk+5e4CIh3QFLNZ/+ybeagu7B3pvj22cgnSradz7rMBSaL67MWwcdCwwc+8AmWj3T/EhcB8Q5IqvnoMy3jH+9jDryXTxaLb6NtfKJkm/mYHP6qt8lhceEV+Fho+MAHPsHyke5f4iIg3gEJgs/6MQvNgVefgZHeRhv5RMU289m/NHEmelGfMfCx1PCBD3yC5SPdv8RFQLwDEgQffcZFH3zHP9ZbVZbdFN9O2/hExTbzqbsX9ej6A/Cx1PCBD3yC5SPdv8RFQLwDEhSfRX3HmAPwvqVbxbfTRj5RsK18zh2ofRr9admn0W3lY4vhAx/4BMtHun+Ji4B4ByQoPkc3HDAH4dkvDwvt+sC8wYSTz+phifkot05fBR+LDR/4wCdYPtL9S1wExDsgQfGpqf5aTXnmXXMgPrvvtPi22sYnCraRT/mVapX1SA+V+XA3de2S7Io0NvKxyfCBD3yC5SPdv8RFQLwDEiSf7TNyTQFcNTRbfFtt5BN228hn55x8k7nl708RH4uNfGwyfOADn2D5SPcvcREQ74AEyae0qNKsDWzWB75cJb69tvEJu23jc73mazX9ufdNASzcdVx8PLbxsc3wgQ98guUj3b/ERUC8AxI0n5VDppkD8vaZa8S310Y+YbZtfE5sOWyyNuP5wVbcd2obH9sMH/jAJ1g+0v1LXATEOyBB8zmzt9AclKc++565L1B6m23jE2bbxien31iTtS8WbRIfi418bDN84AOfYPlI969vKSMjY1D79u07ux7hfv0jr9d26NDhn9w//vb+++//frt27TJa8vMIiHdAguajz8TMeulDc2A+tvGg+DbbxifMtonP5VPFd+aeLLVj7kmb+Nho+MAHPsHyaVFJC0pu4XvQLXVz9Nfunz90S2Cu1+vdvz/pvu6W67w2bdrc15KfSUC8A5IOPvuWbK1dH3i0+DbbyCestolP/qj5iXV/xywUH4uNfGw0fOADn2D5tKQzBSa3yH3glsDudd+7Ba/c5/WvtPZnEhDvgKSDj16XdULt+sCXjl0S327b+ITVtvCpuHZDjXu0lxr9UFdVfPqqOBfb+Nhq+MAHPsHyaW1/SqncwjfF9YsNvi/Tl3eber1bADPbtWv3pPvnkB//+Mf/oSU/Uwfk1q0EDHy3NZd08dk0YYkpgHmfzBHfbhv5hNG28Nkzf4PJ1pJ3xoszsZGPrYYPfOATLJ+WdKbA5Ba56RkZGV0afF/Vpk2b73n8J9/R/3Pffff9nVsWC1ryMxWyQt/UfGkm5x37y57qv37z/0oPB0VEf/3LX9TM5webAlhy9Jz0cBBCyBq1pDO1Sm6p66jLmuuD9zhXn8lzC2DXBq+tbOrfadeu3TPu34+v/fZv3P/+n1syHg2BTwhNf0JIJx89Oa8+UO+YtUZ8223kEzbbwOfElkOJqV9eGKJu3PhGnIltfGw2fOADn2D5tKQzBSa30P1EnwXUX7dt29btdO3X1f2dWwzbNXytWwB/6b7mP+uvH3jggX/vvnZbS36mDoiGIX093kZrLunkUzclzJTfvaNqqm+Lb79tfMJmG/jk9M0ymdqbs1mch418bDZ84AOfYPm0pq8FIrfojXJL4Au19/fVTe3yHbfgFbt/94N7XttdnzF0/+5TngIOJiDp5KOnhJnz6nBzwD6c94X49tvGJ2yW5lN08nJi6pdf9VaVZXZM/WITH9sNH/jAJ1g+rS5sYRcB8Q5IuvkcXLnTHLTndftUfPtt5BMmS/NZ+9k8k6UNWTniLGzkY7vhAx/4BMtHun+Ji4B4ByTdfKorv1KTnnrbHLjPF5wTZ2AbnzBZkk/51RrzQFFmx67qytkScRa28QmD4QMf+ATLR7p/iYuAeAdEgs/WqStNAVw1NFucgY18wmJJPttn5JoMLR84WZyDjXzCYPjABz7B8pHuX+IiIN4BkeBTWlSpxvy8u3HJxXJxDrbxCYul+OizyJN/298UwLP7T4tzsI1PWAwf+MAnWD7S/UtcBMQ7IFJ8cj+aZQ7geoJoaQ428gmDpfjU3Uf6ueX3kZIf+MAHPpJ8pPuXuAiId0Ck+Fw6XnTnCc5S+57glOYTBkvw0U+Sz/rTh4knyfP3ijOwjU+YDB/4wCdYPtL9S1wExDsgknxy+o01B/Ld8zeIs7CRj+2W4HNq53GTmWmdB6ia6q/FGdjGJ0yGD3zgEywf6f4lLgLiHRBJPqd2HLP6YC7Nx3ZL8Fn89rjEh4Z568W330Y+YTJ84AOfYPlI9y9xERDvgEjy0ZfzZr88LHE5b619l/Ok+djudPMpOlE78fNjvVVF6Q3x7beNT9gMH/jAJ1g+0v1LXATEOyDSfA6u2mUO6nNf/9gUQmkmtvGx2enmk/fJnMTEz+MWi2+7jXzCZvjABz7B8pHuX+IiIN4BkeZTU3VbTXn6HXNgP/PFKXEmtvGx2enkU3q5SmU90kNlPtxNlZwvE9922/iE0fCBD3yC5SPdv8RFQLwDYgOfnbPXmgK49N0J4kxs5GOr08ln86TlJiMrh0wT324b+YTR8IEPfILlI92/xEVAvANiA5+Kkutq3KO91OiHuqrLp4rFudjGx1ani4+eJmj8431MAbx45IL4dtvGJ6yGD3zgEywf6f4lLgLiHRBb+Kwfs9Ac4PV9XtJjsZGPjU4Xn11z80029LRB0ttsI5+wGj7wgU+wfKT7l7gIiHdAbOGj7+uqWx7umiXLw9nEx0ang49e9q3uHtHC3SfEt9k2PmE2fOADn2D5SPcvcREQ74DYxCd3+MzEU55jc8THYiMf25wOPvuXb08s+9b1E+ueEreBT5gNH/jAJ1g+0v1LXATEOyA28Sk6edncBziuUy9VfrVGfDy28bHNQfO5XvO1mvH8YFMAj244IL69tvEJu+EDH/gEy0e6f4mLgHgHxDY+ywZMNgf8rdNXiY/FRj42OWg+R9cfMFmY8cIQUwalt9c2PmE3fOADn2D5SPcvcREQ74DYxud8wTlz0J/4ZF9VVX4LPhY7SD76cu/c1z8xWTiwfIf4ttrGJwqGD3zgEywf6f4lLgLiHRAb+SzqM8aK9V5t5WOLg+SjH/jQGdAPgOgHQaS31TY+UTB84AOfYPlI9y9xERDvgNjIp3DX8cTB/3eyB39b+djiIPnk9M0yGdj1+Trx7bSRTxQMH/jAJ1g+0v1LXATEOyA28ml4+U8/BQofOx0Un3MHztTfBqAngZbeTtv4RMXwgQ98guUj3b/ERUC8A2IrH/3Upy4B2V0GqZpqmQcAbOZjg4Pis6T/ePO73z4jV3wbbeQTFcMHPvAJlo90/xIXAfEOiK189FOfM1/8wBSBQ2v2wMdCB8Hn/KHz5neuVKiMEwAAEt5JREFUl36ruHZDfBtt4xMlwwc+8AmWj3T/EhcB8Q6IzXwO5X1RPw2IxFlA2/lIOwg+S9+dmJgGaJr8NEA28omS4QMf+ATLR7p/iYuAeAfEZj5mImC3/EmdBbSdj7RTzefikQuJs3+P9VblJfITgdvGJ2qGD3zgEywf6f4lLgLiHRDb+ejiJzUZcBj4SDrVfJYPTEwCvmXycvFts5FP1Awf+MAnWD7S/UtcBMQ7ILbz0Zd+688C5n0BH4ucSj6XjhcllgF8tJcqv1Itvm228Ymi4QMf+ATLR7p/iYuAeAckDHykzgKGhY+UU8ln5ZBp5ne8acJS8e2ykU8UDR/4wCdYPtL9S1wExDsgYeBjzgI+P9gUhMNpPAsYFj5SThWfopOXVWbHrmpsp56qrLhKfLts4xNVwwc+8AmWj3T/EhcB8Q5IWPgU5Kb/LGCY+Eg4VXyWD5pifrcbxi0W3yYb+UTV8IEPfILlI92/xEVAvAMSFj76LGB2l/SeBQwTHwmngs+Fw4l5/8Y99qYqK47GvX+p5BNlwwc+8AmWj3T/EhcB8Q5ImPgU5O6uXR1ksFsIb8NH2Kngs/jtcYknf6euEN8eG/lE2fCBD3yC5SPdv8RFQLwDEiY++tLvrJeGJtYIXrYNPsJuLZ+z+06b3+WEJ/qGftWPIPhE3fCBD3yC5SPdv8RFQLwDEjY+xzYeNKVhyu/eUVUVX8JH0K3ls6DXKPO73Dl7rfi22Mgn6oYPfOATLB/p/iUuAuIdkLDxuX79GzWv26emOOz6fB18BN0aPqd2HDW/w8lPva2qym+Jb4ttfOJg+MAHPsHyke5f4iIg3gEJI5/Te06a8jDxyb6qojS4S4dh5ZMut5SPLvFzX//Y/A73LNwovh228YmL4QMf+ATLR7p/iYuAeAckrHxy3soK/OGBMPNJh1vKp+4y/tRn31PVlV+Jb4dtfOJi+MAHPsHyke5f4iIg3gEJK5/66UMe7RXY5MFh5pMOt4SPns5n5h8/ML+7A8t3iG+DbXziZPjABz7B8pHuX+IiIN4BCTOfFYOmmiKxfsxC+Ai4JXz2Ld1aP6F3OqbyCRufOBk+8IFPsHyk+5e4CIh3QMLMp7jwisp8uJvK+sUb6srZa/BJs5vLp7L0pnnoQxfAE1sOi4/fNj5xM3zgA59g+Uj3L3EREO+AhJ3P2hGfm0KhzwbCJ71uLp8tU1aY39XC3pnmQRDp8dvGJ26GD3zgEywf6f4lLgLiHZCw8ym9XKXGP9bbFIszewvhk0Y3h0/JxXI19pc91eiHuqoLhy+Ij902PnE0fOADn2D5SPcvcREQ74BEgY+eSFgXQD21iF4tBD7pcXP45A6faX5Hq4fNFB+3jXziaPjABz7B8pHuX+IiIN4BiQIfPZXItN8PNAWjYPUu+KTJyfK5eOSCOfOnzwCWXCgTH7dtfOJq+MAHPsHyke5f4iIg3gGJCp8j+fvuLBGXopUlosQnCCfDR9/rp+/5M3M2Tl4uPmbb+MTZ8IEPfILlI92/xEVAvAMSFT66aMzvMdIUja3TV8EnDU6Gz/HNBeZ3Muk3/cxTwNJjto1PnA0f+MAnWD7S/UtcBMQ7IFHic77gXOJSY6ee5qED+ARrPz5VFV/WX5rX8/9Jj9c2PnE3fOADn2D5SPcvcREQ74BEjc/qYTMSDxt8OAM+AduPjz4TG8TDOWEx+YEPfOAjyUe6f4mLgHgHJGp8rl0sN8vD6eJxes9J+ARoLz5XzpaorEd6mDOy+sys9Fht44PhAx/4BM1Hun+Ji4B4BySKfHZ9vu7OcmNVLV9uLKp8UmUvPkvfnWB+B3kj5oqP00Y+GD7wgU/QfKT7l7gIiHdAoshHrzE7608fmgKyY1YefAJyU3yObz5k2E94oq8qv1ItPk7b+GD4wAc+6eAj3b/ERUC8AxJVPmf3nTYlRM89d/Vcy9YJjjKfVLgxPnpOxunPxffBDz8+GD7wgU+6+Ej3L3EREO+ARJnPmo9nmyKiL0fCJ/VujM+26atj/eCHHx8MH/jAJ118pPuXuAiId0CizKesuFpNfLKvKSTHNh6ET4p9L5/LJ4vrH/w4d/Cs+PikTX7gAx/4SPKR7l/iIiDeAYk6n/3LtpkCOPXZ95q9Qkgc+LTGDfnos33z3vjMsF43eoH42Gww+YEPfOAjyUe6f4mLgHgHJOp8WlNM4sCnNW7IZ8/CjYbxtM4DVGVZvFb8SIaP9FhsNHzgA59g+Uj3L3EREO+AxIFPw0uTzZkbMC58Wuo6Pvohm3GdEnMvntpxVHxctpj8wAc+8JHkI92/xEVAvAMSFz475+QnzlD9fmDSl4LjxKcl1lz++te/qpy+Ywzb3I9mi4/JJpMf+MAHPpJ8pPuXuAiId0Diwqem+mv1ebdPm3UpOE58WmLN5fSm/Ybp5N/2VxUl18XHZJPJD3zgAx9JPtL9S1wExDsgceLT3EvBcePTXJcWVaiJT7T8Keuom/zABz7wkeQj3b/ERUC8AxI3Pg0vBfs9rBBHPslaP1yT81aWYbly8FTx8dho8gMf+MBHko90/xIXAfEOSNz46EvB82ovBeePnAefFrpuveVpz7yryq/Gd7k3L5Mf+MAHPpJ8pPuXuAiId0DiyEdfCtZLxOkCc3T9Afg00xcOn1djft7dXEq/dvwCfJow+YEPfOAjyUe6f4mLgHgHJK586iaIHv94nybXCo4zn6asn6DO7jLYsNs0cSl8PEx+4AMf+Ejyke5f4iIg3gGJK5/r179RK4dMM0VGXxKuqb4NnySc98mcxFq/r32srrvM4NO0yQ984AMfST7S/UtcBMQ7IHHmU1F6Q01/7v3as1nL4OPjI+v2GVZ60ufiwqvw8TF84AMf+Ejyke5f4iIg3gGJO5/zh+7cz3Zy+92rWMDnjotPXzWXy3UBPLByJ3ySMHzgAx/4SPKR7l/iIiDeAYHPn9Xu+RtMsZn0m37q2sVy+NzjytKbauYfPzCMVg3NNpfP4eNv+MAHPvCR5CPdv8RFQLwDAp/E/YBL352QuLft9Y9VVcWX8GnAZtmAyYbNnFeG37WMHny8DR/4wAc+knyk+5e4CIh3QOCTcMW1G2rGC0MSExsPmWaKD3z+rLbPyDVMJj75lrp6vvSuv4OPt+EDH/jAR5KPdP8SFwHxDgh87lg/2DCh9j43XXzizuf45gJzb2Tmw91U4e4T3/r7uPPxM3zgAx/4SPKR7l/iIiDeAYHP3S7cddwUHrO+7YYDseWjJ8se/1hvw2HPwo2Nvob8eBs+8IEPfCT5SPcvcREQ74DA59veu3iLKT5jO/VUNUWlseNTWlShpnUeYBjkfjSr/qGPe01+vA0f+MAHPpJ8pPuXuAiId0Dg07jzR81PrHX77Luq5HzjK4VE0ZVlN9WcV4ebbV/Qc5SqrvyqydeSH2/DBz7wgY8kH+n+JS4C4h0Q+DRuvTLI4n5jTRHK7jJIlRVXiY8paOuyl/NWltlmPe1LRcl1z9eTH2/DBz7wgY8kH+n+JS4C4h0Q+DTt6opbalGvkYkpUF4d7luIwmxdeJcNmGS2dcrv3lEl58t8/xvyAx/4wAc+dpoC6FAA/QICH28+/+2b/6JmvpiYBPnzrp+Y5eOkx5Vq11R/bSZ4rpsM+/Kp4qT5kB/4wAc+8LHPFECHAugXEPj48ym9XKFmPD/YFKR53T6NVAnUZ/70vId62/QUOBePXmw2H/IDH/jABz52mQLoUAD9AgKf5Phcu1Rh7gVMXA7+SJUVV4uPr7Wuqbqtlr8/JVH+nuirzhecIz8B5Ud6LDYaPvCBT7B8pPuXuAiId0DgkzwfvU5w3eVgvWpIyQX/++RstT6LuajPmMQqH79+q1ln/sgPfOADH2nDx5+PdP8SFwHxDgh8msen/Eq1WS/YPCzx9DvqwuEL4uNsrvU8f3pdX7MNz7yrik5cJj9pyg+GD3zgky4+0v1LXATEOyDwaT6fytKbKqd2iphxnXqpY5sKxMearPVlXv2Urx77rJeGqpKL5eQnzfnB8IEPfNLBR7p/iYuAeAcEPi3jox+eyB85zxQpvV7ulqkr1PWar8XH7OWC1btU1iM9zJhz+ma1elob8gMf+MAHPnaaAuhQAP0CAp/W8fli0SY15ufdTala1HeMeVhEetz3Wq/uoZd0M2XV9YaxOWbqF/Ijn584Gz7wgU+wfKT7l7gIiHdA4NN6Pmf3n66/rKqfpj2Sv0987HU+s7dQZXdJTGEz7rE31aG8L8iPZfmJq+EDH/gEy0e6f4mLgHgHBD6p4aOnhambUkVbr6px9Xyp2Nj1U77rRi8wl6f1ePSDK1fOlJAfS/MTR8MHPvAJlo90/xIXAfEOCHxSx+f69W/MfXZ6QmVdusZ26qm2Za82l2DTNWZ9aXff0q1mRQ89Bn3P345ZeeaeRWk+cTN84AMf+Ejyke5f4iIg3gGBT+r5lBVX3XXPnS5juz5fZ54eDmqsuuAdWLmz/nJv3T2Jl08mt6wb+YEPfOwyfODTWj7S/atRdejQoUfbtm0f8ntdRkbGoPbt23d2PcL9+kct+VkExDsg8AmOz7mDZ9XC3pn1hWz8Y73VhqwcdenYpZSNUU/jsnXaKjOfX93P0ZNVH998yHo+UTd84AMf+EjyaUlnClLfdYtcH7cAHnVL3cNeL3Rf96D7ujn6a/fPH7qvz23JDyQg3gGBT/B8CnedUItr5w2s86w/fai2TF5uHtLQS7Il+2/pS7wXDp9XO+fkq3ndR9Tf42eWqHtluDqybl/apqMhP/CBD3zgY6dtLIBGbpmb71cA3dL3gVsCuzf4b8pb8rMIiHdA4JM+PnrFDT0Fy+Tf9r+rDOppZGa/PEytGpqtNk1YonbPW6/25mw29/Lpr/Ucg6uHzVTzun2qxj3a667/Vj/Zmzt8pjq3/4y5BzHMfKJm+MAHPvCR5NOSzhS4kimA7t9Pcf1ig+/L7r///u8392fpgNy6lYCB77bmAp/089Fn6M7sOak2T1qm5r72cf08gkn5oa5q1ksfmkmoT2w9rGqqvoocn6gYPvCBD3wk+bSknwWuJM8ATs/IyOjS4PuqNm3afC/40SGUXn38H//w3U9/8qd/GvXTV54b9eBr/Uf+7NVRo3/6+rjRP31t0sifvv7ZqAdfHzD6Z6++9NnPXv6/3//Z038nPV6EEELoW3KLWke33BW4PtjABQ3v4WvGJeCuDb6vDHLcCCGEEEIoQDVWAN2y167h927h+4k+C6i/btu2rfvy9uvSOUaEEEIIIZQiuUXvTbfMnXW9wP36F7X/93fc74vd739wz2tHuSXwBdeZ7dq1y0j/aBFCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQghZpYyMjEHt27fv7HqE+/WPpMdjozp06NCjbdu2D0mPw0bpRRNcd3fzs+SBBx74R+nx2CaXzUsum9+7nuzm6NfS47FVmg/vPwghlCa5b7gPugelOfpr988fNlwLHRl912XUx2Vz1G9d+DiqXbt2T7r+32u/fsZltF56TDbpH//xHx9ws1Oov3b5PKFzJD0mG+XuY/+Xm50i90PWP0iPxQrRhhsXn6a8xadxf3E2545cFh/ovNR97+amXHI8tqqxdeGR4dLPzc9U/bX75//mfn9Keky26R/+4R/+Z/2ny2aoy2i49HgslP6Q9Tv3vWgXBdChDTclPk15i0/jvuJszj1yOUxx/WKD78vuv//+70uOyUZRAJvU37rHqf9Jf1H7wTNLekAW6t+578fPu2w+d7/+rvRgbJObm+fcP/4Hl89uOg9t2FN8mmpafBpPThzM78h9n5nuZqVLg++r2rRp8z3JMdkoMuOt++677+9cPmv+/u///n+UHoutcvetF1yvlR6HTXLfe/6jy+Sf9NcUQIc2nIT4NNW0+DSehDiY31HtJeCuDb6vlByPrSIznvqOy+azug/nqHG5780upvZ/dT9g3Sc9Flvkvt+8UutXXV9w34ve/eEPf/i/So9LRLTh5MWnqabFp3FvcTC/I3cf+ok+C6i/rj1ArZMek40iM03Lzc8bDzzwwN/rr/XT5NLjsUmajctklf5a58d1hfvl3wgPy0rFovO4gejobmiB64P3ONctgC/HvQ03wafg3qcT4/ppKgk+sf40nkx+OJjfLfd9ZlTtB6rMdu3aZUiPxzbpB6vcvJx1vcD9+hfS47FJ+l5jNzd/dtncqPV86THZJF2MXSav1e5fc9zj1v8hPSYbpR/u1FcfXI//0Y9+9L9Ij0dcsWjDzRSfpvzFp3F/UQARQghZKdpw4+LTlLf4NO4vzuYghBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEIqs/n+vFFhOW4JtxQAAAABJRU5ErkJggg==\">"
],
"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": 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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Jj4LyZueQ3rRZ/dBMcmr1C0czFZfqu4AevOMAP+FEe9SjQau1fpK2ymh7avuCiuJLx5xuVz54KeXa0XJoONuvSD7Ol/oK8NkHUCzrh7X/tvbo5cb47jceLzXfDc762L/2garlFf2MFfEycClVFgXqe9l0QIjiY8rOsSjb86kZW33NheLhEPOCA51840sHP9slguqbizTk/heSiNHu/ruJV9CwUWfOQba2WNmLqfG1BccwCjg9Gp+EJd5NxpB83tiugIpFDM6r4gHMc1RJQr8mkHzrT71OId5RlDugTqHCJrnLDi+vaQ7hpsjguHUfC74zLXRuE7atp47Md/uMJhe7eHjh5AfRs785XqA/DfMv62+42XeHSlqo2mfo3lziczdrmEdQMeN/ivf/E9ox1K9xlRZsboRzHevt2qjed2PxCTPf0ejYokPhicX88q3gLej/+abMPedRou5+/esURuN7wbW73adqxwLw9e8cdYvT5Rt2tcZvrPib+BVser7cd7Y/VtyWK+NttLIdo9HiQ++V9csafSXb7+j1427VIs6Yo9Ny995UjiA+984qC9sjpaLmpfmlYyqu4DC3vF9qKJU0G2RtCIygudUDyigGwtc0ijbOZmOOz8kh7/HurmEF2mqu4CNgW5xSxMXNedardYVcd2nlT/HLGed0MQ042aNEvceoe1bHrXamczuml49PvROh+ZoPrRqF1YGmoe8VtYBNK9845s1HFrfvzIy83kTQkkj2iLXvDu6/JaX8o3ahXwFomqIA/d9ePIJoYt7ufXiilHzrnnVkmMBT4uR1LRKhHTx1XCx3jY1mErveaGJK249X+DcmkLxN1zeqn5Sdsinb+bwfwP++7q9FiEO8ruXcAAjwAG55r2oxX698KRV5Lc1RWn1XmJc+cbFOV1GTCHHSenCWackEr4+SGQb5tdRr1FAlIv78t+R7VeLxdp33jfgEvou/wNxMwj/LXxTiErf5vVB5j2NHNz/C6PSfK0zdqeEL+fmmkzi7siret8tXY+FE8vObGdv9HcnDtZQ8BEZa4O/d8u4vWT3inoljbT7a427I2doxlSPITGL/HJ9QJX3uirQogeaa5OMx9jNDnQcMEIcYrvRwGSjtft33XiPvqILLv24jOuoKfVt1NNba1w/xbeXcJmPad7PleoX8rGSuftnFguv9/mEE8vObCzXMvbr7yvr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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": 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"
}
],
"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": 19,
"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": 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"
},
{
"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": 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": [
"# 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": 71,
"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.apionly as sns\n",
"# You can also tweak the palette used, either with a seaborn palette\n",
"with replot.Figure(palette=sns.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(sns.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: sns.color_palette(\"dark\", n)) as figure:\n",
" figure.plot(np.sin, (-10, 10))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"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": 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": [
"# 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": 18,
"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 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": 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,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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": 20,
"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": 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": [
"# 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": "code",
"execution_count": 43,
"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 invert X and Y components easily\n",
"# Note that this will invert axes labels as well\n",
"with replot.Figure() as figure:\n",
" figure.xlabel = \"ylabel\"\n",
" figure.ylabel = \"xlabel\"\n",
" figure.plot(lambda x: x**2, (0, 10), invert=True) # Note that we plot x^2, not sqrt(x), but invert axis"
]
},
{
"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 also rotate X and Y components easily\n",
"# Note that this will not affect the axes labels \n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.xlabel = \"xlabel\"\n",
" figure.ylabel = \"ylabel\"\n",
" figure.plot(x, x, rotate=90)"
]
},
{
"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"
},
{
"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 plot multiple times the same figure\n",
"with replot.Figure() as fig:\n",
" fig.plot(range(10))\n",
" fig.show()\n",
" fig.plot(range(10), [-i for i in range(10)])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## One-liner plotting\n",
"\n",
"You can also make plot with a one-liner."
]
},
{
"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": [
"# 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": 25,
"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=sns.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": 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": [
"# 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": 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": [
"# 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": 28,
"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+AAAgAElEQVR4nOy9aXBVR5YuWu7q1/GiXnW9uPea6AjsqC4j4N54777oeD+64la38VAul8suG7som7LLZVNmMJh5NIMZzCyEBiQhJoFmIQESmgUSIEADQgIkJkkgBEKzGMrDHfrd9+7t0tsr98nDseqco73PycyVe2mviAVH0tbO9X1r5crUzp25vvc9V1xxxRVXXHHFFVdcccUVV1xxxRVXXHHFFVdcccUVV1xxxRVXXHHFFVdcccUVV1xxxRVXXHHFFVdcccUVV1xxxRVXXHHFFVdcccUVV1xxxRVXXHHFFVdcccUVV1xxxRVXXHHFFVdcccUVV1xxxRVXXHHFFVdcccUVV1xxxRVXXHHFFVdcccUVV1xxxRVXXHHFFVdcccUVV1xxxRVXXHHFFVfUysSJEz8dN27c88GuGT9+/MoJEyZMMXSz8flZVba54oorrtgRN5+54oorrowsf2Mkv3lGwrxkJMIXAl1kXPMz45pk+Gz8/4xxbb46E11xxRVXLImbz1xxxRVX7IiRAFODJUwjSa4xkuZMn+t71FjmiiuuuGJP3HzmiiuuuGJRRkqYxs8SDP3A5+vuMWPG/FCNda644oor1sXNZ6644oorFsXCX8xJxl/MU32+7h87duwP1FinVrb8pz++te2fpyVu+0+fTDO+fArbHqfLln+a9sK2f/rk8PZ/nvbhl9/73l9h2+N02fqzaa9AfG7/p2mfvve9976PbY+O4uYzV1xxxRWLYnHJZLrP132Brv3zn/885FRpO9M4tP2fP/FqbWoxtkmOlpbK+u/weWb3EWyTHC3tNU1DkS/M8PJ5bl8etklhieg8xsXNZ6644gqGiM5lSmR4wjSSY4Tvz40E+VP4qxk+jxs3zrh0QnGgewEJjx//56FHj5ylPXcHhna+MpsNrBnzdgzteHEm+3yn+U5I9wMOnMqFCO3reji069cLGYclkWlDUS/PGoqcNGPo9uVb6LZhaTgxMdD7eCjujQVmfM6N9MbnzZpr6LhC5cLNZ86LQ12VIiaquChi4rhk5TRpYiTHz4wEeNPQNOPzS8a3njI+dxiffzTsum1G0nzf0MiIiIjxge4HjgUyHj50lp7eX8AG1Jzl8ezr0p2Z7OvjXx4I6X7AgVO5EKGn9uYz/jIXRBlffzt0fn/+d/gdjRpOTJzPKGf8pX+2/Tv85q5MQMcVKhduPnNeHOqqFDFRxUURE8clI6c5Spzo2MGBb4YSf7OMDag3zl9l3+ts62ZPWaJemjXU2/nADXIb+uDBt0N731/N+Lx+rplx8P98+1/D4pOChhMTnM+migb2dXfHwFDUy5+yJeHOWz3o2ELhAjtXWRGKfZhibqKIiSouipg4Lux8hS5OdOyN6mtscN33wRo2eeHfz1y4k33/UmmdG+Q2tK2hjfGW8M7SoQeD33i5OLw01ny3MqcS3UYMDTUmOlu7GW+73lz0nfjMW7vXfBcwrQwdWyhcYOcqK0KxD1PMTRQxUcVFERPHhZ2v0MWJjj2xK5cNpOVxOd/5/pnkIvb94u1pbpDb4jOH8VYanfUdLhoKz5vLwsbEGttGDA01JuqOnGa8HV29+zvfbyyqYd/PciCfTkmWFPswxdxEERNVXBQxcVzY+QpdnOjY5I/Xm8u/1de+8/22hlbzyeDv17hBbkMPzdjEeLt2tuk7XPTdfzAUOWn6UPQrc4YG+79Gt1O1hhoT/ElfzeGK73y/9/5DtgQMS8H9PY/R8dnlAjtXWRGKfZhibqKIiSouipg4Lux8hS5Oc2zXnX42uMa8No+9C+j7M1i+jP3VfPbzrvY+N8gtaF/XI++kZKDvq7/gInnaBs/u1evotqrWUGIClnwTJi9hnN292fkXP0+bvdV8N7CyER2fXS6wc5UVodiHKeYmipio4qKIiePCzlfo4jTHXjlhnlWXvTjG789h1yr8/OLxc26QW1DYpMB2q87d7pcLWBaGn8MuVmxbVWsoMXHnagfja/eU5X5/fjLxCPt5RdIxdHx2ucDOVVaEYh+mmJsoYqKKiyImjgs7X6GL0xwLAycMoDCQ+vs5P37D7nEwVIN8JC2PzWZ8VSbl+eWi6aQ5QcyYvwPdVtUaSkzw+MvfsN/vzy+XXWA/P7w0Dh2fXS6wc5UVodiHKeYmipio4qKIiePCzlfo4jTHwsAJAygMpP5+3t58x3wC89sVbpBbUDj3D/hqPnXJLxdwfAnb0frrhei2qtZQYiJ3hfkEuj7/rN+fw3FF8PPEd5ah47PLBXausiIU+zDF3EQRE1VcFDFxXNj5Cl2c5lgYOGEAhYHU38/hHaz4txaza+61do36IB9J4ycv/ot3Jodz8eSaXnR7VardmIDYi3vdrP5x/7Z/rtg1ngohMLnGxmiHC+xcZUUo9mGKuYkiJqq4KGLiuLDzFbo4ybH8aRQMoL7nqw1X71PC8vpRH+RW+Bz+dG84F/6eEo4GtRsT92/1eM9TDHZd5nwPnw7aCOKUZEmxD1PMTRQxUcVFERPHhZ2v0MVJjoUJCDuXbn5U0Ov4uXZQLm60B3kwvVZ1xbMBJDIoF2WejSBwziK2zSrVbkx443NB8Pgsjz1sbqzZdxwdox0usHOVFaHYhynmJoqYqOKiiInjws5X6OIkx/L6vzCABrsO3r+C6+A8ttEe5MH0bEoJ46kkKiMoF/V5Vbb5pKB2Y4LzWRqVGfS6hqJqsy7w5wnoGO1wgZ2rrAjFPkwxN1HERBUXRUwcF3a+QhcnOTZ3ZQIbOGEADXbdrUaztFnytPWjPsiDKexUBZ6gckUwLm5dusWuO/DROnSbVardmDi+MdksnZd7Kuh1d290suuS3rW3UQmbC+xcZUUo9mGKuYkiJqq4KGLiuLDzFbo4ybEwYLIDdm/85QG7vgoHGkMFi50/n80Ohx7NQR5M+SHPUEElGBdQBWTHizOZDg6MnoogdmMixVNRpaX2RtDr4P1VOMgcru3tfICO0yoX2LnKilDswxRzE0VMVHFRxMRxYecrdHGKY2Gg5BVAgm0A4brnvZUBqzGMpiAPpFBFBap/RE6a4a0AEoyL/R+uZXzevtKObrsqtRMTvpM6qK4y0vXpn203y+9VXUHHaZUL7FxlRSj2YYq5iSImqrgoYuK4sPMVujjFsdfPNbMBM232NkvX290JTDXIA+mdZrNixd73V1vi4tgXezzn29mrsOJktRMTfAew1fP94D1BuL7qUDE6TqtcYOcqK0KxD1PMTRQxUcVFERPHhZ2v0MUpjoX3qmDALNh00NL1dncCUw3yQNpQaG5EOLIq0RIXZw4UejbgZKPbrkrtxITVHcBca7Ir2PVFW1PQcVrlAjtXWRGKfZhibqKIiSouipg4Lux8hS5OcWx5XI7nKJJCS9fb3QlMNcgD6YlduQFr/PrjoqmykV2ftXAnuu2q1E5MWN0BzPXqmSuWjjTSRZ2SLCn2YYq5iSImqrgoYuK4sPMVujjFsXwH8KWSOkvX290JTDXIA2nO8l0BS+r546KTL3H+xlklzMJROzHh3QGcU2np3lClxkk7gZ2SLCn2YYq5iSImqrgoYuK4sPMVujjFsTCRY5sQLt+2dL25E3iG5Z3AVIM8kMKRLsBne9MdS1zAJge+aQR2BWPbr0LtxITVHcBePo2YjHpp1lDkCzMcsbPaKcmSYh+mmJsoYqKKiyImjgs7X6GLExzLdli+OpcNsP09jy3/3p6p1ncCUw3yQHxGv/qZyWfvnyxzARtG4Hc6rt9Dx6BCrcbEd4516Xpo+f57f7fKMXw6JVlS7MMUcxNFTFRxUcTEcWHnK3RxgmN5zdr4yYtt/d7hpbHs95pONozaIPenPXc9fL7ln89AXGQtih5VNYGtxkRXe59ZA/jtJbbun704xoxPB9QEdkqypNiHKeYmipio4qKIiePCzlfo4gTH3qy9zgbK1E+32vq9kh3p7PfOZ5SP2iD3p631LYyXlJmbbXFRtC2V/V511kl0DCrUakzAsm8o8VkcaT0+sdUpyZJiH6aYmyhiooqLIiaOCztfoYsTHMtr0ULpMju/x3dmlkVnjdog96cNBecZL3C2nx0u4Mw6xmfM6DgKxmpMXPTwabdW8rn0MrMWs/GHCjZWK1xg5yorQrEPU8xNFDFRxUURE8eFna/QxQmOrUg8GvDIkmB6qbSO/R7sIB6tQe5PT+07zng5mXjEFhewY5jx+fnIfFJQqzEBZ00yPhP88xlImyoa2O/BUjA2VitcYOcqK0KxD1PMTRQxUcVFERPHhZ2v0MUJjuVVKODJlZ3f40fBHPzky1Eb5P60wHNkSd2R07a4uHXplq2jdZyuVmOiYPNB8wiY3FO27t9x7V7Aaiy6qVOSJcU+TDE3UcREFRdFTBwXdr5CFyc49tD0jWygbL3Yauv3eP3gXb9eOGqD3J+mz41kvEB5PTtc9HU/Yr8X+9o8dAwq1GpMQPWPUOr6wvEvcAwMHK9j5agibC6wc5UVodiHKeYmipio4qKIiePCzlfo4gTHxr2xwDxi4771Iza48uM5Rjo+hmqQ+9Pdv13BOIHDne1yAZNp5gtjco2NQ7ZajQl+nIuV44YC+qK1Gx3vSFxg5yorQrEPU8xNFDFRxUURE8eFna/QRXfHwqQPBsi41xeE9PvBDjweDUE+XAcHvjGfOr00K+BTp2BcHPzEfBrb1mDvaawT1UpMfOeA7BAOdM6Yv8Pz9LAJHe9IXGDnKitCsQ9TzE0UMVHFRRETx4Wdr9BFd8fCsi8MkLAMHMrvH14aZ+ksQKpBPlzv3rzP+NgzdVVIXBxdvZv9fmNRDToW2WolJvgZgInvhFYir3BLCvv9msMV6HhH4gI7V1kRin2YYm6iiIkqLoqYOC7sfIUuuju2oaiaDZBH1ySF9PtWz1qjGuTD9eqZK4yPzIU7Q+LixK4c9vtnDhSiY5GtVmIi1DMAuVYdLGK/Xx6r99E6TkmWFPswxdxEERNVXBQxcVzY+QpddHcsP3uuPPZwSL9v9SxAqkE+XOFJE/BRtDUlJC5qcyrZ78POV2wsstVKTIR6BiBX/gdOoDMZdVGnJEuKfZhibqKIiSouipg4Lux8hS66O7YkKiOsaglWzwKkGuTDFSbS7AleclFIXMBOV/YEcX4UOhbZaiUmQj0DkCuvcpM2exs63pG4wM5VVoRiH6aYmyhiooqLIiaOCztfoYvujoWJGwyQcAhxKL9v9SxAqkE+XI+sSjTf4SupDYmLey2edwjfW4mORbZaiYlQzwDk2tnWzX4/6d3P0fGOxAV2rrIiFPswxdxEERNVXBQxcVzY+QpddHdsyoxNIZ0ByNXqWYBUg3y4HvLwGWwXbzAu2C7iSZ5dxA++RccjU63ERKhnAP4Fn3AWoMZ8OiVZUuzDFHMTRUxUcVHExHFh5yt00d2xCe8sZQNsd0d/yPewchYg1SAPxGfXncB8jsRFwttLwvaJE9RKTIRzBuBf8jmAjjkYF9i5yopQ7MMUcxNFTFRxUcTEcWHnK3TR2bHfObMujKcjVs4CpBrkvgrn/gGfO16cGZTPkbh4chZgGzommToSD+GeAciVV7rRmU+nJEuKfZhibqKIiSouipg4Lux8hS46O/b+rR42MEK1hHDuw88CvHLi4qgLcl/tau81+ZyyfMSOEYyLnOW7PHzWo2OSqSPxEO4ZgFxzV8Sb77mW68unU5IlxT5MMTdRxEQVF0VMHBd2vkIXnR3bUhfeGWtci7ensftUZ50cdUHuq631LYyHlJmbR+wYwbgo2pY6Ip8UdCQerPI5kvKzKqszT6BjDsYFdq6yIhT7MMXcRBETVVwUMXFc2PkKXXR2bGNxjXkI9OrdYd3He1RHYuCjOqgGua/CTmoRR+KEe/SJU3QkHqzyOZLCkTxwHzhkGxtzMC6wc5UVodiHKeYmipio4qKIiePCzlfoorNjvYc4x4RXJeHC0TPsPsc3Jo+6IPdVOEsReCjZkT5ixwjGxYVjVew++RsOoGOSqSPxAE/sgAd4ghdOOw1hHiatigvsXGVFKPZhirmJIiaquChi4riw8xW66OzY0p2ZbGA8l1YW1n2unr7M7pO1KHrUBbmvlsfljHgItBUuvIdBL6B9GPRIPJyMzxVSFu9G9TV2n/TPtqNjDsYFdq6yIhT7MMXcRBETVVwUMXFc2PkKXXR2LD+0+FJJXVj3gd2/cB/YDTzagtxX89btZTxcPH5uxI4RjIuOa3fZffZ/+AU6Jpk6Eg/wBBR4qM+rCqude61d5uHaU/U9XNspyZJiH6aYmyhiooqLIiaOCztfoYvOjk2ZtcU8BLq+Jaz79HY9NA+DfnPRqAtyX02fG8l4uH6uecSOEYwLOE8R7hP7q/nomGTqSDxkLtzpOQS6Kax24AiZyEnTh3a+Mlvbw6Cdkiwp9mGKuYkiJqq4KGLiuLDzFbro7Fg4roQdWtzeF/a9ol+ZM7T9+elDg/3+z2ujGuS+uvf91eahxTeCH1pshQvv4dq9f0LHJUtH4mH/H9YyDu5c7Qi7rfjJi9m9ejoH0XEH4gI7V1kRin2YYm6iiIkqLoqYOC7sfIUuujoWDi2GA4vZocXG53DvB7VrYYDtbO0eVUHuqzGvzmUcDPR9NWLHGImLfR+sYffquHYPHZcsHYmHuDcWMA76uh6F3RbUqoZ73bp0Cx13IC6wc5UVodiHKeYmipio4qKIiePCzlfooqtjrR5abFXTZm9l92upvTGqgpxrX/cjhj/u9QWWOsZIXGTM32Euf54Nb/lTZw3GAzxJBvzRr34mpK0nh2sHPqwcmwvsXGVFKPZhirmJIiaquChi4riw8xW66OpY7yG7s7YIuR+cJQj3ayypHVVBzvVOc4e5ceMPay11jJG4yF+/z9wAkX8WHZssDcbDk40bq4S0ZeWwcmwusHOVFaHYhynmJoqYqOKiiInjws5X6KKrY2HnLwyIsBNYxP1KozxHyqT7P1KGapBz9R6Fs3CnpY4xEheijkDRWYPxcLPmOsOfNmebkLaAR3a4tsErNu5AXGDnKitCsQ9TzE0UMVHFRRETx4Wdr9BFV8fC2X8wIMJZgCLuV3XQrLYAZ+GNpiDnWmfhMGw7XMCTKvMQ5DR0bLI0GA+NRZ4qNWuShLRVn3/OPFx7/T503IG4wM5VVoRiH6aYmyhiooqLIiaOCztfoYuujoWyWDAgwsRNxP0u8moL6/wPsFSDnOupvfkMf0XiUUsdYyQuLpfXm2XQVsSjY5OlwXg4l1ZqVqmJzhLSFhwlww7XtvCEFosL7FxlRSj2YYq5iSImqrgoYuK4sPMVuujqWO8hu4LeMYOz7+B+GfN2jKog51q0NYXhrzlcYaljjMRFW0Mru9+hGZvQscnSYDyUx2Yz/FCuUERb7c0jH1aOzQV2rrIiFPswxdxEERNVXBQxcVzY+QpddHVs9uIYNiDCu2si7tdx/R67HxxfMpqCnOvhpXEMf9PJBksdYyQuuu70s/slvrMMHZssDcYD1O0F/A2F1ULagvP/4H5wHiA27kBcYOcqK0KxD1PMTRQxUcVFERPHhZ2v0EVXxyZP28AGxNtX2oXcz1u94rV5oyrIuR78o/Vz5qxwARUrRJ7TqKMG44FXVYE6viLaAj6jXpo1FPnCDC35dEqypNiHKeYmipio4qKIiePCzlfooqtjE95eYlZGuDsg7J7BqldQDfLhfHZ39FvqGFa4SHhnqeV7OlGD8eCtqnIzeFUVOwpPU3Xl0ynJkmIfppibKGKiiosiJo4LO1+hi46O/c7TJYG1UYOVQqMa5L58Wn26ZJUL/lTx9uXb6BhlaDAe+B8TI1VVsaM6VwNxSrKk2Icp5iaKmKjiooiJ48LOV+iio2PhqR8MhPDUSuR9vct256+OmiBnfPL3y96y9n6ZVS5Ev6epmwbiwfs6wa/mC20ve0ksu2/zqUvo2P1xgZ2rrAjFPkwxN1HERBUXRUwcF3a+QhcdHQvv/cFACO8Birxv3jrPi/sF50dNkIPa3WFqlQvRO7V100A88A1F+z/8Qmh7BRuT2X0vHD2Djt0fF9i5yopQ7MMUcxNFTFRxUcTEcWHnK3TR0bG8agU8YRJ5X350R9Wh4lET5KBQr5edMTc/ynLHsMIFHKodiE8KGogH75FC8/0fKRSqnkw4om11FackS4p9mGJuooiJKi6KmDgu7HyFLjo6tj6vyqxa8eUBofeFM9tYNRBjIjhaghy0gR+CvXav5Y5hhYuzqZ7DkGP+kk8KGoiHhqJqhvvYF3uEtnc+o5zdtyQqAx27Py6wc5UVodiHKeYmipio4qKIiePCzlfooqNjedk2qAYi8r7Bym1RDXJQ70TNYtUKq1w8qa5ibWLpNA3EA9STFlmmkGtjsdjycqK5wM5VVoRiH6aYmyhiooqLIiaOCztfoYuOji01JiowEEI9YJH3vXrmCrtv1qLoURPkoN6lWotl9axy4S1ftsDa0rLTNBAPspZq4UxBuG/63O3o2P1xgZ2rrAjFPkwxN1HERBUXRUwcF3a+QhcdHQtLa2yzRpGYKgtc4biSQJtLqAY5qHezRl6V5Y5hhYv2Jr3Ll4WrgXgo2HSQ4a4TvFkDjicKVq0GmwvsXGVFKPZhirmJIiaquChi4riw8xW66OhYqNcb6LiWcBQO2A1UvoxqkIM+Oa7F2vEiVrnQvXxZuBqIh5xlnrJ6FSOX1bOj/HiZuNfFHi8jigvsXGVFKPZhirmJIiaquChi4riw8xW66OhYOF4DBsKOa/eE3hcOQY6cNGMo6uVP/+KAaapBDmqnDJwdLmQd2K2LBuIhZcYmxmdbQ6vwNqNf/Yzde7D/a3T8w7nAzlVWhGIfppibKGKiiosiJo4LO1+hi46OjXtjARsE+7oeCb/3rjcXsXv3dj0cFUEOykuMdd2xVmLMDhcySvbpooF4SHp3BcPceatHeJt73ltp3rutGx3/cC6wc5UVodiHKeYmipio4qKIiePCzlfooptjBwe+Htr+/PSh6FfmSLn/k6eLd0dFkMOTOXjiCU8+rZSBs8tF8rT1jM/2K+3oWEVrIB5kPqVLnbWF3bu1vgUd/3AusHOVFaHYhynmJoqYqOKiiInjws5X6KKbY+/f6mEDIDxlkXF/bzm46mujIsh7Ox+Y7+m9uchWx7DKRdbCneb7hWeuoGMVrf546O/9k1kG7rV5UtrM/TyB3f9yeT06/uFcYOcqK0KxD1PMTRQxUcVFERPHhZ2v0EU3x8J7VTAAwntWMu5/dPVudn84c200BPmd5g6zbNkf1trqGFa5gDMVzXJw59CxilZ/PNxruc/w7v3dKiltFm1LZfevPVyJjn84F9i5yopQ7MMUcxNFTFRxUcTEcWHnK3TRzbFNJxvYAJizfJeU+5fsSGf3r848MSqCPJSyZXa4CFZez+nqj4eWuhsMb+qnW6W0Wbknj90f/sfGP5wL7FxlRSj2YYq5iSImqrgoYuK4sPMVuujm2NrcU2wALNySIuX+p/YdZ/evSDw6KoK8odB+2TI7XAQrr+d09ccDLM0CXliqldEmPPmD+8OTQGz8w7mQkX/Gjx+/csKECVMM3Wx8fjbQdcbPX42IiPjdxIkTZxn//0en5DNZceh0pYiJKi6KmDguGTnNUaKbY0/tzTcnaLuPSbl/oAkm1SCHaip2y5bZ4eLi8cDl9Zyu/njwTtC2yvkD5cqJes8T8Hh0/MO5EJ17jAnfz4wJXTJ8Nv5/xpjk5fu77umnn/5b42cL+NfG5y1OyWey4tDpShETVVwUMXFconOa40Q3x3qXaLNOSrl/oAGWapCf2JVrli1LtlYGzi4X16o85fUW7kTHKlr98eD9AyVJzh8oLRdusvunzZazxBwOF6JzjzHpW2NMAmfyr42JXU+AS//GuPb6uHHj/q9nnnnm3xm/M88p+UxWHDpdKWKiiosiJo5LdE5znOjmWF4GrrGoRsr94XgN9g7XrC2jIsiPb0xmeC8cs1YGzi4XcPyLWV5vPTpW0eqPh+LINKl/oNy9qWc5OBnJ0pjwJRj6gc/X3WPGjPmhv2th+df4+b8YWmR8+b84JZ/JikOnK0VMVHFRxMRxic5pjhPdHJu5IIoNgNfONkm5f2drN7v/nqkrR0WQ8zJwzaeslYGzywUcAA33T5i8BB2raPXHw5FViQzvpZI6KW3C4edw/12/XoiOfzgXonPPxIkTk8aPHz/V5+v+sWPH/mD4dT/5yU/+V1j2NSaB/2T832Do/mD57PFj014qCnio4aKIiSouipg4LtE5zXGi26QnedoGNgDelnSw8EDfV+z+McPOcQMOdONChB78xF4ZOLtcUC4H54+H9M+2+z1HUpSyg7tfmmUe3K0Rn8CB6NzjWQKe7vN1X4DrZsH7gp4v/9qYAJ798Y9//G8C5TNXXHHFFSsiOqc5ToAEnSY9u6csN8uWtfdJayPml3NZGzAZDDbYU9DE3yyzzaddLuInLzbLwd0bRMcrUv3xAEuzrJLMdbF1qv3y2akPn5ImgD+Fp4Dwedy4cca8bkIxfDYmexG+1xnf/8S47hc+X8MmEL/LwOAvik8qqOGiiIkqLoqYOC7ROc1xotukJ/oXc1gpOCgJJ6sNf/VWgQPduBChO1+Z7eHTWhm4ULg48NE6xiccOo2NV6T640FmnWqucGi3v3KF2FzIyD/GZG+bMbl739DIiIiI8ca3njImeB3G93/kc9lfw3Exhn4Em0aMyeI/OiWfyYpDpytFTFRxUcTEccnIaY4SnRzLl2dlldnimuKn3irFIPeWLfvVfNsdww4XgcrrOV2H8wCT6MhJ04d2/ny21HbT55rLzDdrrqNz4MsFdq6yItT6sL84pKAUMVHFRRETx4Wdr9BFJ8d2euoAwxM6me1AlRFoB6qOUA5yeMLpb8OLlY5hhwu+MeJy2QV0zCJ1OA+wjA44YVldZrtHVurHp1OSJbU+7C8OKShFTFRxUcTEcWHnK3TRyQrBRREAACAASURBVLFtDW1s4DskqQ4w18LNh1g7dbmnSQc559NuXWW7XHjr1+boVb82XB3OA2ykAZywsUZmu3DItG58OiVZUuvD/uKQglLERBUXRUwcF3a+QhedHHv19CU28MHRJTLbOZl4hLVzen8B6SD38rkk1nbHsMMFlNUbzicFHc4DZnxiq1OSJbU+7C8OKShFTFRxUcTEcWHnK3TRybGqyoqdzyhn7ZREZZAO8lD5tMuFt9xcdBY6ZpE6nIf6/LMmnxv2S21XRz6dkiyp9WF/cUhBKWKiiosiJo4LO1+hi06OVTXwNRScZ+3krdtLOshD5dMuF1TrAQ/n4WxqKcNZJjk+deTTKcmSWh/2F4cUlCImqrgoYuK4sPMVuujkWL70deZAodR2rp6+/BdLeRSDPNSlWbtchLrUrLsO5+FkgpqlWX/xia1OSZbU+rC/OKSgFDFRxUURE8eFna/QRSfHel9+zz0ltZ1bjZ7NJtM3kg7yUDdn2OUi1M0muutwHgq3qNmc4Y1Pjfh0SrKk1of9xSEFpYiJKi6KmDgu7HyFLjo5NndlgpLjL7zHo/gcN0MxyEM9nsUuF6EeN6O7DueBH89yqVROHWAvn57jkJLe/RydA18usHOVFaHWh/3FIQWliIkqLoqYOC7sfIUuOjmW11mVfQCu94BknwOnKQZ5qAc02+Ui1AOnddfhPPADmmUfeB2oXjU2F9i5yopQ68P+4pCCUsREFRdFTBwXdr5CF50cu/9DdSWwhpdIoxjkoZZoC4WLUErO6a7DeeB8tjffkd42K4lotCWzJKJdLrBzlRWh1of9xSEFpYiJKi6KmDgu7HyFLjo5Nn7yYjbo9XQOSm8r8Z1lrK3ujn6yQZ7wzlKTz7sDtjuGXS6e8GmvLZ11OA8Jby9RhnH3lOWsLag+gs0D5wI7V1kRan3YXxxSUIqYqOKiiInjws5XtgWKok+YMGGKoZuNz88Gum7ixIn/YPz3/TFjxvzQU2Tdr+ji2AcPvh2KemnWUOQLM9hn2e0Nf5pDMcihZi3Urn0waO+pXChcJH+8XtnTMVU6nAfgU9VTzuRpGxift6+0o/PAuZCS0AQLtT7sLw4pKEVMVHFRxMRxYecrW2JM+H5mTOyS4bPx/zPGJDA/0LXGz5qNax4bWjB27NinA12ni2P7uh6xAW/Xm4uUtJcxb8d33ueiFuT9PY8ZvrjXF4TUMexykTHfw+f5q+jYRakvD5xPVe85Zi7cydq7drYJnQfOhYycJloo9WF/cYhti4tp9OGiiInjws5XtsSYzK0xJoEz+dfGJK8nyLUfW7mnLo69e7OTDXj7PlijpD2+Q5bv6KQW5Pdauxi+vb9bFVLHsMvF0dW7TT5L5O6QVam+PHS2/uXOcZl67Is9rL3Gohp0HjgXInKYbKHUh/3FIbYtLqbRh4siJo4LO1/ZEmPCl2DoBz5fd8MSr79rjQlgZERExOvG/6t/8pOf/IdA99TFsS11N9iAlzZ7q5L2hp+RRy3IWy+2mmfzzdwcUsewywXns+ZwBTp2UerLAz/rUNXZfCU70ll71Zkn0HngXMjIaaKFUh/2F4fYtriYRh8uipg4Lux8ZUuMyVzS+PHjp/p83T927NgfBLj8Kfjn6aef/ltjolgf6J7g2MePTTIwtenkRTbg5a6IV9JehbfqSAH7GjjQhQsRyqtzHF4aa/t3Q+Gicvcxb5UMbOyi1JcHb7WTxTFK2j61N5+1V7knD50HzoXgdCZFqA5U1HBRxEQVF0VMHBd2vrIlniXg6T5f9/m7LiIi4h3jZzGeL//KmAD+t0D3HNJEbpyoYwPeyZ3pStq7nHeatXd2z1El7amWllPmhLo8MlVJe1eOV7H2qpKOKGlPtbSebjDrKm89pKS95iKzHvCp+MNK2rMigtOZFAE7KQ5U1HBRxEQVF0VMHBd2vrIlxqTup/AUED6PGzfOmNdNKIbPxqQwwvc6YwL4c+Pn/wifn3vuuX9vXFcZ6J7gWB2eelUdKmID3oldOUrau3jcHGDzN+z3PuHQhQsRei6t1JwAxmbb/t1QuGgoPG/yuX4fOnZR6svD+fQycwK4M1NJ25dKalh7x9YkofPAuZCZ20QJ1YGKGi6KmKjiooiJ48LOV7bFmOxtMyaB73ve8YPjXZ4yJngdxvd/NOy6mfC00PjZJifsAi6PPWw+kUspUdJe86knS6QUg/xkgmeJO7kwpI5hl4urZ654l0ixsYtSXx4qPEvcp/YdV9L29XPNrL3M+VHoPHAupCc3AUKpD/uLQ2xbXEyjDxdFTBwXdr5CF10ce3xjMhvw6vOqlLQ3fJMEtSAv3JJibnLJPRVSx7DLxa1GzyaJ6RvRsYtSXx68m1yy1WxyaW+6w9pLnrYenQfOBXausiKU+rC/OMS2xcU0+nBRxMRxYecrdNHFsYeXxrEBr6myUUl791ruf+eYFGpBfmSleczN5bILIXUMu1x03upRekyKCvXlgR9z01hSq6RtqFAD7UGFFWweOBfYucqKUOrD/uIQ2xYX0+jDRRETx4Wdr9BFF8emzNrCBrzW+hYl7Q0/KJlakKfP3c7w3ay5HlLHsMvFQN9X5kHJr81Dxy5KfXngB13D0qyKtqHaCFQdgRrL2DxwLrBzlRWh1If9xSG2LS6m0YeLIiaOCztfoYsujoUncTDAwpM5VW1GvfzpUOSkGaxUGrUg3/+HtYzPjmt3Q+oYoXAR/Ys5nlJpX6PjF6G+PMBSLCt1p7A0G1QdgTbhjxUduMDOVVaEUh/2F4fYtriYRh8uipg4Lux8hS66OBaexKke7BImL2Ft9twbJBfkXmydgyF1jFC42D1lOWuz604/On4R6stD4m+Wmdja+5S1v2fqStYmVCHRgQvsXGVFKPVhf3GIbYuLafThooiJ48LOV+iig2PhCVzkpOnsiZzKdvd/+OQpGaUgf/Dg2ydPN43PoXSMULjAeEomU315YE83DWwqn26mzNjE2mxraNWCC+xcZUWo9OFAcYhti4tp9OGiiInjws5X6KKDY3vuDrCBLuGdpUrbTf/syXtylIK8r/uR+X7jGwtC7hihcAFHlqh8T062ch4G+833G2N+OVdp+3BEEbQLRxbpwAV2rrIiVPqwvzikhIsiJqq4KGLiuLDzFbro4Nj2ZvPIiwMfrVPabu7nCeZO2fJ6UkHu3eH8/uqQO0YoXBxdk6R0p6xs5Tx03TZ3OCe9u0Jp+/kbDphHI+Wf1YIL7FxlRaj0YX9xSAkXRUxUcVHExHFh5yt00cGxN85fZQNdxrwdStst3HyItVuXe5pUkMNOasCVOmtLyB0jFC6KI9OUnpUnWzkPty/dYrgOfvKl0vbLYrLNw9FTS7XgAjtXWREqfdhfHFLCRRETVVwUMXFc2PkKXXRw7KUSsw4wnLWmst0Tu3I91TKKSAU5nKUIuHKWxYXcMULhojIpz6yWsTcfnQMRynm4VmVWOclauFNp+1DFhdXHjs/VggvsXGVFqPRhf3FICRdFTFRxUcTEcWHnK3TRwbE1hyvYQAfVFlS2C2XnfOvl6sCFCIVqKoALqquE2jFC4aI68wRrtyQqA50DEcp5aCyqNuvyfrFHafvwZBrahSfVOnCBnausCJU+7C8OKeGiiIkqLoqYOC7sfIUuOjgW6qvCQAf1VlW2e+HYk4kSpSD3ndiG2jFC4aKh0Jwo5a3di86BCOU8VGd5JrY70pW2D++mQrvwrqoOXGDnKitCpQ/7i0NKuChiooqLIiaOCztfoYsOji2NymQD3fmMcqXtNlU0eJdKKQU5LBnype1QO0YoXHiXShdFo3MgQjkPlXvMpW34X2X7N2uvs3bT5mzTggvsXGVFqPRhf3FICRdFTFRxUcTEcWHnK3TRwbHwxAgGOniCpLLdlgs3zc0Sn24lFeTezS1HTofcMULh4pZ3s8RGdA5EKOcBnvwBruqsk0rb77h+j7W77/drtOACO1dZESp92F8cUsJFERNVXBQxcVzY+QpddHAsvFwPAx08QVLZ7t2bnd7jUigFOT/e5sqJ+pA7Rihc3L/di3JciizlPMC7f+wPlCK1f6D03n/I2o1/c5EWXGDnKitCpQ/7i0NKuChiooqLIiaOCztfoYsOjoXjNWCggydIKtvt7TIH2F3GAEspyGHJEHC11N4IuWOEwsVg/9coBybLUs7Dkz9QmpS2D1Vcdrw4k2koFV1Ec4Gdq6wIlT7sLw4p4aKIiSouipg4Lux8hS46OHb3b1ewARaeIKlslw+wkS/MML7+lkyQ7//wC0+Ju3shd4xQuYh+9TPlJdNkKefh4B9x/kABhad/0DY8DcTmAjtXWREqfdhfHFLCRRETVVwUMXFc2PkKXXRwbMyrc81JQ7/6SQMfYPu6HpIJ8vjJi81JQ+eDkDtGqFzsnrKctd3V3ofOQ7jKeUhC+gMFFN7/Y5P566FN5kVygZ2rrAiVPuwvDinhooiJKi6KmDgu7HyFLtiO9S4bvoqzbLjvA3OAvXezk0SQw1PNqJdmsaeaoS4bhtPh+dOy21fa0bkIVzkPsKQNmAb6vlJuQ9rs8JbzRXKBnausCIU+HCgOKeGiiIkqLoqYOC7sfIUu2I7lGwdgGRij/bTZW1n7rRdukAjyvq5H3vcaw+kYoXKRyd+XO6v2fTkZCvj/9X/8T4YHlrYxbMhdER/Whh6RXGDnKitCoQ/7454aLoqYqOKiiInjws5X6ILtWOyjQ3KW72Ltw5mA2FyIUL6zGZ5shtMxQuWC75htLKpB5yJcBfz/9atvzT9QpixHscG3XjU2F9i5yopQ6MP+uKeGiyImqrgoYuK4sPMVumA79uoZ3MODCzYms/YvHDtDIsh9zzYMp2OEykVxJM6ZeTIU8D+6Zz6hTp62AcWGJ4d6F6JzgZ2rrAiFPuyPe2q4KGKiiosiJo4LO1+hC7ZjGwrOm+XD1uGUDyuPPczaP5tSTCLIvdVNlu8Kq2OEygWvmnFqbz46F+Eq4O++epvhyZwfhWLD2dRS1n5ZTGhl/URygZ2rrAiFPuyPe2q4KGKiiosiJo4LO1+hC7ZjofwbDHBQDg6j/aqDRaz9E7tySAQ5r28MTzbD6RihcgFP/jDq5spQwH/r3GWG5+jq3Sg21OefZe3nbziAzgV2rrIiFPqwP+6p4aKIiSouipg4Lux8hS7Yjq3Yfcx8YrTvOEr7UC4N2i/cfJBEkFcdKmZ4yuNywuoYoXIB7/5B+/AuIDYX4Srgv1psPqEu3p6GYkNzZSNr//DSWHQusHOVFaHQh/1xTw0XRUxUcVHExHFh5yt0wXZs0bZUNsDVHK5AaR92V0L7sNsSmwsRCk8yAQ9MBMPpGKFyAbt/2ZLpwp3oXISrgP9ChrkEC3+oYNjQerGVtZ8yczM6F9i5yopQ6MP+uKeGiyImqrgoYuK4sPMVumA79siqRDbAXSqpQ2n/Zu111n76nG0kgrxg00Fz1+jRM2F1jFC5uH3ZfGcOzgPE5iJcBfxndh9heOBVBQwbOlu7Wft7pq5E5wI7V1kRCn3YH/fUcFHERBUXRUwcF3a+Qhdsx2bM38EGuOvnmlHah3Jp0D6UT8PmQoQ+OTfuYlgdI1Quutpxz3UUqYC/dKs5ob5YcB7Fhv6ex6z9uNcXoHOBnausCIU+7I97argoYqKKiyImjgs7X6ELtmPheA3MyhE9nYOsfSifhs2FCPVWjqgLvXJEOB0eu7KLSAX8xz43J9RXT19GscFb2WVS6JVdRHGBnausCIU+7I97argoYqKKiyImjgs7X6ELtmN3I9ZZBYVBFQZXGGT//Oc/Oz7Iee3Yuzc6w+oY4cQFL52GUdtZpAL+jNlbGJa2hjY0O3i96t77D1G5wM5VVgQ7n8ninhouipio4qKIiePCzlfogu3YmNfmodVZ5Rr3xgJmw//7L//d8UHunSx0hT5ZCLfDJ72LO6kXpYB///urGJbOtm40O/a+v9qc1N8MfVIvggvsXGVFsPOZLO6p4aKIiSouipg4Lux8hS6Yjn0w+M3Q9uenD+18ZTZqIPAB9puBR44OcniauePFmUzDWS4Mt8NDWT/gE8r8YXMSjgL+uNfnMyz9vX9CsyNllvkUsrW+BZUL7FxlRagOVNRwUcREFRdFTBwXdr5CF0zH9twz379LeHsJaiDwAXbg1n1HBzk89WPvM765KOyOEU5cZC3cyey4VnUFnZNwVJc/ULKXxHreQ7yEZoNTkiXVgYoaLoqYqOKiiInjws5X6ILpWN8duJiBAIfsgh33Gm44OshhiRBw7PtgTdgdI5y4gEOgwQ44FBqbk3C0524/w5H4zlJUO6BMItjRgLQTmccEdq6yIlQHKmq4KGKiiosiJo4LO1+hC6ZjYacqDGxps7eiBgKU2WI7ZyvrHR3ksEQIOFJnbQm7Y4QTF8WRaebh3tk4h3uL0jtX7zAcBz5ah2oHlNUDO6ozT6DZ4JRkSXWgooaLIiaquChi4riw8xW6YDq2qaKBDWw5y+JQA6EsOss8jPrYKUcHefOpS0LKhoXb4Xl5v9P7C9A5CUdvVF9lODLmRqLaUZmUZ5ZL3JuPZoNTkiXVgYoaLoqYqOKiiInjws5X6ILpWF0K3Z85UGg+YTlY4Oggh8OKGZ/r94XdMcKJi3NpZcwOmFhjcxKOXi6rYziOrkpEtQOqkIAdpVGZaDY4JVlSHaio4aKIiSouipg4Lux8hS6Yjj2Xbk4USpEnCrU5lWa915hMRwc5LBGKmCiE2+H5xP74xmR0TkTERdHWFFQ7Lh4/5/lDaT+aDU5JllQHKmq4KGKiiosiJo4LO1+hC6ZjK5LMpcJT+46jBsLlsgvMjsL1ex0d5LBECDgq9+SF3THCiYumk56l/eXx6JyEo2cOFJh/GCQeQbWjubLRs7SP96qEU5Il1YGKGi6KmKjiooiJ48LOV+iC6djiSM/L7VknUQPhRvU1c8KyaKejgxye/AEOWDIMt2OEExcttZ7NPXO2oXMSjpbFmO+GnkstRbWj5cJNc3PPp3ibpZySLKkOVNRwUcREFRdFTBwXdr5CF0zH5q31HG9RWI0aCO1N5m7P1OlfOjrI4d0/wHExzONCwu3wHdfumsf7/GEtOifh6PEvzd3h9XlVqHZ0XDePS4Iyf1g2OCVZUh2oqOGiiIkqLoqYOC7sfIUumI7NXhzjOeD2MmogdLX3MTv2vve5o4Ocn2cIu4HD7RjhxEXP3QHzgG/k8/PC1dwV8QwH7FbHtKOn0zwwPX7yYjQbnJIsqQ5U1HBRxEQVF0VMHBd2vkIXTMemzNzMBra2hlbUQBjs/5rZEfvaPEcHOSwRiigZFm6HHxwwK2hE/2IOOifhaPqcbeb5kHU3UO2AiiSRk6YPRb38KZoNTkmWVAcqargoYqKKiyImjgs7X6ELpmN5Dd57LffRgyH6lTnMFhhssW0JVWGJEDDcvdEZdscINy5ifjmX2QKTa2xeQtUDf1jLMHRc60C3JfZXuDWJnZIsqQ5U1HBRxEQVF0VMHBd2vkIXTMfuenMRG9T6uh6hBwOU+wJbYPkS25ZQFZYIAUNv54OwO0a4cbF7ynJmCyyvY/NCISaS3v2c2XL/Vg9K+05JllQHKmq4KGKiiosiJo4LO1+hC5ZjHzz4dmjHizOHIl+YwT5jB4NOT3tCVVgijJwUPp8iOnzytPWMT9hgg81LqKrTU+GDf/yS2XL78m2U9p2SLKkOVNRwUcREFRdFTBwXdr5CFyzH9nU/YgNa3BsL0AMB9Mn7XtfRbQlFYWmQ8fn6fCEdI9y4yJi3g9kDR+xgcxOK6vZeaOb8KGbP9XPNKO07JVlSHaio4aKIiSouipg4Lux8hS5Yjr3X2sUGtD1TV6EHAqguOz5DVVgaZHy+t1JIxwg3Lo6sTGT2XC6vR+cmFNVtZ/jR1bvNetUldSjtOyVZUh2oqOGiiIkqLoqYOC7sfIUuWI691djGBrRDMzahBwKoLme+haqwNAj2H/zkSyEdI9y4KNx8iNlTd/QMOjehqG5nQ0I5OrAHytNhtO+UZEl1oKKGiyImqrgoYuK4sPMVumA59lrVFTagZS2KRg8EUG/VhzTcqg+hKiwNgv2ZC6KEdIxw46I8LofZU3WoGJ2bUNRbHWZxtBaJ72R8LrPnTHIRSvtOSZZUBypquChiooqLIiaOCztfoQuWYxuLatiAduyLPeiBAHp6v6fu6+6j6LaEorA0CPbDUqGIjhFuXMBEBeyBiQs2N6GobvWhYSIN9sDEGqN9Wcly/PjxKydMmDDF0M3G52cDXff3f//3zxnXbImIiPidcd1U3fKZbO6p4aKIiSouipg4Lhk5zVGC5dia7Ao2oBVvT0MPBGbPYb3ssauwNAj2F21LFdIxwo2L2txTpj1bU9C5CUVh6ZpNYHdmaJH46o6cZvYUbD6I0r6MZGlM5H42ceLEZPhs/P+MMcHLD3St8fOqMWPG/HDs2LFPG9eV6ZbPZHNPDRdFTFRxUcTEcYnOaY4TLMd6n7gl6vHErbHYfCKZt1aPJ5J29UxyoTlhSTgipGOEGxeXSsU9kcRQ/sTt/P58LRIffyKZuzIBpX0ZydKY1K0xJoEz+dfGxK7H33XGNS8Z1xb4fOtvAt2T6kBFDRdFTFRxUcTEcQlMZ84ULMeWxWRr9c6dbu8k2lWR79yJ6PAi30nEUP7OXUPOSS0SH38nMX1uJEr7MpKlMeFLMPQDn6+74Snf8OuMyd8y42clxkTwLeP/OREREf+sWz6TzT01XBQxUcVFERPHJTqnOU6wHHt8Y7JWu25125VsV2FpUNSuWxEdXuSuZAzlu26vlVZrkfj4ruTkj9ejtC/pCWCS7/t8xtf9Y8eO/cHw64xJ3+eGnvV8+VfG52bd8pls7qnhooiJKi6KmDgu0TnNcYLl2JzlnnP3Tupx7l4nP5fwd3qcS2hXYWlQ1Ll7Ijo8P5cQSphhcxOK8nP3blc3aZH4+LmEUGIPo32JS8DTfb7uC3Dd+8Z16fzrQE8KeT57/Ni0l4oCHmq4KGKiiosiJo5LdE5znGBNANM8lTdu1l5HH1xB+3v0qkxiV2FpUFTlDYiHcOOCVyaJ/VX4lUkwlFfe6L56G6V/DFdemSTml3NR2gcOROceY2L3U3gKCJ/HjRtnzOsmFMNnY7IX4XudZ+NHhefL7xufm4LlM1dcccUVKyI6pzlOgASMAW6/p/bunau61N79dijqpVmsPrEOtYntKiwNstq7zeHX3hUxAQTd+fPZQ5GTpmtRS9euwtI18Pnwbq8WE0BQXpt4cEA9nzImgCDGZG8bPOEzNDIiImK88a2njAleh/H9H/leZ3zvj4YuML6/CiaOwfIZxScV1HBRxEQVF0VMHJeMnOYowZoAJryz1HzC0jGAPrDyAS5h8mJmU1/XI3R77CosDYLtsFQoggsRcZEweQmzqbfzATo/dhWWrsH2//Loa5T+4ZdPxD4DHGDnKiuClc9kc08NF0VMVHFRxMRxYecrdMFybPQv8J5mBAqGAx+uYTbda7mPbo9dhaVBxmf/10K4EBEX+35v8nn3Ric6P3YVlq7B9v/x3/8/bRIf5lNzpyRLqgMVNVwUMVHFRRETx4Wdr9AFw7HY7zMFCobMOVuZXW0Nrej22OLTmESD3TCpFsWFiLhI/dTks7W+BZ0jOwpL1rB0HfXyp1olPsz3Zp2SLHXyl0juqeGiiIkqLoqYOC7sfIUuGI7F3tEYKBiOfW7uTL56+jK6PXYUlgTB7sR3lgnjQkRcHF4ax+xqrmxE58iO9nQOMrvjJy/WKvFh7px3SrLUyV8iuaeGiyImqrgoYuK4sPMVumA4FvtMs0DBULLFPEuvobAa3R47CkuCYPeBj9YJ40JEXORv2M/sunj8HDpHdhSWrMFuWMLWKfEd//IA2tmZTkmWOvlLJPfUcFHERBUXRUwcF3a+QhcMx2JXNQgUDKcTzGoa1Vkn0e2xoy21N5jdsEQoigsRcVG6M9Msp5ZRjs6RHYUla7AblrB1Snxl0Vlo1XOckix18pdI7qnhooiJKi6KmDgu7HyFLhiOxa5rGigYalPN+q+n9h1Ht8eOwpIg2A1LhKK4EBEXp/bmM7sq9+Shc2RHYcka7D68LE6rxIdZP9spyVInf4nknhouipio4qKIiePCzlfoguFYKFcGAxmUL8MOAt9guJx3mtlVGp2Fbo8dhSVBsBvK64niQkRcVGeeYHaVRGWgc2RHYcka7M5fv0+rxFeTXcHsKt6eprxtpyRLnfwlkntquChiooqLIiaOCztfoQuGY6sOmU/ayuNy0IPANxhaKuvNgX/DAXR77CgsCYLdZTHZwrgQERcNBeeZXXnr9qFzZEdhyZr9IbAzU6vE11hUw+w69sUe5W07JVnq5C+R3FPDRRETVVwUMXFc2PkKXTAcezI+lw1kZ5KL0IPANxjuXjTfpctZFodujx2FJUGwG5YIRXEhIi6unr7E7MpeEovOkR2FJWv2KsDefK0S37WqK8yurEXRytt2SrLUyV8iuaeGiyImqrgoYuK4sPMVumA4tmhrChvIanMq0YPANxj6W++Zmylmi9lMoUphSRDsrjlcIYwLEXHRerGV2ZUyaws6R3YUlqzNzUAntEp8bQ1tzK5DMzYpb9spyVInf4nknhouipio4qKIiePCzlfoguHYo6t3s4HsUkkdehD4BsNXvQ+YXfs/XItujx2FJUGwG5YIRXEhIi7u3rxvHqfywRp0juwoLFmbxwGd1yrx3WvtYnbtmbpKedtOSZY6+Usk99RwUcREFRdFTBwXdr5CFwzHZi6IYgPZ9XPN6EHgGwz/8u1/YXYlvL0E3R47CkuCYDcsEYriQkRc9N5/aB6o/NZidI7sKCxZmweCX9Iq8fV1P2J2xb2xQHnbTkmWOvlLJPfUcFHERBUXRUwcF3a+QhcMxx785Es2kN2+fBs9CHyD4V//578ObX9++tDOV2aj22NHSIydFQAAIABJREFUYUkQ+LzV2CaMCxFx8eDBt0ORk2awkmrYHNlRWLJmJQEvtmiV+IDPHS/OHIp8YQb7rLJtpyRLnfwlkntquChiooqLIiaOCztfoQuGY5Pe/ZwNsPdv9aAHwfAgj31tHrNtoO8rdJusKiwJgs2drd1CuRARF3GvL2C29fc8RufJqsKSNdh872andolv15uLmG19XY+UtuuUZKmbv0RxTw0XRUxUcVHExHFh5yt0wXBs7K/mm5OC3j+hB8HwIE/67Qpzcnq7F90mqwpLgiInWSI7/J6pK83JaZuYyakKhSVrc5L1ULvEt/f91ebktOW+0nadkix185co7qnhooiJKi6KmDgu7HyFLqod+2Dwm6HISdO1WxbkQX7wjxvYANt+pR3dJkt8epYFQUUtC4rs8IembzSXpy/dQufKqkJswtL1w4ffapf4UjzL/W0NrUrbdUqy1M1forinhosiJqq4KGLiuLDzFbqodmxP56C5MWCyXhsDeJBnzt/B7Ltx/iq6TVYUlgLBXlgaFM2FiLjIXLjT3KBytgmdKysKT1HZRovXF2iZ+LIXx3g2qFxW2q5TkqVu/hLFPTVcFDFRxUURE8eFna/QRbVj797oNI8G+b1eR4PwID+yKpHZB/WKsW2yorAUCPbC0qBoLkTExdE1SeYRNSW16FxZUViqZketvLdSy8SXt3av54iaaqXtOiVZ6uYvUdxTw0URE1VcFDFxXNj5Cl1UO7a1voUNYKmfbkUPAH9BXrjlELOvLvc0uk1WFJYC2WHLMzcL50JEXBRtSzUP/T6sz6HfwRSWqsHeg59s1DLxFUemew6pPqm0XackS938JYp7argoYqKKiyImjgs7X6GLasc2VzayAezwUr3KrfEgP7Erh9lXdVCfMnXBFJYCWbm1xTHCuRARFycTj5hl/w4UonNlRWGpGuyFpWsdE19F0jGzTN2+40rbdUqy1M1forinhosiJqq4KGLiuLDzFbqoduzF4+fYAJa/fh96APgL8qpDRcy+E7ty0W2yog1F1cxeWBoUzYWIuDibWsrsK489jM6VFYWlarAXlq51THzn0sqYfaXRWUrbdUqy1M1forinhosiJqq4KGLiuLDzFbqoduz5jHJzAIvKRA8Af0Fed+Q0s69wSwq6TVYUlgLBXlgaFM2FiLi4cKyK2Vew6SA6V1YUlqrBXli61jHx1eefNf+A2nBAabtOSZa6+UsU99RwUcREFRdFTBwXdr5CF9WOrdyTZy5h7c1HDwB/QX65rI7ZB5tBsG2yorAUCPbC0qBoLkTExZUT9cy+3M8T0LmyorBUDfaeTDiiZeJrqmhg9uUsU/sKhVOSpW7+EsU9NVwUMVHFRRETx4Wdr9BFtWNLojLMl9gzT6AHgL8gv3G+mdmXMX8Huk1WFJYCwd5z6WXCuRARFzdrrjP70uduR+fKipbHZjN7z6aUaJn4WupuMPvSZqvdROWUZKmbv0RxTw0XRUxUcVHExHFh5yt0Ue3YvHX7zGMsCs6jB4C/IG9vamf2JU/bgG6TFYWlQLC3Pv+ccC5ExMWd5g5m34GP1qFzZUVhqRrsvXD0jJaJr+PaPWbf/g+/UNquU5Klbv4SxT01XBQxUcVFERPHhZ2v0EW1Y7OXxHoOsr2EHgD+gryrvZfZt/u3K9BtsqKwFAj2wtKgaC5ExEV3Rz+zL/E3y9C5sqKwVA32wtK1jomv5555kHrC20uUtuuUZKmbv0RxTw0XRUxUcVHExHFh5yt0Ue3YlFlb2AAG5wFiB4C/IB/s/4rZF/vaPHSbrGja7G3MXlgaFM2FiLgYHPia2Rfz6lx0rqwoLFWDvbB0rWPig1KK25+fPrTzldlK23VKstTNX6K4p4aLIiaquChi4riw8xW6qHYsL2Z/92YnegAECnIYXGGQhcEW266RdP+HaxmfsDQogwsR94t+9TNmI0wGsfkaSWGpGmyFpWtdE1+M8ccJ2DjQ95WyNp2SLHX0lwjuqeGiiIkqLoqYOC7sfIUuqh0b/9ZiNnj13n+IHgCBgjxh8hJmIyy3Yds1ksJSoGhbRXd4WP4FG2E5GJsvq7Z23enXNvHB6wlg4/3bvcradEqy1NFfIrinhosiJqq4KGLiuLDzFbqodmzUy58ORU6aMfTgwbfoARAoyOEFe9FP1WSpjKeVoju871M1bL5GUliq5k8rdU18sEEJbLx9pV1Zm05Jljr6SwT31HBRxEQVF0VMHBd2vrIt48ePXzlhwoQphm42Pj8b7nUqHdvf85gNXHGvL0B3frAghyM2RL9XJ0NhCZC9Xyf4fUXRHd73vTpszoIpf18Rlqxl8CBK4YgisPPG+avK2nRKstTRXyK4p4aLIiaquChi4riw85UtMSZyP5s4cWIyfDb+f8aY3OWHcx2ISsd2tnWzgWvP1JXozg8W5N6dtZWN6HYFU1k7lkV3+Cc7ay+icxZMh+9Y1jXxwSHlYOflsgvK2nRKstTRXyK4p4aLIiaquChi4riw85UtMSZza4zJ3Uz+tTGx6wnnOhCVjr116RYbuA5+shHd+cGCXMbZejK0/YqcMwtFd/iCjcnm2XrHqtA5C6bDzyzUNfEVbj7E7KzLPa2sTackSx39JYJ7argoYqKKiyImjgs7X9kSYyKXYOgHPl93jxkz5oehXgei0rHXzjaxgStz4U505wcL8tKdmcKra8hQWAKUUbVEdIf3VtdILUXnLJh6q5Z8tl0KD6L0xK4cZmfVwSJlbTolWeroLxHcU8NFERNVXBQxcVzY+cqWTJw4MWn8+PFTfb7uHzt27A9CvQ5EpWMbS2rZwHV0TRK684MFOdQpFl1fV4bCEqCMusWiO7y3vm7iEXTOgiksUbO6xSvipfAgSmHiB3bCRFBVm05Jljr6SwT31HBRxEQVF0VMHBd2vrIlnqXd6T5f94VzHQg49vFjkwzZWptTyQau4u2pStqzo8AB56Im6ySzs2RHOrpdwbTuyGlmZ+GWQ9K4oO53X63Pq2J2FmxKlsKD7n4fKSbEZjM5QnWgooaLIiaquChi4riw85UtMSZyP4Wne/B53LhxEwwphs/GZC/CynX+ZEihXMw+wQaumkOFKpu1LW1Vl8wJ4JaD2KYElcYjFczO8wfysU0JKrfPXzEngJsOYJsSVC4dO2Uu/e/LwzYlqLTXNDM7izbsU9quzNwmSsBOigMVNVwUMVHFRRETx4Wdr2yLMdnbZkzu3jc0MiIiYrzxraeMCV6H8f0fjXCdXwHHqnrCwd8FO5daiv4Uxd8TDs7FtTOXmZ3ZS2LQ7QqmJ+NzzXfBDhVJ40LE/a6fM9/9zFq0E52zYFqReITZeSa5UAoPovRGtfnuZ+b8HcradJ8AugOwi2l04qKIiePCzlfootKx3t2gR8+gOz9YkLdebGV2pszcjG5XMC3ckiJlN6joDs93fx+art/ub18t2pZqPqE+XCGFB1F6W9Lu75FiAjtXWREd/SWCe2q4KGKiiosiJo4LO1+hi0rHPjkPrh7d+cGC/O7N+8xOqFuMbVcwlXUenOgOr/P5j74Km5PAzsbiGik8iFIoASfj/MeRYgI7V1kRHf0lgntquChiooqLIiaOCztfoYtKx+pcEcI3yHu7HjI7d725CN2uYMorQlw/1yyNCxH307kCjK9mLdzJ7LxW1SSFB1EqqwLMSDGBnausiI7+EsE9NVwUMVHFRRETx4Wdr9BFpWN1rgnrG+RQpzjyhRlDO16cqV3NYl+VVRNWRofXtQa0r8ISNfAJS9ayeBClMmpAjxQT2LnKiujqr3C5p4aLIiaquChi4riw8xW6qHQslNiCARZKbmE7f6Qgj3tjAbMVnl5h2xZIk95dwWyEJUGZXIjQ+LcWM1vh6So2b4EUlqjBRliylsWDKE14ewmztefeoJL2nJIsdfVXuNxTw0URE1VcFDFxXNj5Cl1UOjb61c/YoDU48DW680cK8j1TV5mTgdZudNsCaexr85iNsCQokwsRCu9Tgq3wfiU2b4EUlqh9J/06J779H65ltnZcu6ekPackS139FS731HBRxEQVF0VMHBd2vkIXVY6FSR8MWDAJxHa8lSD3Lgc2tqHb5k9h6Q+WAGEpUDYXIjRl1hbGJ+ywxubOL5+w7D9pxlDUS7Ok8iBK02ZvZXy21N1Q0p5TkqWu/gqXe2q4KGKiiosiJo4LO1+hiyrHwrIvDFiwDIzteCtB/mRDwBV02/wpLP2BfQmTl0jnQoRmL4ll9l49fQmdO3/KN/7E+2z80Tnx5SyLY/Y2VTQoac8pyVJXf4XLPTVcFDFRxUURE8eFna/QRZVjYeMHDFiwEQTb8VaC/NgXe8wjQYpq0G3zp7D0B/bt//AL6VyI0Lx1+5i9DQXn0bnzp/6O/tE58eVvOMDsrc8/q6Q9pyRLXf0VLvfUcFHERBUXRUwcF3a+QhdVjoWjX2DAgqNgsB1vJciLt6eZhwJnV6Db5k9bLtxk9sFSoGwuRGhJVAaztzrrJDp3/tR7+PesLVJ5EKWl0VlmVZ20MiXtOSVZ6uqvcLmnhosiJqq4KGLiuLDzFbqociwc/gwDFhwGje14K0FekXiU2Xt6fwG6bf60qbKR2QdLgbK5EKGVSXnM3lN789G586ewNG2W/4uVyoMoPbXvOLO3IumYkvackix19Ve43FPDRRETVVwUMXFc2PkKXVQ5Fsq/wYAF5eCwHW8lyM+mljJ7y2Ky0W3zp/X555h9sBQomwsRej6jnNlbujMTnTt/CkvTYF/eur1SeRCl8CQV7C2OTFfSnlOSpa7+Cpd7argoYqKKiyImjgs7X6GLKsfyCVV5rJ4TquFBfuFYFbP3uKYT1nPpZdImVDI6/MXjfMK6H507f8onVCU7nkyodE58DYXV5oR17V4l7TklWerqr3C5p4aLIiaquChi4riw8xW6qHLsycQjbMA6c6AQ3fFWgvzKiYvmEuvyeHTb/Cks/claUpXR4Zs9S9aHl4pfshahwCPYB0vVMnkQpVdPXzaXrBfHKGnPKclSV3+Fyz01XBQxUcVFERPHhZ2v0EWVY4u2pbIBq/ZwJbrjrQT5zVpz00ranG3otvlTeFIla1OFjA7fWt8ibdOKCIUnqWAfLFXL5EGUtjV4Nq3M2KSkPackS139FS731HBRxEQVF0VMHBd2vkIXVY49uibJPFalpBbd8VaC/M5VvY+tgXfV2LEqhdXSuRChd290Sju2RoTC0jTYB0vVMnkQpfdaPMfW/G6Vkvackix19Ve43FPDRRETVVwUMXFc2PkKXVQ5NpMfrHy2Cd3xVoK8u2PAPLj6HT0ProalP/Ng5cvSuRChPZ3yDq4WobA0DfbBUrVMHkRpX9cjZu8un4OrZapTkqWu/gqXe2q4KGKiiosiJo4LO1+hiyrHekurXbqF7ngrQT448I1Zuu4Xc9Bt86cpMzdLK60mo8ND6brISdOHdv5cfOk6EeotrXbhplQehPEJpetemDG048WZ7LPs9pySLHX1V7jcU8NFERNVXBQxcVzY+QpdVDl2z9SVbIDtbOtGd7zVII95dS6zebD/a3T7hitUrADboIKFCi5EaOyv5jOb+3v/hM7fcIWlabCt4/o96TyI0rg3FjCb+7ofSW/LKclSZ3+Fwz01XBQxUcVFERPHhZ2v0EWVY+NeNwer/p7H6I63GuS7pyxnNne196HbN1xh6Q9sgxq2KrgQoUnvfs5svn+rB52/4QpL02AbLFXL5kGU7pm6itl8r7VLeltOSZY6+ysc7qnhooiJKi6KmDgu7HyFLiocy5arJs0Yinr5U3Sn2wny5I/XswG2vekOun3D+Yx6aRZbApSx/Cerwx/85EvG5+0r7egcDldYmoYlaliqls2DKD00YxPjs62hTXpbTkmWOvsrHO6p4aKIiSouipg4Lux8hS4qHNt7/yEbqOLfWozudDtBnj43ktl9o/oaun2+Ck9RwS5YAlTFhQjNnB/F7L5+rhmdQ18d6PuK2QVL1Cp4EKVZi6LNjVVVV6S35ZRkqbO/wuGeGi6KmKjiooiJ48LOV+iiwrF3b5pHgOz7YA260+0EOdQtBrsvl9ej2+erna3dzC5YAlTFhQg9uno3s/tSaR06h756/3Yvsyvp3RVKeBClx77YYx6tVFQjvS2nJEud/RUO99RwUcREFRdFTBwXdr5CFxWOhZ2q7NDaWVvQnW4nyAs2HWR21x09g26fr95qbGN2wc5qVVyI0KKtKeZh4Lmn0Dn0VViSBrsO/vFLJTyI0uLtaczumuwK6W05JVnq7K9wuKeGiyImqrgoYuK4sPMVuqhw7NXTl8yyVUti0Z1uJ8jLYw8zu6sOFaPb56uw5Ad2ZS3cqYwLEXoyPtcsB5hchM6hr8KSNNgFS9QqeBClFYlHmd2n9xdIb8spyVJnf4XDPTVcFDFRxUURE8eFna/QRYVjGwrOm4Xr1+1Dd7qdID+TXMjshokLtn2+2lhcw+yCJUBVXIhQmEiD3Sd25aBz6KuwJA12wRK1Ch5E6bm0UmZ3WXSW9Lackix19lc43FPDRRETVVwUMXFc2PkKXVQ4tjrzBBuoSqIy0J1uJ8hrcyqZ3VDHGNs+X605XMHsgiVAVVyI0Lojp5ndhZsPoXPoq7Akzfy8NUUJD6K0Pq+K2X38ywPS23JKstTZX+FwTw0XRUxUcVHExHFh5yt0UeHYU3vz2UBVuScP3el2gvxSif8nQ9gKS35gFywBquJChF4uu8DsPrIyEZ1DX4UlaX9PenVPfE0nG5jdOcvjpbfllGSps7/C4Z4aLoqYqOKiiInjws5X6KLCsaU7M9lAdT6jHN3pdoIc6hazd8MWRKHZ5U/LYrKZXWdTS5VxIULhOB2wO2PeDnQOfRWWpP2966l74mupvcHsTpuzTXpbTkmWOvsrHO6p4aKIiSouipg4Lux8hS4qHJu/YT8bqC4eP4fudDtBDnWL2e7QT75Es8ufHt+YzOy6cKxKGRciFA7UBruTp61H59BXYUma7fY+cloJD6L0ztUOZvf+P6yV3pZTkqXO/gqHe2q4KGKiiosiJo4LO1+hiwrHHl4axwaq5spGdKfbCfLOWz2e8+E+R7fPV3NXxDO7rpy4qIwLEQol9cDu3b9dIfS+4SosSbPzHssuKOFBlHZ3DDC7E95ZKr0tpyRLnf0VDvfUcFHERBUXRUwcF3a+QhcVjk39dCsbqFrrW9CdbifIecWN4RUisDX9s+3Mrpu115VxIUIH+79mdse8Ng+dQ1+FJWl/FV90T3yDA98wu6NfmSO9LVnJcvz48SsnTJgwxdDNxudnR7reuC4+2HU6+ysc7qnhooiJKi6KmDgusdnMgaLCsft+v4YNVHdvdKI73W6QQ/3i4TVisfXAR+sYn7AEqJILEQqTle3PT2eTF2weucKStL+az05IfDG/nMtsh8m1zHZkJEtjIveziRMnJsNn4/9njMld/gjX/9/GNe3jxo37MWY+U61OiEMXE11cFDFxXKJzmuNEhWPjJy9mg1Rv5wN0p9sNcqhfrJvtie8sYzZ1d/Qr5UKEwnIl2N5zdwCdR66wJA02dbX3KuNBmO1Tlnts75PajoxkaUz61hiTupn8a2Ny1xPk8r8xrn3b+J0qdwLofKWIiSouipg4LqEJzYmiwrE7fz57KHLSjKEHD75Fd7rdIIf6xbo9vYz+xRzzqc+AnKc+Mjs8bFgA2zuu3UXnkSssSYNNA31fKeNBlAZ6eikjJkTnHmPCl2DoBz5fd48ZM+aH/q41Jn/vGv/9tXHNWXcC6HyliIkqLoqYOC7ROc1xItux/b1/0vI9OqtBnjpri1bvL3rfo3t1rnIuRCgcWQL2wxEm2FwyPuE9uuen+32PzgmJL31upN/3F2XEhOjcM3HixCRjYjfV5+v+sWPH/mD4dcY1/6fxs3+Az+4EkIZSxEQVF0VMHJfonOY4ke3Y+5rupLUa5IeXxmq1g7nrTr+5k3bKcuVciFA4tBjsb6poQOcSFJaiA+2kdULiy12Z4HcHs4yYEJ17PEvA032+7gtw3ccenWZom/E7S5955pl/FyifPX5s2ktFAQ81XBQxUcVFERPHJTqnOU5kD3C3L9/W8iw9q4N9/vp95hmGBefRbQRtb/acpfexvLP0AnEhQqFsGdhfn38WnUtQWIoOdJaeTB5EacHmg37PMJQRE6JzjzGZ+yk8BYTP48aNm2BIMXw2JngRgX7HyhNAV1xxxRUrIjqnOU6ABJkD3PVzzVpW07A62JdG6VXFhFfTSJ+7XTkXIrQsOovZfy6tDJ1L0Ja6wNU0nDABLI/zX8VERkzIyD/GZG+bMQl839DIiIiI8ca3njImeR3G93/k59oP4SmhoTHPPvvsvw2Uzyg+qaCGiyImqrgoYuK4ZOQ0R4nsAe5SqZ71dK0O9lC/WKc6xpfL65k9uZ8nKOdChHrrGO8+hs4lKCxFm/V0dynlQZQGqmMsIyawc5UV0d1foXJPDRdFTFRxUcTEcWHnK3SR7dja3FNsgCramoLu8FCCHJ78gf0lURnoNoLWHT3D7CnYdFA5FyK0JruC2V8cmYbOJSgsRYM9sDStkgdRWptTqaR/OSVZ6u6vULmnhosiJqq4KGLiuLDzFbrIdqyqJxSyghze/QP789btQ7cR9GxKCbOnPPawci5EaGNRjcnn2r3oXILCUjTYA0vTKnkQpZdK1Dxhd0qy1N1foXJPDRdFTFRxUcTEcWHnK3SR7VhV7yjJCvLmU5eY/bAbGNtG0JMJR5g9Z5ILlXMhQq+eucLsz14cg84lKCxFgz2wNK2SB1Hqfcd2vtx3bJ2SLHX3V6jcU8NFERNVXBQxcVzY+QpdZDvWu0vx6Bl0h4cS5HD+H9gP5wFi2whatC2V2VN7uFI5FyK0raGN2Z8yYxM6l6DFkenMHliaVsmDKPXusv+j3F32TkmWuvsrVO6p4aKIiSouipg4Lux8hS6yHes9p6y8Ht3hoQQ5VAAB+6EiCLaNoLDUB/Y0ltQq50KE3mvtYvbv/d0qdC5BYSka7GkoqlbKgyhVdc6mU5Kl7v4KlXtquChiooqLIiaOCztfoYtsx2bM26GkUoGsIIcawGA/1ATGthEUjtMBe66dbVLOhQjt637E7N/164XoXILCUjTYA0vTKnkQpaoq7TglWerur1C5p4aLIiaquChi4riw8xW6yHasqlqlsoIc6hdDHeOolz9FtxH04CcbGZ+3Lt1SzoUIBT53vDiTqQ61oWEpGviEpWmVPIhUiM3ISdOHHgx+IzUmsHOVFXGCv0Lhnhouipio4qKIiePCzlfoItuxULIMBtiu9j50h4ca5HGvz2cY+nseo9u5572VzJbOWz0oXIjQXW8uYhjgaSA2n7AUDbbA0rRqHkRp/OTFDENP56DUmMDOVVbECf4KhXtquChiooqLIiaOCztfoYtsx8b8ci4bnAb7v0Z3eKhBrmLSZVVVTEZld/hgky7VCkvRgSajTkl8+36/hmHouH5Pakxg5yor4gR/hcI9NVwUMVHFRRETx4Wdr9BFpmMHB75hA1P0L+agOzucIFex7GpFYYkPlvpkL0fL7vDBll2V8jnCcrRTEl/qp1sZny0XbkqNCexcZUWc4K9QuKeGiyImqrgoYuK4sPMVush0bHdHPxuYEt9Zhu7scIJcxcYLK6pqQ4rsDh9s44VKHWlDilMS3+GlcQwHlLWTGRPYucqKOMFfoXBPDRdFTFRxUcTEcWHnK3SR6dj25jtsYEr+eD26s8MJchVHr1jRuzfVHEkju8Pzo1egKggmnyMdSeOUxAdl7ABHfV6V1JjAzlVWxAn+CoV7argoYqKKiyImjgs7X6GLTMfC0S8wMMFRMNjODifIVRy+bEVVHUotu8MHO3xZpY50KLVTEl9ZTDbDcTa1VGpMYOcqK+IEf4XCPTVcFDFRxUURE8eFna/QRaZjL5WadUqPrEpEd3Y4Qa6i/JoV5WXpspfILUsnu8MHK7+mUkcqS+eUxHfmQKH0ettOSZZO8Fco3FPDRRETVVwUMXFc2PkKXWQ6tjankg1M8AQN29nhBPnZlBKGozz2MKqNFwvOMzvy1u1D40KEnksrYzjKorNQ+YQlaMbn2r0oPIjS2txTDEfhlhSpMYGdq6yIE/wVCvfUcFHERBUXRUwcF3a+QheZjvU+mUg8gu7scIIc6hgDjoJNB1FtPJ9RzuwoicpA40KE1uefZTjg3TVMPmEJGuwojkxD4UGUXi67YD5pXynvSbtTkqUT/BUK99RwUcREFRdFTBwXdr5CF5mOhSc8MDCdS5P3bpKKIIc6xoAj9/MEVBsr9+QxO+B/LC5EKOxWBRw5y+JQ+YQlaLADlqQxeBCl/F3b9LnbpcYEdq6yIk7wVyjcU8NFERNVXBQxcVzY+QpdZDo2f4Nnd2L+OXRnhxPkKgZYK8o3T1RnnUTjQoR6N7N8uhWVzyd/oJSh8CBK7zR3MBwHPlonNSawc5UVcYK/QuGeGi6KmKjiooiJ48LOV+gi07H8fLLmykZ0Z4cT5Pw4G5kDrBU99sUeJcenyO7wd2/eN49feX81Kp/e41Pyz6LwIEq7OwYYjoR3lkqNCexcZUWc4K9QuKeGiyImqrgoYuK4sPMVush0bMqsLWxggic+2M4OJ8i77pgHWkNdY0wbMxfuNA+krpJ7ILXsDt/X5TmA+c1FqHzmLI8PeoCyUxIfq7jz/PShna/MlhoT2LnKijjBX6FwTw0XRUxUcVHExHFh5yt0kelYeMLDar623Ed3djhBPjjwNcMR8+pcVBsP/vFLZsfty7fRuBChUHYt6qVZQ5EvzPBbgk2Vps3ZZpZQq7uBwoNIjf2Vp0Z075+kxQR2rrIiTvGXXe6p4aKIiSouipg4Lux8hS4yHQsltmBQgpJb2M4ON8ihnjFggckglo3wBBJsuH+7F5ULEQrl7AALlLfD4nP/H9YyGzqu3UXjQZTueW8lw9KagV+PAAAgAElEQVTZ1i0tJrBzlRVxir/sck8NF0VMVHFRxMRxYecrdJHlWHiyA0944EkP5lMeUUEO9YxhgIXlYCwb4Qkkm4T2y52Equjw+z/8wpx8Xb+HxmfC20uYDT13B9B4EKWHpm9kWG41tkmLCexcZUWc4i+73FPDRRETVVwUMXFc2PkKXWQ5Fp7swIAUP3kxuqNFBDnUMwY87U13UOyDSZ+qZWgVHd67/Frrf/lVhe78+eyhyEnThx4MfoPGgyiFaibA59XTl6XFBHausiJO8Zdd7qnhooiJKi6KmDgu7HyFLrIcC092YECCJz3YjhYR5BnzdzA81881o9gHy76qNqKo6PC5K8wNGFdO1KPw2d/zmLUf9/oCVB5Ead66vQxPQ8F5aTGBnausiFP8ZZd7argoYqKKiyImjgs7X6GLLMfCkx0YkNJmb0N3tIggP7p6t3kES0ktin2w8QPah40g2FyI0ILNBxkeqLKCwee91i7zKJrfrULlQZRCdRjAA9ViZMUEdq6yIk7xl13uqeGiiIkqLoqYOC7sfIUushx75cRFs9rD8nh0R4sI8uLtaQwPlA/DsA+OfoH24SgYbC5E6IlduQxP1cEiFD5bL7ay9uGoIkweROmpvflmVZMk/1VNRMQEdq6yIk7xl13uqeGiiIkqLoqYOC7sfIUushx7QZP6uaKCHAZWwAMDLYZ9cPgztA+HQWNzIUKrDhUzPOVxOSh8wuHk0D4cVo7JgyiF6jDB6hqLiAnsXGVFnOIvu9xTw0URE1VcFDFxXNj5Cl1kORZ7gBcd5LC0BnhgqQ3DvicDfDo6FyL0wrEq8w+EjckofEL1D2gfqoFg8iBKZf+B4JRk6RR/2eWeGi6KmKjiooiJ48LOV+giy7EnduWgLvGJDvKGwmqGJ2/tXhT7Kvfksfbhf2wuRChU3zBfEdiFwufZ1FLzD5TYbFQeRKn3FYEFUdJiAjtXWRGn+Msu99RwUcREFRdFTBwXdr5CF1mOxX7JX3SQX6u6wvBkKXgHz5+W7Ehn7VdnnkDnQoS2XLjp2SS0FYXPk/HmO4hnkgP/geKkxCd7k5BTkqVT/GWXe2q4KGKiiosiJo4LO1+hiyzHYh/zITrIb126ZQ6wn8jfhetPYWmPHfNRVI3OhQi9e7OT4dn3wRoUPgs3HzL/QDlyGpUHUeo9Jui3K6TFBHausiJO8Zdd7qnhooiJKi6KmDgu7HyFLrIcyw/6vVl7Hd3RIoJc9gA7ksLuX2gfnkRicyFCe7seMjy73lyEwmfu5wkj/oHipMQ30PeV1IPCnZIsneIvu9xTw0URE1VcFDFxXNj5Cl1kOXb/h7zOKl6pL5FBrrIShz+FJ4+s1NelW+hciFAoD7jjxZlMMUoFWqlE4rTEF/3qZ9LqVTslWTrJX3a4p4aLIiaquChi4riw8xW6yHIslIBjdVY7B9EdLSrIVdXi9afw5BHahieROnAhJEbeMmOk9/5D5XxaqUXstMQHVWJYver2PikxgZ2rrIiT/GWHe2q4KGKiiosiJo4LO1+hiyzHRr386VDkpBkoT3dkBbnKSdhw5ZNPWOrTgQsRuu/3a0achMlSK5NPpyW+5GlmverbV9qlxAR2rrIiTvKXHe6p4aKIiSouipg4Lux8hS4yHOuts/pG4DqruqmVIFe5DOurfPkZlvh04UKEQplAtgxbF3gZVoZaXX52WuLLnB8lrV61U5Klk/xlh3tquChiooqLIiaOCztfoYsMx95ruT9inVXd1EqQZynciOGrXe2eDShTlmvDhQh9slP8olI++QaU+BE2oDgt8cmsV+2UZOkkf9nhnhouipio4qKIiePCzlfoIsOx3jqrMzejO1lkkMMh0OwolkL5R7H4Kj/jLXnaBm24EKFQJhDjrMi7NzxH0Pw++BE0Tkt8RdtSzXrVh8XXq3ZKsnSSv+xwTw0XRUxUcVHExHFh5yt0keHY5lOXPHVWY9GdLDLIoQwc4IKycCptu3ZWbpWHULgQod5qMYeKlfIJS87mIdTbtOBBlFbs9tSr3ndcSkxg5yor4iR/2eGeGi6KmKjiooiJ48LOV+giw7H1+efYQJS/YT+6k0UG+am9+QxXRdIxpbbJrvMaChciFKteNCw5Q7uwBK0DD6L0XHoZw1W6M1NKTGDnKiviJH/Z4Z4aLoqYqOKiiInjws5X6CLDsefSPANRdBa6k0UGeU12BcNVvD1NqW3VWSfNdiPVtKuqw184eobhgqVglXzW8XY3B2/XaYnv4nHPH17r90mJCexcZUWc5C873FPDRRETVVwUMXFc2PkKXWQ4tiLxKBuITu8vQHeyyCCHl+sBF7xsr9I2/uSxMilPGy5EaNPJBoYrZ3nwJ3GitepgEWv3xK5cLXgQpVdPm69eZC+OkRIT2LnKijjJX3a4p4aLIiaquChi4riw8xW6yHAsfxm99nAlupNFBjkcrwG4MubvUGpbyY50pe8equrwT97F26qUz/LYw6zdsyklWvAgStsaPJuvZmySEhPYucqKOMlfdrinhosiJqq4KGLiuLDzFbrIcCw/juJSSR26k0UGeXvTHXM37sfrldqmevexqg5vdTeuaD2+MZm1W59XpQUPovReaxfDtWeq+OOXnJIsneQvO9xTw0URE1VcFDFxXNj5Cl1kOBaekMFAdOP8VXQniwzy7o5+hivxN8uU2qb6/EFVHd7qeXyiNWdZHGu3qbJRCx5EqfcA9tfnS4kJ7FxlRZzkLzvcU8NFERNVXBQxcVzY+QpdZDgWnpDBQARPzLCdLDLIBwe+Gdr+/PSh6FfmKLVNdQUSVR3eakUO0Zo6awvjs7W+RQseRKpZgnH60IPBb4THBHausiJO85dV7qnhooiJKi6KmDgu7HyFLjIcC0/IWFH6O/3oThYd5LG/ms+w9ff+SZltSe96ahDf6tGKCxEKT/9YTd6uwDV5Reve91ezNqFijS48iNKEyUsYtp57g8JjAjtXWRGn+csq99RwUcREFRdFTBwXdr5CFxmOjf7FHPakbHDga3Qniw7yPVNXsgG2s61bmW0xv5zL2hzo+0orLkQovP8H2OB9QFV8Qo1qNonveawND6J0/x/WMmx3rnYIjwnsXGVFnOYvq9xTw0URE1VcFDFxXNj5Cl1EOxYmKTAAxbw2D93BMoIcdlgCvraGNiV2wSQa2oNJtW5ciFDYAQz4YEewCmywNBo5aQZbKtWJB1Ga/tl2xufNmuvCYwI7V1kRp/nLKvfUcFHERBUXRUwcF3a+QhfRjoVlShiAYNkS28Eygjx7SSzDB2euqbCrq72Ptbd7ynLtuBChcAYg25BxskEJNlgahfYS3l6iFQ+iNPfzBIbvcnm98JjAzlVWxGn+sso9NVwUMVHFRRETx4Wdr0aU8ePHr5wwYcIUQzcbn58Ndu3EiRP/wfjv+2PGjPlhRETEeCv3F+1Y2KgAA9DBTzaiO1hGkEN5O8AHVRdU2HX7Srt59My0DdpxIUKhCgjgg6ogKrDB0ii0d+CjdVrxIEoLNx9i+OpyTwuPCSEJTbI4zV9WuaeGiyImqrgoYuK4sPNVUDEmfD8zJnXJ8Nn4/xljEpgf7Hrj583GdY8NLRg7duzTVtoQ7Vg4qgQGIDi6BNvBMoK8LDqL4YNydyrsuna2ibWXOT9KOy5EKNQBBnxQF1gFthvV11h76XMjteJBlEJ1E8B3JrlIeEyIyGmyxWn+sso9NVwUMVHFRRETx4Wdr4KKMZFbY0wCZ/KvjQlezwjXf2y3DdGObSiqZgPQsS/2oDtYRpCfOVDI8J1MPKLErsbiGrP83Jok7bgQoTDxM8uy5SjBdrnsAmvvyKpErXgQzSdUOxEdE6HkMNXiNH9Z5Z4aLoqYqOKiiInjws5XQcWY8CUY+oHP192wvBvoemMCGBkREfG68f/qn/zkJ//BShvg2MePTTJEaE3WSTYAQfkyUfdUocCBFS7qck8xfEVbU5TYVZNt8lm8PU07LkQoLP0CvoLNB5Vgq8utNP23LVUrHkQpVDdhfG5MFh4TInKabKE6UFHDRRETVVwUMXFc2PkqqBgTuaTx48dP9fm6f+zYsT8I8itPwT9PP/303xqTxXorbQwJlrr0EvMdJON/inKn1qwHXLh+r5L2LmSUmnWVU4uVtKdaOi6YS7IFa5OUtHcxu5y1V5NSpKQ91XK3/jrDd/yL3cLvHWY6UyJgJ8WBihouipio4qKIiePCzlcwqZsEkzVDLwzTfHiSZ0wAp/tc2xfoPhEREe8YP4/xfPlXxu//Nyvtg2NFPuGAJ38wAFVnnUB/GmL3CYcVLlpqr3veIduuxK7SqAyTz8xy7bgQoa0XbjB8aXO2KcHG3+E8n16mFQ/C+Zy9VXhMhJnqlAjVgYoaLoqYqOKiiInjws5XQcWY0P0UngLC53HjxhlzugnF/GfGxDDC91pjAvhz45p/hM/PPffcvzeurbTShmjH5q3dywYgeBcQ28Eygrzj2l2GDw7cVWGXl8+C89pxIUI7rt9j+OBAaBXY8tfvM3dxW+DTiYkPDtRmfH4glk/tk6VHnOYvq9xTw0URE1VcFDFxXNj5akQxJnrbjEng+573+/jRLk8ZE7wO42c/GnbtTHhiaPxsE9YuYNj9CwMQ7AbGdrCMIO/p9JwjN3nkc+SE8Lko2jx38Iw6PlV2+N77Dxm++LcWK8GWvTjGc47jZa14EM7nm4uEx4Tw5CZBnOYvq9xTw0URE1VcFDFxXNj5Cl1EOxbO/4MBCM4DxHawjCB/8OBbbyUJ+CzbLgw+VXZ44HDHizOZquDzkKeSy63GkSu5ODHxsfh8YYZwPp2SLJ3mL6vcU8NFERNVXBQxcVzY+QpdRDs26d3P2QALFUGwHSwryHkt2b7uR9LtgooqrPawQj5Vd/hdby5iGHu7Hkpva8971ms5OzXxcT77usTFp1OSpRP9RTUORxsmqrgoYuK4sPMVuoh2LNQAhsEHagJjO1hWkO99fzXDePfmfel2YfCpusPD+2omn53S24r18Nnf+yfteBClT+JTHJ9OSZZO9BfVOBxtmKjiooiJ48LOV+gi0rGDA98MbX9++lD0K3PQnSszyFNnbWEDbGt9i1SbBge+Zu1E/0Itn6o7POxYBZwtF27K59NGfDo18cmIT6ckSyf6i2ocjjZMVHFRxMRxYecrdBHp2O6OfjbwJP5mGbpzZQZ5zrI4hrOpokGqTV3tfSh8qu7wOct3mXyelMznHXvx6dTE543PykahMYGdq6yIE/1FNQ5HGyaquChi4riw8xW6iHRse9MdNvAkf7we3bkyg/z4xmSG88KxKqk2tV9pN/mcppZP1R2+QFM+nZr4jn95gOGEqiAiYwI7V1kRJ/qLahyONkxUcVHExHFh5yt0EenY6+fMKhkZ83agO1dmkEOdVcAJdVdl2uTlc75aPlV3eNV8Zs6P0pIHcXxmM5xnU0qExgR2rrIiTvQX1TgcbZio4qKIiePCzlfoItKxjUU1bOA59sUedOfKDPKqg0UM54ldOVJtaiw2+Ty6ere2XIhQ5XyuSdKSB2F8GhNpwFkeJ45PpyRLJ/qLahyONkxUcVHExHFh5yt0EenY8xlmndWSqAx058oM8rqjZ8z6tZsOSrWpJruCtVO8PU1bLkSol8/Ncvmszjpp8hlpjU+nJj5Y+mX1gL88IDQmsHOVFXGiv6jG4WjDRBUXRUwcF3a+QheRjq1IPMoGntP7C9CdKzPIr5y4yHDmLI+XatOpvfmsnYrdx7TlQoReOVHPcOauUMNnZVKeljyI0qunLzGc2UtihcYEdq6yIk70F9U4HG2YqOKiiInjws5X6CLSsYWbD7GBpy73NLpzZQZ5S90NhhOOL5FpU2lUJmsHnqzqyoUIban18Dlnm9R2Snaks3aqM09oyYMohaoxgBOqyIiMCexcZUWc6C+qcTjaMFHFRRETx4Wdr9BFpGPhiRgMPPCEDNu5MoP87o1OhhMOMJZpU966vaydiwXnteVChHZcv2fy+XvJfK41+WwoqtaSB1Ha1d7LcO6eslxoTMjIP+PHj185YcKEKYZuNj4/G+S6z6DWuXFd9nPPPff3KvKZLurUOBxtmKjiooiJ45KR0xwlIh2r6oBk7CCHkmWAE0puybQpc0EUa+da1RVtuRChXj5/vVBqO1kLd3r4bNKSB1Fq98Brq1yIzj3GhO5nEydOTIbPxv/PGJO7fH/XRUREvG7of/R8fse4rkRFPtNFnRqHow0TVVwUMXFconOa40SkY/dMXcUG2HutXejOlRnkDx58O7TjxZlDkS/MYJ9l2XTgo3WMTzi/TlcuRChwGPXyp0ORk6azajKy2jn4yZeMz9uXb2vJg0iNe32+WfKu57GwmBCde4xJ3xp4qse/NiZ2Pf6uM76/0LguET4b//8fxtdXVeQzXdTJcTiaMFHFRRETxyU6pzlORDrWqXWAQwny+LcWM6y9nQ+k2RQ/2Wyj5+6A1lyIUKjOAVih+omsNnb/doWnjV5teRClousBy0iWxkQuwdAPfL7uHjNmzA/9XPr9cePG/e/wwbMMHKUin+miTo7D0YSJKi6KmDgu0TnNcSLKsTDpgwEn5tW56I5VEeT7P/yC4YX312TYw58ygsp8yiiCCxHKn87BBgZZbUBsQhuD/V9ry4MoTZu9zayvXHtDWEyIzj0TJ05MMiZ0U32+7h87duwPAl3/9NNP/60x+Tv+d3/3d/9bsHz2+LFpLxUFPNRwUcREFRdFTByX6JzmOBE1wHXe6mEDTtK7n6MPfqEOcHa4gB2rgPdm7XUp9vTcG2T3h6eAunMhQrMXxzC8cISJjPvDpM/uHygYPIjS3JUJDO/lsgvCYkJ07vEsAU/3+bovyOVPGZO/LT/+8Y//TbB7DrniiiuuWBRhycypAiSIGODaGlrZgJMyYxP64BfqAGeHiyMrE4UOsMOV11WG9wB150KEyqhf66udbd3s/nveW6k1D6K0aFsqw1t7uFJYTIjOPcaE76fwFBA+jxs3zpjfTSiGz8akMMLPtbOee+65v4PPsGs4WD6j+KSCGi6KmKjiooiJ4xKd0xwnoga4pooG83DkZXHog1+oA5wdLqA6BztTLuukFHtgpyqrW7vAWt1aTC5EKJQtY/WADxZJuT/sTGd/oMzaojUPohQOuwa8cPi1qJiQkX+Myd42Y3L3vqGRERER479nPunrML7/I34N7Pw1fv6fje8/9Giq7Hymkzo5DkcTJqq4KGLiuGTkNEeJKMeqKo+mS5B7q3QkyanSAWf/wf3hLEDduRChZ1NLGd6y6Cwp9w+l2oiTE9//396VB2dVZXltbWdqumfr0XJKLRW3mZqeme4pq50R1Ma96VZxtN3GhbArAgouuCJrCFuAALIkhCCrKEsIu6BICKthX0MgBCICOoUzVTP/THcx99z33Y8v8SO5793zfefd851f1TEkue95f79zct773rv3nLBt72y0oM5VNvDVX1zjMJc4ceXFkZPhRZ2vyIHl2LXFi/UFZ+W4eeSOzUaQb5i7WvNdPKQ0I/NZVxbcEC3N0A0RphYYdv6Gd3JGzg+vQuH85UPt/eVz4ttWUaX5zn97AlpMUOcqG/jqL65xmEucuPLiyMnwos5X5MByLNyowAVnXdkycsdmI8gz3Q94xdjgleja4sy8EsXUAsOSr7x7j8zI+cP2AabSAcv2rN+l+c7oMQwtJqhzlQ189RfXOMwlTlx5ceRkeFHnK3JgOTbZZivLbcuogjy5pqzL4IzMx2yK2PhJZjZFYGqBYWbTS/EL/TNyfrMponL2qljrgGW1u3Db6/mSLH31F9c4zCVOXHlx5GR4UecrcmA5Ntm27Au7Nltxs7BBnumyN6Ysyo7PMlMWBVMLDINi18C36JE+GTl/lLIoPie+r+u/RW2v50uy9NVfXOMwlzhx5cWRk+FFna/IgeVYeHKj25ZtP0zu2GwEuakrN+o+vH6rqZaNwshYWmBYpgtfT+82NCiMXGVfGNnnxJfaXu/0Kff2er4kS1/9xTUOc4kTV14cORle1PmKHFiOLWrfh6RtGWWQY/dbTbUJj72e8dZomFpgWLL1Xd0p9HNH6VPte+Ib/2jQXu947UmUmKDOVTbw2V9c4zBXOHHlxZGT4UWdr8iB4Vjz9Kbgrs4oTxt8CfJkv9U9OP1WU23kPd3105tT32RfT6o/eCh6rZ8i78B/ijz6gR6h+1T7nviKO3ygOR/66hBKTFDnKhv47C+ucZgrnLjy4sjJ8KLOV+TAcGxD3emgbdnD2W9bRhnkM14aFrSDq9yNOhezfmvMb3t5owWGZWodabJP9YMve6EDls16ZVTQXm9tNUpMUOcqG/jsL65xmCucuPLiyMnwos5X5MBw7OGdtfpCM+W598idms0ghxprwHtrxQbUuWDv4MyGFhgGRa8zsZP86L5jQRu4J9/yQgcsW9B/sua9eeE6lJigzlU28NlfXOMwVzhx5cWRk+FFna/IgeHYPV/u1Beaj14eTu7UbAZ5xfAZQTu4mStQ54Jdwy0bWmDY+VqSS1HPCxs/4Lxl3Yd6oQOWLRs9W/OGLisYMUGdq2zgs7+4xmGucOLKiyMnw4s6X5EDw7FbyyuDrgPvTCR3ajaDfM2URUH3k/Efo84FnihidnHIhhYYBkWvgfeKsbjdZKD0i24D16/ICx2wDPoqA+/lhXNQYoI6V9nAZ39xjcNc4cSVF0dOhhd1viIHhmMp25ZRBnnVvDVB/+PBuP2P4YkinBeeMPqiBYZB0WvgvXBgMep5ofizbgOXP90LHbAMXv1itdfzJVn67C+ucZgrnLjy4sjJ8KLOV+TAcOzywuBV0+fTlpA7NZtBvn3VFs17Tt8xqHNZNX6+Pi88YfRFCwyDotfAe3afQlw9J36izwvt4HzQAct2r9sRLM3o6b40w5dk6bO/uMZhrnDiyosjJ8OLOl+RA8OxZvH+Zk/bwEUN8gNb9mve0zoPQp3L4sHT9HnhCaMvWmAYFL0G3iUdB6Ket3xoqT7vhjmrvdABy2p3HQk2Zz37LkpMUOcqG/jsL65xmCucuPLiyMnwos5X5MBwLGz+gAsNPHGgdmo2g/zYoQbNG4o2Y85l7utj9XmrV2z2RgsMq6/JlJ7jEnpu8kIHLPv6eKKcULueKDFBnats4LO/uMZhrnDiyosjJ8OLOl+RA8OxUK4ELjS1u4+SOzWbQX7qm7Pnht3R6dzIe7ujzqW08yCt5/7N+73RAsOg6HXBnZ11CzPMdnClXYcEem7a54UOmDb6/vAFsC+kBXWusoHv/uIah7nAiSsvjpwML+p8RQ4Mxxb+JnMt0eIe5FCsGbhD8WasuYz/99fI2sC5aIFhyXZwR/HawU38/Zv6nHUHjnujA5YlW+DtO+YcE9S5yga++4trHOYCJ668OHIyvKjzFTlcHZvssvBAD3KHUgR58unnLpynn6atHhhVWz3KP/iSvAFaT1gPiHXOUfe/pM956uRZb3TAsrIX81G61fiSLH33F9c4zAVOXHlx5GR4Uecrcrg69sjeoMsC9MWldihFkM/oUaD5QzFsjHkcrz2pz1f0aF/vtMCwOX0LNf/tq7einA+eSsP54Cm1TzpgGdTm1N1qyiudY4I6V9nAd39xjcNc4MSVF0dOhhd1viKHq2OTXSteoulaQR3kn7z7YdC+rHw9yjwObDkQ7CzuhLsTNhtaYNjiIYkdu3PD7di9kB3ZUxf5AwqHxLd05MxEd5VlzjFBnats4Lu/uMZhLnDiyosjJ8OLOl+Rw9WxcOMDFxi4EaJ2KEWQL0u0L/uitAJlHrDzF84HO1d90wLDoFYf8F898VOU85laePCk1icdsAxqc2J0A/ElWfruL65xmAucuPLiyMnwos5X5HB1rOkCsszjLiAuQY7dBSVq14o4aIFh2N1VXLphcEh8UJsz4D/JOSaoc5UNfPcX1zjMBU5ceXHkZHhR5ytyuDqWQxcQlyDH7tsLfYUpu4C4aIFhyW4gr45GOd/a4sWR+wtzSHxY3UB8SZa++4trHOYCJ668OHIyvKjzFTlcHWu6gGzxuAuIS5Dvq9qj+U/vOgRlHtAHF863cf5a77TAsEPVNZp/cYf+KOdbUlCmzwf9lX3SActgdzrwh93qrjFBnats4Lu/uMZhLnDiyosjJ8OLOl+Rw9WxpgsI1i5Y34L82METQfeKx99Amces3iP1+XaurfZOCwxrqDut+Y976BWU8817I+gC8tXycF1AqHXAMpdd0E21oM5VNvDdX1zjMBc4ceXFkZPhRZ2vyOHq2MnP+N8FxCXIdfeKuzqfG9G2K0r3iinPvaf1PLyj1jstMAw0hM4qBXd20p1WXM8Hu6lBT9hd7ZMOmIbRDcSXZMnBX1zjkDsnrrw4cjK8qPMVOVwdy6ELiGuQF7XvozWAGn6u88hEZ5FsaoFhUTt3YPuGWgcsm/RU0A0Eana6xAR1rrIBB39xjUPunLjy4sjJ8KLOV+RwcWyyC8iDL5M7kzLIXZ4ypdMTOlf4qgWGlXUfqnXYt2GP03lcn85S64BlUKNTL9NYv8spJqhzlQ04+ItrHHLnxJUXR06GF3W+IoeLY4/sjV5kN27mEuQu68wa6xl0VYH+rb5qgWGwo1p3r1ji1r3CdX0mtQ5YZoqVu3QD8SVZcvAX1zjkzokrL46cDC/qfEUOF8cmu4D08LsLiGuQu+w0TasncVcV6j94rO4Vrju0qXVA0zNRrBxqVrrEBHWusgEHf3GNQ+6cuPLiyMnwos5X5HBxLJcuIK5B7lJrrpGei+OhJ/Uf/PnuFbOdzuNao5Fahzjp6Uuy5OAvrnHInRNXXhw5GV7U+YocLo41F5Zlo90u1HEwlyB36TaRatBOLg56Uv/BbzHdK95z617h2qWFWgc0PRE+WPiSLDn4i2sccufElRdHToYXdb4ih4tjlxTM0BeWLz9aTu5MyiB36Tebahiv6qi1wCchLToAABXUSURBVDCspQWufZqpdcAy2EzjWqzcl2TJwV9c45A7J668OHIyvKjzFTlcHDv3tTH6wrJ95RZyZ1IGOdZmmOTmB4fF+tRaYFhSz6fcNsPMf2eik57UOmBZfc3XWofxj77mFBPUucoGHPzFNQ65c+LKiyMnw4s6X5HDxbHFL/TXF5aa6hpyZ1IGOVb5lrLu+fo8ezfs9lYLDEuWF7q/h6OebuVkqHXAMiiBM+LubucK7uwcubi2L8mSg7+4xiF3Tlx5ceRkeFHnK3K4ONYUgf76OF3R4rgE+djf9dZaNNSfiTwHKFeiCyDvdy+ATKkFhpmC2A3HouuZLCh98IS3OmDZh0/2cyoG7Uuy5OIvrnHImRNXXhw5GV7U+YocUR0LN31wQRnTzq3HaFzMNcinPv9+8DR0++FIx0PR4uG/7qLt9KnvvdYCw0ryBmg9D26NVly78VOvaHrGQQcsMz27d32xPbIW1LnKBlz8xTUOOXPiyosjJ8OLOl+RI6pjD1XX6AsKvAamdmQcgnz2q6O1Hjs+2xbp+KP76/Xx8NTKdy0wbF6/Iq3HtoqqSMefOPKNPr7okT5e64BlCwcWaz2q5q+NrAV1rrIBF39xjUPOnLjy4sjJ8KLOV+SI6tjqFZv1BQU2glA7Mg5BvnjwNK3HhnmfRToenszA8fCkxnctMAxK4YAeUGooyvEHtx3Ux5d0HOi1Dli2+sNPtR6rJn4SWQvqXGUDLv7iGoecOXHlxZGT4UWdr8gR1bFQ+gUuKBXDZ5A7Mg5B/tnkhVqPlUUfRzq+at4affyigcXea4Fh62et1HqU50+PdPy2pVX6+HlvFnmtA5Zt/ORzrceCD6ZG1oI6V9mAi7+4xiFnTlx5ceRkeFHnK3JEdaxrjbW4mWuQuxbbhRtHOB5uJH3XAsN2rN6q9YBX61GOx+p+Qa0Dlp2vVRmttqIvyZKLv7jGIWdOXHlx5GR4UecrUgz71w63fv/Nd5Ec+3G/8U5rtOJmrkG+f9M+rce0zoMiHQ83jnD85kVfeq8FhtXuOqL1mPzMO5GOLx9aqo+vnL3Kax2wDHaWu6wxbag7dW7wv+W1VWnjYuq81Ry4+ItrHHLmxJUXR06GF3W+IsPr//z8T4a1yftDWZdBkRw7rdNAfUE5sGU/uSPjEOQNdae1HlAOJsrxpV2HONWsi5MWGKZrAd7R6dzIe7vrHb1hj5/Za4TWc+faaq91wDLYCV1wV+dzI9p2jbTLfNHgEq1nfusXbqfOXc2Bi7+4xiFnTlx5ceRkeFHnKzIMuKjtpfltOv7fiLu7njtzOvwFYdzDr+oLwomjp8gdGZcgT9ZFrA9fF7GofR99bP3hkyy0wDDYwQuaHK8Nr4mpe3d0X7S6d3HSAcsmPPa61uTYoYbQx5Z0DMryDG2d90vq3NUcOPmLaxxy5cSVF0dOhhd1viJFfpu8Q1EuksnOF/e9GOnpTBwNI8iLO3wQ1K7bdjC8ng5Pu+KoBYYln4pWhXsqmlpTMWoNwDjpgGWmM8reyt2hjy38zcv62AE/f+Kn1HmrOXDyF9c45MqJKy+OnAwv6nxFimGt85bq12RrwtWuS67P+o9o67PiaBhBbtZFbq3YEE3PiOvd4qgFhkVdFwkfaOC4D5/ox0IHLPv0vUmBngvXhTrO1FRUHxhPUueslsDJX1zjkCsnrrw4cjK8qPMVKdQN4FhI7OtnLg8lHNwwwnGzXhlF7sQ4BfnyMXO1LmuLF4c6znXHaxy1wLCoO6Nh3R8cB+sAOeiAreeaKYtCHQfrUoP1f3nrqXNWS+DkL65xyJUTV14cORle1PmKFENv7/BylFp+G+as1heExUNKyZ0YpyBP6jJ4WqjjXGvexVELDItaG7FyziqU+IyLDli2YW60+DQ1BNUHxmnUOaslcPIX1zjkyokrL46cDC/qfEWKYa07PBDlyVPySdfUcE+64mwYQb7r80Q3j57hunkku16UlJPrgKUFhiX1DNkdBWr/YegZFx3w9KyOFJ/myWH+7XlvUeeslsDJX1zjkCsnrrw4cjK8qPMVKQbf9nwrvVbqqbdCCQft3+C4r5ZtJHdinIL8fK21N0IdF3XtYJy1wLCoa/mg+4euUbnUrUZlXHTAsmMHT2hdxj/6Wqjj5r89QR83pHWHx6lzVkvg5C+ucciVE1deHDkZXtT5ihRQCibKbskPn3xLXxBqdx0ld2Kcghzqq0GdNai3FkZPU2LjwJYD5DpgaYFhqbt5w9SuK+7QP9Ju7LjqgGWww3z0/T2CUkXH7UsVleQF8Tnotud+QZ2zWgInf3GNQ66cuPLiyMnwos5X5JjyzNs6uR/ZW2cl2qmTZ4OCsnd3cyqxETfDCnJzc2yrJ1yUTf3AhmNnyHXA1ALD4Glq2FJFox8MSpacPPEdGx2wrKRjUMAdOteE1ROKx1Pnq5bAzV9c45AjJ668OHIyvKjzFTnmvzFWJ3fYiWojWk11jR4/5dn3yB0YxyCf1XvkuTCldeprGvR4KHpMrQG2FhgG61NBn+oVm63GQ2FyGD/uoVdY6YBlC/pP1vpsnL/Wavzx2qAEDBR+p85VNuDmL65xyJETV14cORle1PmKHGuKgg0d62YssxJta3mlHg/r1qgdGMcgh528urTOrJVW401JnZk93UqWxFELDFteOCdU6ZJ9G/fq8aURezLHVQcsg41boA/oajMeikbD+OndhnqRLLn5i2sccuTElRdHToYXdb4iR/XCoMTDkoIyK9FWT/xUj181fj65A+MY5F+UVmh9KkZ8ZDX+82lL9PilI2aSa4CtBYZtWrBO6wNFoa3GfxrEMxQ95qQDln21fJPWZ07fMVbjq+av1eMXDpjqRbLk5i+ucciRE1deHDkZXtT5ihxHt+4NVdTZ7AjcErI7Q9wNK8hNqY0ZPYZZjV/wwRQ9vurjNeQaYGuBYbCRA/SZ+vz7VuOXjpqVKMbtXlInTjpgWe3uo8HO6iftdv6vHDcv8QR2oRfJkpu/uMYhR05ceXHkZHhR5ytynD35beKCYFdqAy7EMP7QV4fIHRjHIDdr0Ma062nV19fsAA6zKN8XLTAM+iTrTUdtu1ptOoKagcEazK9Y6YBloCFs4NI71U+ebXH8x28lShQtqfQiWXLzF9c45MiJKy+OnAwv6nxFjj/+4Y/nRt7T/VzBnZ1b3DWpy5zAxUONhQsztQPjGuRQZw0umnUHjreo56h7X1R6dnLesRpXLTAMeiSDnod31Davp7rhHtOulx4Lmxe46YBlsIELNIINXbba12yv8SJZcvQXxzjkyIkrL46cDC/qfEUOcGxpl0E6ye9Zv6tZwaC0SZTCvD4YZpDP7lMYFMpevslLPeP2B58slF1e2ew4U+i4qD3Ojuq46ZBtPaFWIHw4GXlvd/1hhTpX2YCjvzjGIUdOXHlx5GR4UecrcoBjKwrK9AUBNjA0JxiU4tCt49QNDrXz4hzkpnUWbJhpbhx0UoFx0FmFmn+mtMAws/Fo5fiPmx2XjM+QrQ190QHLYAOXTXzuXrcj2AHcdYg3yZKjvzjGIUdOXHlx5GR4UecrcoBjzc7JlnZawsJ6GAe9a6mdF+cgh5Zu+sbu9XHNjvts0oLgxmbcPHL+mdICw6ClWxg9V4zF0TNuOmDZlsXrtU6woau5cWaHesXwGd4kS47+4hiHHDlx5cWRk+FFna/IAY6t3VlrtTMQbhDDFJH1yTCD3LzabakncFx3VMftD95256rpAdzSq01fdcAyU8x90tNvNzvOxCeU4vElWXL0F8c45MiJKy+OnAwv6nxFDnDsmdPfBz1C7+jUbDuyokf7hmpz5pNhBnlqz9WG+gvrOeXZdxML7A+T88+UFhgG689gHZreqNTwnxccB2spdY/q3Tg9quOmA6aehYn2bsdrT7as564j3iRLjv7iGIccOXHlxZGT4UWdr8hhHFv2Yr5O9lDHLp1YR/YeCxbYq5tAasf5EOTQOUFvrPlyZ9rfw43M8F93SZQ3abkch89aYFhJXvPlcr6u/1Z/gBl1/0v6BoerDlg2p29hsrxLut+fqAvKGY1+oIf+QONLsuToL45xyJETV14cORle1PmKHMaxy0wB3amL04oFhYr1uqF3JpI7zocgXzIs2Fizrix9iz2zwL60y2By7pnWAsNMiz1Yl5bu97CDXevZdQhrHbDs85JgPS/EabrfQx3F1ILmviRLjv7iGIccOXHlxZGT4UWdr8hhHGsWhsM6qnRimY4VlbNXkTvOhyCvmrem2ZZkZmfr8sL4baiJ4x/8lvL1ze6YNi344EaRsw5YBk9Sm+uw8tnkhY02fPmSLDn6i2MccuTElRdHToYXdb4ih3GsecU74bHX04oFGxpsivH6athBfmRPsBFk3COvpu0I8lHPoGMFlC6h5p5pLTCsvqYh0WGlV1o9ofSL3lCjbhQ564Bl0BEEXpfDa3N43dv097DjOnVDjS/JkqO/OMYhR05ceXHkZHhR5ytyGMfCRXXs73rrpH90f30joeoSBXbHPvSKVXszHy0TQT7h8TfSdlyAFlymA0hD3Wly7tnQAsPMpoS0et4X6Amt+LjrgGUze48MCpYv29jo57CG0uSCuv3Hk1pQ5yobcPQXxzjkyIkrL46cDC/qfEWOVMd++v6ktOvWoAxEc6+HOVgmgnzRoJKgwPb0pY1+vmP1Vv3zko4DyXlnSwsMWzx4mtYNXk+m/hw22mg98wbkhA5YZl7zLh05s7GeifWUsEs9VQvqXGUDjv7iGIccOXHlxZGT4UWdr8iR6lhTwHhGj4JGQi0cMDW4MZyRfkMDB8tEkMMOS9CtrHt+Yz0HFje74Yba4voHbzYmFHfo3+jnS0fMTBSAnpsTOmDZ3srdgZ4vNNbTbAhLLaidqWR500039bv55psfUzZY/fsa13Ec/cUxDjly4sqLIyfDKxM5DR233HJLtxtuuOGOlsbZJslUpDoWen+OuLubLk8Ca67Mz8xaIVjXRu00n4IcSr2MTtRbM7Xp4HXlmN/2CuopxlTPuP7BQ7mcMe16NtIuVc+mr4a56oCmp9LOvOo9uPVAQuPvk0sXUkvuZCJZqhx1u8ptxfBv9fVqlbcWuIxrms+4GMc45MiJKy+OnAwv7JyGjctU8ntZJb1tKund1dzAMEkyFU0da14Dm91/62et1N/P7DWC3GE+Bnn50NJGelbOWZV4/Yv7utIHLTDMvAaGr/C92b0+rRP+6/Q464Bly8fM1fotGlgc6Lnoy+Tr39T1vplIlipPvaPyVhfzvcpZJ1zGATj6i2MccuTElRdHToYXbkbLEFTCm97SDWCYJJmKpo41baJgUT3sUDVPCJouFOdmmQryg9sO6qen8FQV9DTdVKpXbCLnnG0tMAx2q4OWYNtXbz1X1L6P1rMqA+0J46wDlh3dd0x3WAE9YckCtNsL2r998QMtXPNYU6gcVaTsmZTvj19xxRU/jTouXT7jYBzjkCMnrrw4cjK8sHNaRmBzAxgmSaYCHPvdd4EYxhb0n6wvAsaga8CZM//VaAw3Aw3SaYFhsMg+Vc/p3YbEWs9MaoFhFQVljfTUxYpPf59zOmDZqgnzG+kJawJPnzr7Ay0wclkq1IfWiepD65Mp35+86qqr/izquAvlM9+NYxxy5MSVF0dOhhd2TssILJ8AWifJltDt1lt/nN+644fD2uTVK5s/4Jd5fxXlPIIAvW5q9yf5rfOK8tt0PKO+Lup36xN/ST0nnzHgoraX5rfpMDK/Td5ZFaefDPhV3t9Sz8lnDLjooh8Nu71j4bDWeXVKz4oBtz/xs2z8fxNvLTqlfP+1yziBQCDwCiqZ3alu7jYp25him1LX8IV4BSxJUiAQeAGVo26DD67w7xtuuEGluJuXwL9VHrvRZpxAIBCwR7obQEmSAoHAd6g8lq/y1tPKCm688cab1I8uVrmrVv38L1oYJxAIBLyhEt9LKiHuVVam/t028WNJkgKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAJBLiNKT2muuOWWW36hvlwCRdVzdWNV017kcYkP23nEZb62CMHrJej+pMbNbtWq1XXZnGNYhPWBGjeOk6+uu+66VmrMEJVDnkqt1xtH2HJSv78f+Kj80FV9/cdszjEqmuaydPAtXwgEaIjaU5orFP8dSofvlC266qqrLqeeT5bxg17kcYkP23nEZb62sJ2vuuC2Mxdd9fVRNa4im/MMg7A+UOP/RY2pURfqa7Mzw2gIw0v9/nP4EAk5RI1blr1ZhoMtp8svv/zP1e96me/h5jZbc4yIH+SydPAtXzgj3R1xLt8B5/oTn6g9pblC6fEC9RyokVqHNC7xYTuPuMzXFrbzVT/vrcaNh3+rr/+gvt+ZrTmGRUgfwIW6Pdwwxf0G0JYXlG+DD5ApP7os45OLiBC+ukyN3a189E9XX33138DNVZam6ISWmmr4li9ckPaOOOfugJsgx5/4RO4pzRWJmprt1Ne3r7/++r+nng8FUpNmXOLDdh5xma8tQsz3EnXx1S0lE6+BR2RtkiERxgeKy+/Vl0vVmC/ifgNoy0vljtfgCa3i9rD6+qLKJ22yO1N7hPEVvP5Vv/9fZeXq2x9nbZIOaOkG0Ld84YymguTSHXA65PoTH8ye0kxwMfwn8cpjE/VkKNDkCWAs4sN2HnGZry3CzjcRlwuvvPLKn2RnhuFhy0mN+XniDcxFPtwA2vJSXN4EPolvfwQPGbI2yZCw5aQ+DP9pYk1ja/V1i7Ip2Z1pNFg8AfQqXzijqSA5dwfcBLn+xEd6Sp8HrK1S/EcnvoXE/T+kEyJCmlfA5PFhO4+4zNcWIecLHaGGXHvttX+dhalFRghfvZCwDsoOqGP6wuvF7M00HELwelqNm2G+j/M1NQSnrvC2MPGtfmIb9zgEWL4C9iZfOCPNE8DcugP+IXL6iY/0lD4PdQN4j9LgV/DvVq1a/Z3SYjX1nCjQ5AYwFvFxoXn43iPdlldibFcVl1fCv2HNdnZnao8wnAw8eQJoxSux8WNV4ttL1L+3Z3mq1rDlpH7eUY27L+V72AQS+9fATe93fM8XzUIRuRNuYpRtTLFNqev6LvAKmO0d8AU0AVuQeOJTmBias098pKf0ecByCPh7ULEwKBfXhKbrRR6X+EgzDxY90m14JXLVf6ufn0nYdMIptwhbXyXGPgvXHXj6fs011/yMYLrWsOWlfpanrJf6+Vtwk0E0XStYcroUNosqex5ypPmgHGekyWUs8oUT0twA8rkDDgl54iMQCAQCgYA90n26T/w8d+6AmyDXn/gIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEDjh/wGXjS1Vcjd2yQAAAABJRU5ErkJggg==\">"
],
"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": 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,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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": 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,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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": 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": [
"# 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": 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": [
"# 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": 36,
"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": [
"# 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": 37,
"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+AAAgAElEQVR4nOy9Z5Ad15Um2D0bMbPROzsbsdH6o5mN6BYl7UTsj4mNjenoVotyFEVRhqIkkhLFbhrQkwBJEI4GJEAAhEfBFmzBew8UfMEDBVfwKJT3vhIAQVCWkijWvnNNvnz5bmaem3ky79NDnohD4r2XmXUy85x7z/3uMX/zNymllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUEiF99atffeFLX/rS1/2O+fKXvzzqK1/5ys8yPD7z7/+WlGwppfTXQKkNpZRSNEptKKWUkqX/mDGiVzOGdz5jUN/wOihzzL9kjlkC/878/79mjt2anIgppVTQlNpQSilFo9SGUkrJFGUMabmf4WWM7Z2M8T3nOL4rGclSSumvg1IbSimlaJTaUEopGaAgw8v8NifDjzs+d37hC1/4z8lIp0cT//mpf534tWdmT/jaU57389dA47/21D2Z+1g2/p+f/pZpWaLQ+H/693+c9LWnZ334tad/aVqWOKmobOhfn/4B2NC4f/q3/2Falig07l+e/H8zurcc/m9aligE7wHex4f//OSDpmWJk4rJhib9y1OPw7g39p+f/gfM8S0XXvg/+quHT+y7PuLVmEXTog//9clvwzw06X/+6kuY45v2DvlPfdeHz+irGT547Ni/+Q9xy4cl8AeYX/Avz3wNc3xNzaP/MfM+3s28jw/ajj79v8Ytn1FCrLxKMyuvxxyfe7/4xS/+Heban3/++UBS9Mfffzow6wdDBib96zMDs3/42sCnv/19Yn+bkv7y588G5j8ygt3HlG88N/Bxt2VapFAE737t4CnsPoD7GzsS/fsUtoGlYrGhX9+4PTD5G8+y97X4V+8MfPbnPyf2tynpD7/+3UDJA6+y+4D//+E3vzMtUiiC5w/vAe4D3suvb95O9O9T2AaWisWGYJyTY97aIVMGMH/7TtfqAatmBONPf1OfgJTBBPMO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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": 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+AAAgAElEQVR4nOy9eXBV15X/206q8quXl857r8pUvUfyh40ESb2u369fVVfSjWO7HTtO7AwOdmxix7GNGcxgsMEGMxhsDEaIQQwCMYlBzGIQgxCTmARICDFICMQkBJqFwHhI/zrd/et0fN5e+9xzdSV0pTucc9be+3xX1Qc0HJ27zjlr773O3muv9Td/A4FAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUBclD59+rzVq1evR7s6JjU1dXzv3r1fEEwXX3/fL90gEAgEAoFAIO7Kt4Qz97ZwAM8Kx+7xaAeJY/qKY7Lpa/H/98Sxef6pCIFAIBAIBAJxXYRDt6YrB1A4fZOEEzg44vhGfzSDQCAQCAQCgXgi3TmA4neZglcivm/o0aPHd/zRDuKVzPzvf/i/0voO6DfzkQEL0n4yYOPMnwzYmvbIgBVpfd8YNP0nf/wBt34QSLwy9W/+5htpfV/755l9B0wRNr1S2HS+/F98/+kjbzxOv+fWEQKJV6g/nvGTNwfPfOSNbNlPU39N/Tb136If59YPorHEMAOYlZqa2j/i+5aePXt+O5Zzf/311xZELfmisdUqmLHSSn98kDXzJ29GZePIWVbNqUoLzxCiuvznv/+HVbxmt5X1/Ptd2nTWC2PFcfnyeAhEZaF+l/pf6oe7smnqx6k/p34dop644aN5KjEuAQ+M+L451nPTDbh371+szz4D3LS2fGEVzF5npT9mO36zf/qWtXFMhnVsVb51bu8pq/zAaat400Er7+Pl1vxfjgp3MJvGzLOa6+/6ri/ZDewHdMfZPcXWon5tjt+yVyZaBzK3WKfzjlq1Zy/L/+l7+rlzDB1Pf8etO1Abrj6I+lvqdx17pf6Y+mXqn6mfpv6a+m3qv6kfl46g6Nepf6d+nvu+gTb7SdY/81w6OoDC2UuJ/L1w+H5Ms4D0da9evcShvfNjPTc1HroRd+8CTmoqb1orXpsSdvz2zFpr1V1vinp8S9Pn1okNB6wFv35X/s3SlyfKc/ipM9kN7AdEo/X2l9butDXhQXL1kE+tyyWXrDt3/iR/39F+6Of0+9WDp4f/Jj89R56H+1qAmnD0QTcu1FhLfz9B2if1v9QPU38c7fi6a42yP3ccwezXP/K9rwbR7cc9T80DEc7ecOHQVQlyxNdPiB89IL6uEV9/t8NxacIJfFmQnpKSkhrr+TGA81NdfsOa/+zI0OzIJOv6+eqY/7b2aoO1csBU+bcZPx9hlRee8U1vOIAgGk21d6x1b9tLY3OeGmqVbDkcdvwcotkPHVeSe9ia8+RQ+ffrRs6S5+O+JqAefvdB5QfLZD9LdrnyzalWrXDuYv3ba2evyRd1OWP47CiruuIG+/0LOso7gF4LBnBebl2uszJ/O0Z2CrnjFlotjffiPge9fW77cElomWGgdXRVvi+6wwEEnXG7+QsrZ2iatMfMfu9ZV8uudnpcd/ZztexKuG2sHT7Tam3BTCBoj5990NGVu2X/Sva4ffLSLmf9okH9++axC+22IWz71pV69nsYZOAAYgBno7662Vry0njZGax/Z05SAxzNmpDj53RQJVuPeK4/HEDQEbLD7VOWSRtc/MLYLsMYYrEfWj6j89D5KMaq4ywiCDZ+9UE0g+3E8VE/m4wd0gvS+pGz5fmW9B9v1d9oYb+PQQUOIAZwFmhJy4n5o9ioRGb+OqM0rygcR3jl9BVPrwEOIOjIoaV54XAECm3o6thY7af6fLWV8bS97HZo2Q72awTq4EcfdKX0cjh+7/SOIlfOSf396kHT5DlpHECIAw9wADGA+45s/MLpo8a//I+TXW/8BbPX2zspn3/faqi57dl1wAEEkZzeeTyc9uLC4XPdHh+P/Vw4fDacFqls1wn2awVq4HUf1FDTEt7BXjB3g6vnbqxttZa/Olmee42LkwAgduAAYgD3HWdnJC3/0jKw2+enXZMUMyVjp0aki++/8uQ64AACh6qTF63ZTwyRNle8qTCmv4nXfk5uPBie3a4qvsh+zYAfL/sg2Y+OcPrRmZ7sRq+vbrKyXhwnP4PGBe77GTTgAGIA95XKY+XhQYzSCXj1OfTmSgH49Fl7MzZ68hlwAAHRePN2OB1RPLaWiP3QLIyTfqPxViv7tQNevOyDHFujGUAvV1JuVNTYS8yPDrQuFlWw39MgAQcQA7hv0BT/4t/Zb3t+7NSVsSuhWZkze4pdPz8cQEDsmLoivJHpTmvss82J2A+df/0oO4B+xyfZ7NcOePGqDzqTf7Itllr0o15fx5Hs3XYlnBfHYSnYR+AAYgD3DUpqS4181aBpni3LdqR4c6H8zIW/GW011d919dxwAAHNWDi5/iilUTx/m6j93KyqC+cIvHT8Avs9AHx40Qc11d0Nz2gX5x7y5TpoPFg18BP5mZQ0mvu+BgU4gBjAfYEGKpripzdKPxOAUroCigP0IogZDmCwoXQWTkWERGa0k7EfZ8aEEuuSHtz3AvDgRR/kbKKjBOR+ph2icUGu2Ihx4tKJSvZ7GwTgAGIA9xya0nfy/R3J3uX751M6DtpBOeufB3ebmiMe4AAGm8Ks7eE0FokEyCdjP/R5ThqlwiXb2e8F4MHtPohSDoX7SoZKHYeX7wxvEMRSsPfAAcQA7jnOG+XKNz/xben3Ph3mrA/vCnbrrRYOYHChWqY0W0GJxxONkUrWfi6fqpKfT7PqqK0aTNzsg+zVEnvX716XV0tihcYHKjEnV2xEn819f00HDiAGcE+hgSn8RhlHjV+3ofi/haG4FgpwduOccACDiRwoQ2mG8mfmJHweN+zHSank5osN0Ac3+6Cy3SfC8dLN9Z+xXRONEzRe0LhRU3mL/R6bDBxADOCesnXiYnugTOcP7C3dfjSc1sCN5QU4gMGkNO+YXcv0uTFJbSxyw34oYH/hc6OlPlQFh/veAH9xqw+i/tCpO62CHTkbBmn84NbFZOAAYgD3jGtnrsqA3rlPDVOi3iPNkDgVSPYvyE36fHAAgwfF3jmJa5OtyOGW/ZAedgqNDzxJ1gvUxS0b2jd/s12R460ZSswkU4EA2llP48e1s9fY9TEVOIAYwD1j4+gM2akcWJi8s+UW5JTKuKknhli1VxqSOhccwOBBaTGcjR/JDpRu2Q/pQSUVSa+SLYfZ7xHwDzds6NaVenvJ9bFBSjlb+xfYTunGMfPYdTEVOIAYwD2BtvFT4533i7eVK/RNCXTdKD0EBzBYtLZ8aS1+Yay0nbMFJUmfz037ObunJJxIF7OAwcGVONIZq6Xt7FQssTjVCs4Q4wfphtKH3gAHEAO469CMRM7QGbLh0rZ+bn06cvNSrXzbpd2TVIsy0fPAAQwWVOOXbDr79Y9cWSZzewenkxbGr+S9gJ9kbajuepO9m/3xQdbNqlr26+mIkxaGNl1x62IicAAxgLtOxaGz9m6yX7+rbC6n7ZOXJp0cGg5gcIic/Tu395Qr53Tbfkgv0o/0JH257xnwnmRtyEnRtX3KMvZr6QwaP5yqJBcOn2XXxzTgAGIAdxWaich+42PZYI+v28euTzQoyamzQSXRQudwAIPDyY0H7dk/Yduq5pG0295H9izgpkL2ewa8JxkbaqhpkRstKCb6RkUN+7VEo2jtXjuP7ICpSmxQMQk4gBjAXcWJRaJZCNVLVOWOz0xqkwocwGBAdkypg8hWzu8vde28XtjPuX2lmAUMEMnYkLPJYsuERezX0RWy/T3/vquz78AGDiAGcFdZPXi6PQOxWf0ZCJmmRuia8fMRCW1UgQMYDE5sOBCqZOPuDIQX9kP60UwJ6Uuzltz3DnhLojZEGyzmPj1c2olKO3+j4cTfrhnyKbsuJgEHEAO4a1BpKmqkFLOh+uyfA6UYSLSeKhxA86FZtMx+70kbKT9Q5uq5vbKf8/tPhxOeY0ew2SRqQweztkkb2fTefPZriAUaTxb86h2pc6KlF8H9wAHEAO4aTtUP6ly4dYkVx2md98xIq7khvvJHcADN5/TO46HYP3d2/kbilf1ExgImm6waqE0iNkRl3uaF0qvo5EwdXLQV1UFcBg4gBnBXoKTKlEqAUqtQcDG3PvGwfuRs2bEcyd4d19/BATSf1YOmSds4te2o6+f20n5ObT0i9V6NJTOjScSGjmTvkrax/p057PrHA1WTclLW1F5NLok/sIEDiAHcFfbO3SA7lR2KJRONhcpj5faS2fO0ZPZVzH8HB9BsaHbEy5AGL+2n3ZLZ6Svs9xJ4Q7w2RP2bs6HpYlEFu/7xkvfxCqn7vnkb2XUxATiAGMCThpZOnYzt1eer2fWJF1lK69UP495lBgfQbJxckQcWbfHk/F7bz4HMLUrneAPJE68NUQUbsgkqHahjSpXr567bG/fEeBNvyA64HziAGMCTxsnTREup3LokirPTM55rgANoLlSMnuqjElQtwYvP8Np+6q41Sv1p2YyWz7jvKXCfeG1o3duztN8hvm7kLOXzzOoCHEAM4Elxp/UrK+vFD2SDrCg8w65PoshZzKdHyOuoqbwZ09/AATQXZ5fk1klZnn2GH/bjbMxKZJc7UJ94bIiSPTtpr1St0BQL5QfL5HUseWm8HH+49dEZOIAYwJPCKT+17JVJWi4pRJKfniOvZc+stTEdDwfQTCj1y8JQ+anLJZc8+xw/7If0l2UZnxuNxNAGEo8NOf1bfnps/Zuq0Diz9OWJSAztAnAAMYAnRc6wNHtJYZO+SwoONy7E94YMB9BMSvOKpB2sGviJp5/jl/2sfPMTeT2U0ob73gJ3idWGIlc4qJ/j1jtZnNKMNP5w66IzcAAxgCcMLZU6OfRamj5n18cNwjEyMTi0cADNhBw/sgFyBL38HL/spzTvmJ0SZtA09nsL3CVWG3JinCl+jltnN6DxhsYdO2TnFrs+ugIHEAN4wuxfkCsb4O60Ney6uIWzS27Fa1O6XdKGA2ge4SXT33i/ZOqX/VBKGGdJW6fEv6B7YrEhmeXgj5ONWzKlcSeZWu4ADiAcwASh4FunRJZJg0pknqyqkxe7PBYOoHnkfbzcrmaz2PtqNn7aj1NFgfKocd9j4B6x2NClE5URpQHN2TTh5Omk68JmkMSAA4gBPCEuHD5nb/74g/6bPzpyaGleTDtA4QCaBcV9zv3ZMGvmowNlZRuvP89P+7l1pV5eF8WB6bwDFLQnFhtydoIfWraDXV83oXGHNh/StV04cp5dHx2BA4gBPCG2fbgkofJpOkA505wccF2VtYMDaBbO5o+1I2b68nl+28/a4TOxGcQwurMhpy+jXJC6leiMBaesHY1H3LroCBxADOBx01R/15rz5FAr/bFBVn21N0lyudkyYZHsWIpy9kY9Bg6gWawfZdeEpjq6fnye3/ZTEqoPvEGzGrAgOt3Z0LE1BfZqxsTF7Lp6ASVpp3FozlNDreZ6VAaJFziAGMDjpnhzoexUNo7OYNfFK87vPy2vceWbU6MeAwfQHKhqRvpjA+2BxKcSU37bDw2QdH0mv7gFje5sKPuNj2U/Vn6gjF1Xr9jw7lx5jcW5h9h10Q0tHMDU1NTxvXv3fkEwXXz9/WjH9enT5+/Ff9/s0aPHd1JSUlJjOTcG8PhZM+RT2eDO7D7JrotXtN7+0pr/y1F23qyKzvNmwQE0B2cpier/+vWZHPbjhG4cXWle6EYQ6cqGqituyGe94FfvyP6MW1evKNt9Ql7nmrdmsOuiG8o7gMLh6yscu2z6Wvz/PeEE5kU7VvyuQhxzT7CzZ8+eD8Zyfgzg8UE5l2Tuv1+8LdNLcOvjJfkzc7pMMwAH0ByWv/qhHUx++Jxvn8lhPxcOn5XXSWlBuO85SJ6ubGj/gs2hyh857Hp6CY1DGWI8kjkBLyInYDwo7wAKZ26ScAIHO98LJ6+xi2Nfj/f8GMDjg5whmftvxmp2XbzGSTOw+IWxne50hgNoBlfLrsrnnPnbMb6mk+CwH0oDkvncGHm9185cZb/3IDmi2RDZ8aLn3zcuTVc0dn262n5Zz9zCrotOKO8ACocvU/BKxPcNtMTb2bHCAUxPSUl5Vvw/8aGHHvphLOenxnPvnn0jQNfcvdOWI++q6FS49fH8eu/+yVry+wmhnICV9/2e7Ab2oz9U+5me8b55G339XC77oeuk6y2Ys5793oPkiGZDl45XyGe8VPRf1I9x6+k1V0qrwi/rNE5x66MLZDdu+WqeiHDmslJTU/tHfN/Ss2fPb0c5/AH658EHH/xb4SiWxnJ+CxKz1J2/Ym+MeG2y9fXXX3Or44uUrN1jv1nOWcutCsQD+etf/svK/I1dJeNeXQu3Or7IZ7ea7BnP50bL64eYJ/tn2eErp9YVcKvii9B4lB2qdlJffo1bHa3EBTfNOwktAQ+M+L65s+NSUlL6id9lhL79hnAA/xzL+ekGYAYnNrZPdnL/7WLXxS9uVdWGYx5bW75o9zvMAOpP+YHQbu8BU33/bE77yX7jI3ndFYVl7M8AJE5nNnS7+XMr4+cj5POtvVLHrqNfhDdyTVnKrosu6DAD+GOaBaSve/XqJfy63vn0tXAKUyKPEw7gk+L3P6KvH3744R+I4wpjOT81HroR3GvxqhOZQoJyL3Hr4yfhXc97itv9nOwG9qM3W8Z3n+/RKzjtx/T8cEGhMxui7AxB3BXbLpUTcgLGBNmN2z6b6yKcvTThBL4civGj9C4PCAevRvz8ux2OG0yzheJ307AL2F0ox1JQk8ie2HBAXvvm9+e3+zkcQL1pqr1jzf7pW91WfPEKTvuh601/fJC8/qa6u+zPAiRGZza06b15sr86uekgu35+s16MT3TtJbmH2XXRAS0cQC8FA3hs0NskNayyXSfYdfGbxtpWWUqJHIXGW63hn8MB1JuTGw9Km6YBk+Pzue1n4xjbUSjeVMj+LEBidLShxpu3w6XfqN/i1s9vynYelzadMzRYs5+JAgcQA3i3UG4lalQZAcj9F43NYxfKe0Czgc7PuAdwkByrnaX9fJ6E5tz2E9SlQpPoaEPH1+2TzzR33EJ23Thoafo8nBPwZlUtuz6qAwcQA3i3UG4lalCUa4lbFy7O7imR92D14Onhn3EP4CBxnJcazoTm3PYTmUAXg6WedLShVYOmyed5bu8pdt242DV9lbwHBxdtZddFdeAAYgDvksiEopdPVbHrwwUNlvOcwfKSPVhyD+AgcWhw4H6pUcF+dk5faQ+WWdvYnwmIn0gbCr/UPDMysCs1xOWSS20J/H1M7K4jcAAxgHdJ5dHzdkLRlyd2Wg0jSHQcLFUYwEH8kB0v/t04+6Wm+BKbHirYT9XJi/I+ZL34QeDbt45E2pAKLzUqQHa8NJTAv/JYObs+KgMHEAN4l1BOJWpIh5fvZNeFm0snKuW9WPLSeNnJqDCAgySeY//xrE6PCvZD10/On13t5iL7swHx4dgQVfvIenEcnmMIGq/snIDL2HVRGTiAGMCj0pb7b6DMscStDzftZo5KLikxgIP42fFJtnyGhUu2s+qhiv3QjDbdj53TVrI/GxAfjg1dLsFMbiS1oZyAc58aZjU3ICdgNOAAKtABqwrlUqJOZX0Ac/9Fw9kQszttjTIDOIgduUvwabtKwq3Lday6qGI/N0PVbqh6RJBjx3TEsaHdM1Zj40MH1o+abecE3HqEXRdVgQOoQAesKpRLSeb+23mcXRdVuHGhRt6T+c+Osu7c/lKJARzETluesDR2XVRxAIlwW98dvDyfOkO2819/+Yvc+EHPr6byFrtOqnBaobauKnAAFemAVaP2aoM9K/D0CDlrwq2PSqx88xN5b87vL1VmAAexseHducpUClDJASzeXCjvy8bRGey6gNgh26k+WSGfHaWA4dZHJcKz/Y8ihCkacAAV6YBV49jqPXYQ7eSl7LqoBtWNpXuzZXymMgM46J766mZZy3rOk0Otpnr+8mcqOYBUDo7KwlF5uPob/pfFA4lBtrNzcpbsjygJNLc+qrHtwyWhWt8F7LqoCBxARTpg1aCExzKh6L5Sdl1UI7KO6n/867/BfjTh6Kp8adNbJ2Wx60Ko5AASWyculvfn2BoMlrrQXEf1rIeE6lnfZtdHNSghtqx2M+RTdl1UBA6gQh2wKkQu/yIovHNoqUzmmSo4AfvRhFUD7aX78gNl7LoQqjmA5/eftqvdYClRG4o3hepZj+GpZ606stoNloGjAgdQoQ5YFbD82z3OZoKNo2bBfjTg1pX6cD3r1pYv2fUhVHMA5WD5c3uHNL0EcusDuofqOMt61ti8ExUsA0cHDqBCHbAqYPm3eyjAeO7Tw+03SwyWyuMs/6qUGFY1B5Cglz4sA+uB81Jj17PGRr1oYBk4OnAAFeuAuZHLv8KpwfJv9zhVUo6tzmfXBXQNLWvaO7dPs+vioKIDSC99chkYg6XyHF25Wz6rvWmrlLIh1aBxLPyyjmXgdsABVKwD5gbLv7FTvj80WA5GzJTKhGNaFUt0rKIDiJgpfVgVeqm5WXpRKRtSESwDdw4cQMU6YG6w/Bs7rS1fWPN+gZgp1aHlTBVfalR0AIm2wXIvuy6gc2qvNISXfykRtGo2pBpYBu4cOIAKdsBcUP1ELP/GDtnNnunZiJlSHFrOVPGlRlUHMDxYvjWDXRfQOW0xrUuVtCHVwDJw58ABROMJo+pMiaqQ3dworkDMlMLUKfxSo6oDKAfLnw2T962+uoldH3A/zkpNOaoRxQyWge8HDiAaTxgs/8YH2c1f/td/4s1SYZyqLdT5c+vSEVUdQMJJCo3qEuoRuVJDYSiq2pBqYBn4fuAAovFIsPwbP84Avm1SFmKmFMXJk0adP7cuHVHZATy7p0Tet5yhaey6gPY4KzX0UqOyDakGloHvBw4gGo8Ey7/x43S+5/aWIGZKQWj5kjp7Ws6kvI3c+nRE5cG7pfGeNfepYVb6YwNlDWVufUAba5yYVvFSo7INqQiWgdsDBxCNR6JqoLzKOJ0vJWFFzJR60PKlrP07cTG7Lp2h+uC9ZcIief9OrN/PrguwcWJaaSaLZrRUtyHVwDJwe+AAovFg+TdBIjtfxEypBy1f0jOh5UxuXTpD9cH7TP5Jef/WDp/JrguwcWJat07Kkt+rbkOqgWXg9sABROPB8m+CRHa+Z/YUI2ZKIWjZkpYvaRmTljO59ekM1Qdvum9znhoq7uMgq/5GC7s+gF5q7JjWswX2S43qNqQiyHPZBhxANB4s/yZIZOeLmCm1oGVLsmlaxuTWJRo6DN654zPtZeANB9h1CToUXiJfaiJiWnWwIdXAMnAbcAAD3niw/Js4HTvfLeMRM6UKtGxJz4KWMbl1iYYOg3fZ7hP2MvCIdHZdgk5nMa062JBqYBm4DTiAAW88kSkFuHXRjY6d75ndiJlSAVqupGVLWr5UdfmX0GHwlsvAT9rLwA01t9n1CTI5w+yYVgo3cX6mgw2pCJaBbeAABrzxYPk3cTp2voiZUgNariSbpuVLbl26QpfBO3fcQnk/T246yK5LUIkW06qLDakGloFt4AAGuPGoXCZLBzrrfHM/QMwUN+veniWfAS1fcuvSFboM3mU7j8v7uX7kbHZdgko4pnV8+5hWXWxINbAMbAMHMMCNh5JhYvk3cTrrfMt2IWaKE1qmlMu/T6q9/EvoMng3N3xmzf7pW1b644OsxptYBuZg7YhQTOvu9jGtutiQimAZGA5goB1ALP8mR2edL2KmeKFlSrn8O24huy7dodPgvXnsAnlfizcXsusSNBpqose06mRDqhFeBg5wBSc4gAFtPFj+TZ5one/msYiZ4oKWKeXy787j7Lp0h06D9+kdRfYy8Dtz2HUJGuGY1g8y7/udTjakGlgGhgMYWAcQy7/JE63zPR2KmVo3cha7jkGClidpmZKWK2nZkluf7tBp8G6ut5eBZ/3zYKuxtpVdnyARjmnddX9Mq042pCJUUSXIy8BwAAPaeNZg+TdponW+iJnigZYnyaZpuZJbl1jQbfDe9N58eX9Lcg+z6xIUuotp1c2GVCPoy8DKO4Cpqanje/fu/YJguvj6+8ke11GC2Hiw/OsOXXW+iJnyH1qepHtemlfErkss6DZ4l24/Ku/vhnfnsusSFLqLadXNhlSj3TLw9SZ2ffxGaQdQOHJ9+/Tpk01fi/+/J5y7vGSO60yC2HiK1u7F8q8LdNX5khMiY6ZGIXWGH9CyJC1PyuXfevWXfwndBu+m+rvW7CeGyPvcVHuHXZ8g4MS0no4S06qbDakIVVahe0yVVrh18RulHUDhzE0Szt1g53vh2DUmc1xnEsTGkzPUzihP09/cuuhMV51vu5ipW4iZ8hpaliSbpmVKbl1iRcfBe+OYefYy8NYj7LqYTiwxrTrakGqc3VMibZoqrXDr4jdKO4DCkcsUvBLxfUOPHj2+k+hxnQk1nnv37BsRBBpuNIcLit9u/pxdH50hu+nKfja9H4qZ2nKYXVfToWVJufy7/Si7LrHSnf2oyKltR+R93jgmg10X0ynJbYtpjXaMjjakGreb7skKKzQuUsodbn38hOzGHW/NA+nTp09Wampq/4jvW3r27PntRI/rTKyAScWuY7JT2T11ObcqxkvVwVK7ePu4+dyqGC3//j//LJcmZ/90iPUff/43bnWMlnb3+l9xr72UrWPtF8jLh05zq2K87PpoqbzXFbuLuFXxXdzx1jyQ0NLuwIjvm5M5rjOhGxCkt6d1I9KloZ/dc5JdF93p7u27uaEtZqq57g67vqZyaqs9K7VpzDx2XeJB19mbjaMztJtt1Y2miJjWlobPoh6nqw2pxpnddgUnSrnDrYufqD4D+GOa3aOve/Xq1VtIPn0tnL2UWI6LRajx0I3gXov3g64yyoP4Ibvpzn4QM+U9jkNyStcldicAACAASURBVLN7HIv9qAiFNNjxlvPYdTGVtnvcdUyrrjakGkGt4ER246bP5roIZy9NOHcvC9JTUlJSxY8eEA5ejfj5d7s5LiYJUuMJpxToJKM8iJ9YOl9ndoqcFG59TaSpTt+dqboO3uEd1+K+085gbn1MJDKmtavjdLUhFXEqOBVvCk7qLuUdQK8lSI0nXCark4zyIH5i6XzJKaHBUjoodRgs3cbJTaejg63z4L1Bs5yLOuH0GbE42DrbkGo4FZyClLoLDmBAGg+lItGpTJYOxNr5hpcot3X9Ng/ih5YhnZ3W3LrEi86Dd3HuIXuH6vv6pN3RhfCqwZjul9h1tiHVCGLqLjiAAWk8Tp40Xcpk6UCsna8TzxNLhw5iJzIxsY71aXUevGmA1C3xti7EE9Oqsw2pSLjcoYYvlIkABzAgjSccU4IlG9eItfNFzJQ3ONVWaDmSW5dE0H3wpqWyrqpUgPiJN6ZVdxtSDZ1DShIBDmAAGk88MSUgduLpfNtipo6x620Km0OJtmk5kluXRNB98KZgeXtVofM6tSB+4nVAdLch1SAHPByzrdmmskSAAxiAxhNPTAmInXg6XydmSqdSZSrjxOtQXKuu8Tq6D96xlCoD8RFvTKvuNqQiQYrZhgMYgMbj5KILgkH7STydL2Km3CW8Y2+kvjv2TBi8KXEuMgu4QyIxrSbYkGqUOInlA5DnEg6g4Y0nslMJwpS2n8Tb+YZjpnYgDjNZTMjZZcLgfXIjcou6RSIxrSbYkGoEKWYbDqDhjSfcqbw7l10X04i3822LmcJO7GSg5cbw8u9NfbP2mzB4h6sLPYnqQsmSSEyrCTakIutDMdumv6zDATS88ZCzIWNKcoOxrd1P4u18ETPlDrTc6NTt5NYlGUwZvNeOmCmfx5ndJ9l10ZVEc9CZYkOqUbw5GBuc4AAa3HjazZRoGiivMol0vutGhmKmkDojYWi5ke4hLT9y65IMpgzeJzYckM9jy/hF7LroSqJVKEyxIdUIyss6HECDG0+ZAYHyKpNI5xuOmRpn9pulV7Qv2t7Crk8ymDJ419+gZeCB1pynsAycKInGtJpiQyoShA1OcAANbjzOTInOgfIqk0jni5ip5KBlRrJpWnbk1iVZTBq8c4al2cvAe4rZddGNZGJaTbIh1Qi/rI/PZNfFK+AAGtp45EzJU85Mib6B8iqTaOe7dkS6/Wa529w3S6+gZUa6d7TsyK1Lspg0eB9ft08+l60TF7ProhvhmNaR8ce0mmRDqhF+WTd4ZhsOoKGN50y+M1OSzq6LqSTa+ToxUya/WXoBdcJznxomlxtp2ZFbn2QxafCur26Sz2Xuz4ZZLU2fs+ujE8nEtJpkQyqydvhMo2e24QAa2njoTdyUmRJVSbTztWOmzH6z9ALqhMmmabmRWxc3MG3wzhk6Qz6fswUl7LroQrIxrabZkGqYPrMNB9DAxkNv4PQmLmdKqpvZ9TGVZDrf8JtlPlJnxIrzUkOdMrcubmDa4F20dq89WE7KYtdFF9piWhNbqTHNhlSDZrZnPmruzDYcQAMbD72By5mSoWbMlKhKMp3vifX77dQZE5A6Ixbav9Q0sevjBqYN3nXXQ4Pl08Ot281fsOujA8nGtJpmQyqy5i17Zvvc3lPsurgNHEADG8+2D5cYNVOiKsl0vjQzK2OmnjLzzdJt2l5qZrDr4hYmDt5rhnxq7GDpNpEb9RKNaTXRhlSjKMee2aZxlVsXt4EDaFjjIWci4+kR8k2c3si59TGZZDtfmqGVMVN7EDPVHbSsSPeKlhm5dXELEwfvopwCYwdLt3FiWikcJNFzmGhDqlF7rVGOpzSumvayDgfQsMZDqUWw/OsPyXa+pgcYuwUtJ9KyomkvNSYO3pGDJZaBuya8UW/9/oTPYaINqYizDGxauUM4gIY1nk3vzUfyZ59ItvMNx0wZGmDsFrScSDZNy4vcuriJqYP36sHT5fM6v7+UXRdVcWujnqk2pBpOUujN789n18VN4AAa1HgoizwVE5/9xBCrqfYOuz6m40bna3KAsVs4y7/H1hSw6+Impg7ex1bvwTJwN7i1Uc9UG1KNxtpWObYSjbda2fVxCziABjWecIJh1Jn1BTc6X5MDjN2guf6zcJ40U3b/Opg6eNPMtlMbmMqcceujIs5LTbIb9Uy1IRXZPHaBcbl14QAa1HhWh3bgIRGrP7jR+daFYqaQOqNzSrYclja9/p057Lq4jcmD9/qRs+VzO7X1CLsuquFmTKvJNqQazqYdk0JR4AAa0nhuVtVK45z3i7fhSPiEW52vkzrD1HJDybB2hJ0wuzSviF0XtzF58C7dftSub/t2/PVtTccp00nhH8mey2QbUg0aVzPE+ErP7mZVHbs+bgAH0JDGU7hkuzTMndNXsusSFNzqfJ2l+03vzWO/JpWovdoQnh01sWSeyYN3ZN1m2hnMrY9KbBwzz679uyn+2r8dMdmGVGTnJ9ny2R1amseuixvAATSg8dy58ydrSf8J0jAvHb/Ark9QcKvzpQ07s3/6lgwwTqQeqKkcXr5T2nTeR8vYdfEC0wfv7VOWyud3ZMUudl1UQdYBf3yQbO9NdXeTPp/pNqQaF4sqpE0v/f0EOe5y65MscAANaDxXSi9Lo1z0/PtGGKUuuNn5OiWhTNvpmihkx8temSTvSeXR8+z6eIHpg/eFw+fk81v+6ofsuqiCs0PardyfptuQatxp/cpa1O99+QyvnL7Crk+ywAE0oPHsmbVWGuT+BZvZdQkSbna+5QfK5DPMfv0j9utSgatlV+T9yOz3nux0ufXxAtMHb3pumb8dI5/j1bKr7PqowIrXpsj7UV54xpXzmW5DKrJv3ib5DPfMXseuS7LAAdS88bTe/spa8Ot3pUFWl99g1ydIuNn50nNcGHqO189dZ782bpyXGupsuXXxiiAM3nszNhozWCbLtbPX5L1Y+Nxo2d7dOGcQbEg1rp+vtp+j6K/deo5cwAHUvPFUiDdJOXP0BmaO/Mbtzrdgznr5LOl/7mvjpPX2l9aCX71j/EtNEAZvkwbLZCmYbbfvvXM3uHbOINiQijgzuRWHzrLrkgxwADVvPJRAmAzx6Kp8dl2ChtudL838tQ2WX7JfHxfh5fA3PmbXxUuCMnhTWIOby546Il9qnJUa4RS7dd6g2JBqHF25Wz7L7ZOXsuuSDHAANW48lGXfTrVgXpUEHfCi8w0PlsIJ4r4+LihAPggbYoIyeNPLqZsbH3Tk/P7TnrzUBMWGVIMS+FOKIxp/dU5RBQdQ48ZTmnfMTrY6EslWOfCi8yWnh54p7Qrmvj4OmurvyhQZlCqDUmZw6+MlQRm866ub5UsqlfSj0n7c+nCQOz5Ttmsq/ejmeYNiQyqydkS69knq4QBq3HioPBbKLfHhRefbLk9Y7R32a/Sb4txD0qY3vDuXXRevCdLg7fRVVNqPWxe/aaxttWY/MSSU5/O2q+cOkg2phlOmcoPGZSqVdwBTU1PH9+7d+wXBdPH197s6tk+fPn8v/vtmjx49vpOSkpIay/l1bTzSUQj4WzU3XnW+4UoBG5OvFKAbOcPS5LWX7TzOrovXBGnwPr2jSD7XtcNnsuviN22Vfua7fu4g2ZBqmLBaobQDKBy+vsKpy6avxf/fE05gXlfHi99XiOPuCXb27NnzwVg+Q9fGU5RTEPi4Gm686nydWqGrB09nv0Y/uXWlXpZ+y3h6hNXS9Dm7Pl4TpMFbloZ7erh8vrVXGtj18ZPVg6bJ9nx2T4nr5w6SDanIlgmLPFna9wulHUDhyE0STuBg53vh4DV2c/zr8X6Gro1n5ZtTA79ZgBuvOl8qOj7vmZHy+dZU3mK/Tr+g+pqy9NvHK9h18YOgDd5U0o+eL5X449bFL2oqb8prnv/sSNmu3T5/0GxINc7vL5XPd+Wbn7DrkghKO4DC4csUvBLxfQMt70Y7XjiA6SkpKc+K/yc+9NBDP4zlM6jx3Ltn3whdqKmssTuVX46y7rR+ya5PUCG78cp+ds9YLZ/xgcxc9uv0g7t3/2QtfXmiXc+6qIJdHz/w0n5U5OKxcvl8l70yUT5vbn384MDCXHnN+TPXeHL+oNmQaty5/aUch+XL+sWb7PrEC9mNG76aJyIcuazU1NT+Ed+39OzZ89td/MkD9M+DDz74t8JZLI3lMywN5cTKndLgDi3YyK0KxCNpuXpLPuMlL46zvv7rX7nV8VxuX6sL1PUGUei5Zr0wVj7n29fruNXxXOT1/i50vdfMv96gSuH8DXbM9qpd3KokJEm6acmJcOoeI2dNcKoDeTSTJxzAgRHHNkc7T0pKSj/x+4zQt98Qf//nWD6fboBOb0/05pz1u3F2MepTl9j1CTJevn1HzojRzAn3tXpN/syccD1rbl38IoizN/vmh+qopuew6+I1lUfPh2Y8J3k24xlEG1KNyyUX5XPOEi+vus1sqz4D+GOaBaSve/XqJXy63vnO74RjmBJ5rHAAnxTH/Ii+fvjhh38gji2M5TOo8dCN4F6Lj5Wqk7axLXlpvHXnzp/Y9QkyZDde2g/FSsls81OWsV+rl7RGLKPcqKhh18cvvLYfFaHSfvScqdSf6dVutk9ZKq/1yIpdnn1GEG1INWgcJuePnnVV8UV2feKB7MZNn811EY5emnACXw7F9zmpXR4QDl6N+N13Oxw7mGYMxe+mmboLeNendmzYwcXb2HUJOl53vrUR2eap6gv39XpFWyD1VHZd/CSogzdVw6DnTdUxuHXxirYqTQNl1QivPieoNqQaBxZtkTZNsdvcusSD8g6g16JT46FdZLSbzA44Dc7uUFXxo/OlKi+mJ/v2qkqC6gR18A5CtZsS0V7pGtePmu3p5wTVhlTD693eXgEHUKPG45R+WzPkU3ZdgD+dr/PM144wM4EuVTuhZKp2lQQ9k6kmSlAH73bVburusuvjBZTwmtotJcD28nOCakMqQnlbdSsNBwdQo8ajo4GZjB+db2QCXUqUzH3NblO8qVDaNFU/4dbFb4I8eG8cnSGfOz1/bl3cxs+E5kG2IdUo3X7UTuCv0QQNHEBNGs+1s9fCuf90mmI2Gb86X0qMLNP+LM1jv2a3cRKan9l9kl0Xvwny4F2264TWCXS7onDJdnltOz7J9vyzgmxDqmGHaNmb2Wi85tYnFuAAatJ4dk5fKQ1r37xN7LoAG78634tFFfbO7/5m7fy+XHJJXtfC50ZbrS1m7wjtjCAP3vS8F/76Xfn8L5+qYtfHLah9UoYGmdD8RKXnnxdkG1KRvRkb5bPfNX0Vuy6xAAdQg8ZDRaedHWU3q+rY9QE2fnW+NKgsDuV+vHT8Avt1u8W2D5fYO9qzgrmjPeiD98FFW+00R5OXsuviFtQ+7ZxwH/jyshZ0G1KNm1W1cvmfxmsat7n16Q44gBo0nuPr9tlxUqMz2HUBbfjZ+To5AXM/yGS/bjeor26WGz+I+uomdn04CPrgXXe9ST7/2U8MkRtDuPVxg9xxC32tdxx0G1KRDe/OlTZA4za3Lt0BB1DxxkNvkZRJngyq/EAZuz6gDT8738abt+WuyfTHBhmxGcSJk9o6KYtdFy4weP+LtXXiYmPiW2l1hlZp5jw51Gq81erLZ8KG1MPJa7rsD5OUD9mBA6h443Hivxa/MNa60/oVuz6gDb87353T7DjQvXM3sF97MlAFiMznxtjxX8WX2PXhAoN3W2WjzN+O0b4ySMGc9b7Hf8GG1KP19ldyvJZlPMX4za1PV8ABVLzxbJmwyPNyQiAx/O58q89XS1vI+MXbWlcGcXaAUkUIbl04weBtr3Bkv/6R9jvBqT1m/HyEvI7qihu+fS5sSE2ckB2a4ebWpSvgACrceCg2yomRaai5za4PaA9H5+tUBtEhviQaa96aIa+hxODqJrGAwdumJPewtIecoWnsuiSKE6ftdeWPjsCG1IRiWttinJvZ9YkGHECFGw/V+6VOhXZLcusC7oej86U4UDslzAQtQwKunbkaKpmEfJYYvG0oWbJT4lKX/GmRUDukFE0yTrvwjK+fDRtSF4pvVj3LARxARRsPLSk4neKV0svs+oD74eh82w02B/XbFETJcWU+y/mb2XXhBoN3G/vm2fnTKM6VW5d4Ob//tNR96e8n+B70DxtSF8pv6dQHpopO3Pp0BhxARRvP0VX50nhoyY9bF9A5XJ1veLlppL/LTclCYQy0Q5J2MtdeaWDXhxsM3m3cuhyxg/amXuEuTljGifX7ff9s2JDarB2RLm3j2Oo97Lp0BhxABRsPLY1RdQQynMpj5ez6gM7h6nzbBZyX+xdwniw06ydzGY7PZNdFBTB4t4dyXJJ97F+Qy65LrFyP2JjFMcsDG1KbyqPn7V3uz41RMuQFDqCCjefkpoN2UelB05TPIxRkODtfJ+XETh/qjboB5UWb+7Nh2sZ5eQEG7/Y49c7nPj3caqz1J49esjghDVypmWBDakPj96qBn0gbKd5UyK5PR+AAKtZ4KIdQ1ot22S9KKMmtD4gOZ+dLS2bOLjMdygMeyNwibXrz2IXsuqgCBu/72fz+fDtwftFWdl26g8p+OW2QKzk7bEh9zu09ZW/ce2m8HN+59YkEDqBijef0jiJpLMtfnYzZP8Xh7nwp4SzZSt7HK9jvRVfQbE7G0/aSNe0C5tZHFbjtR0Wull2xl1R/PsJqqr3Drk9X5H20TOq6e8ZqNh1gQ+ojq3n9wa7mVbbzOLs+kcABVKjxkKEsf/VDaSjkCHLrA7qGu/Otvdogc0TSpoqaypvs9yMaTjqjTe/NZ9dFJbjtR1U2jpkn7aUwazu7LtG4caFGtjsqz1h3rZFND9iQHpTmHbMndv6o1sQOHECFGs+5fXYNQVoCVm2qGNyPCp1vfvpapXNFNtXdlQHyMp3R6Svs+qiECvajIpT2iuxlnrCbpvq77Pp0hlPDeM/sdax6wIb0gMocLv6dE9p1ml0fBziAijSeyGBR2gTCrQ/oHhU6X8oyT6kzZj46UJaK474nHSlcsl3a9MbRGey6qIYK9qMqG96dK+3m0NI8dl06Inf+ivY256mhsuIDpy6wIX04seGAcps74QAq0njO5J8MF0VXcbs4uB9VOt+9GXYSXUqjwX1PIqHZm3nO7B+Smd+HKvajIpdLLoWT6DbXq1X3mjYyyWTm8zax6wIb0gca1ykdDNnO2T0l7PoQcAAVaDxUCmnxC2OlYZRuP8puFCA2VOl8KcGyk2Llapk6myxo9oZ02vDOHHZdVEQV+1EVqqur2iygs0lFpqpRIGE1bEgvTm09Iu2HxnsVJnrgACrQeJxlslUKTQ2D7lGp83XSrFAAPbcuBKXFoCUy0olmc7j1URGV7EdFLhfbs4BznxqmTOUYCmVQKU0NbEgvqJTnyjc/UebFBg4gc+OhnZzhgfJUFbtBgNhRqfOllBnOZouLRRXs+mweuyCUomY5uy6qopL9qIqTaiV3HH/+SKrKFN6cUqfG5hTYkH44LzY07tcy7iAnAu0Azuz7xiuNF2+wNh7avUnGsH3KMnbDBPGhWufr1I9e0n+8DCvg0oN2uTkDZUMNb5C8yqhmPypC9uPEkZYfLGPTg9oTJfIlPaidcd8XB9iQnmyfstQe9ycvZdWj6mSlNeORAS9z+2K+y6jUZ/9b2iNv/pVip25evMV08y/aSxxCh7rrTexGCeJDtc6XUgdlv/GxHaA+fzOLDlQP1YlnxW72rlHNflTF2T1J6bG4XmxowwfpsHLAVKVSdMGG9IRyR1Jog1z5K+YJkaHcsTKDxE8G/NfUv3vpW9w+me8yo++ApXJb9uDpvjdqigVwBuvDy3eyGySIHxU7X6q0kf74IAlH1Q0nFpFSGpGNc98PlVHRflTEjpuayhZ7Rxurwm1KsTrWsCF9oXFfvlQI2/a7ryR/h9LR0OfPeGRAFrcvxiLC6/3O0pc+kDfhyIpdvj6AyLdaFXYDgfhRtfPdv2CztK3sNz6SCUj9+lyqjkB1UdMfG6jUbmRVUdV+VISSiJNdUeUbP6veUPvJfv0j2Z72L8hlvw8dgQ3pC437NP5zrJY4zid9/tj/8dr/zu2LsUnDhesyqScNXNfPXffl5tNbJJUQUi0rOIgPVTtf6liW9J9gv9hk+/NiQ7vX1709S35mfnoO+z3QAVXtR1V2p62R9rVu5CzfsiXQxAB95tLfT1DyRR02pDfn99vVv2gp1q/ZZfoc50WdYgC5fTBWocZTMGe9fAgrXptitbZ4O2NCu8ecYOI9s9ayGyBIHJU730vHL0gboxeNGh9iXJ03yoW/fleZHZKqo7L9qAjtdF8g7MuvF5uaylv2i/qjA61LJyrZr78zYEP6Qy/MzuY9r0sf0ksM+Tn0eQVzNwR7FzAJNZ7bzZ9bS1+eKG8KxTB5dfPprZWqNTg5/7x2NoG3qN757pq+KhRj8oncnOHV58i3WDFIpj82yLpw+Bz7deuC6vajIhcOn5V2RrMXXq6eUHtx4g53z1jNft3RgA3pDzllThnY3PGZns5uUxgDfc6yVybJz4UDGGo8VKpKBvqKzqXy6HlPbv6xNQXh8kaqJDYFiaN650tvk85SMCWI9mKjE9UfpqoI9BlFOXvZr1knVLcfVXH6UbK76vIbrp+f4v6chM+09Ov1rEwywIbMgBLnz3tmpKf96IUj5+2XJ+HnUEwt/QwOYETjcUpXUYJGWkJz8+ZXFV+U6+40U1JReIbd4EDy6ND53qyqk8uyZNc7p6109e2SSmE5Qcw7P8lGFZs40cF+VITsbMfUFaEg9g+sxlut7p5b2LIMZ/jNaOvW5Tr26+0K2JA5UJ5LZz+C26lhqDiAnfKlfQUSOIARjYcaf/7MnHBuPrcewvXz1dbC50bbS8yLvFtiBv6iS+dLO3KdWsGFWdtdOSfNkqwdMVOec82QT5UMkFcdXexHRcjeVgu7I/tbOyLdtd3uB7O2hWcXOdIoxQtsyCycNFrkL5Df4MY5afLJ6f8p3jDyRR0OYIfGQzdn5/SV8mZl/HyEXBpO5uZXHDprZTw9wl6GG52hVBJRkBw6db4UOyVnoIUdFuceSupcFLvqVLBZ9Pz7Vv0NVPtIBJ3sR0XI7hb1e1/aIdljsjHVxZsL5bmonegSywobMgvyDza8O9f2P4TfQP12Mucj/8XxPygmvOMqDRzAThoPJWWkGqZOOatE3wSLNxXK9XY6Dy1ZYNOHWejW+ZZuPyptkeJAinIKElqypR2+NOMiO6gk2gbQz35UhGa36UXdSQ+TSLwetQOKK6R2QecpzStiv65YgQ2ZB/kJjv9B/gO9mCRyHtk2QmUU8z5e0WmyaS0cwD59+rzVq1evR7s7LjU1dXzv3r1fEEwXX38/lnNHazzkiTuzHBQTeHzdvpgHTLrR++ZtlH/rVPpAfJR56Nj5ygD6RwdKu9w6cXFcAyalwnA2ldDMS7VLSxRBRUf7URFaKsvs91540waV2Iz1b+mFhtqB7KtFu6AXI+7riQfYkJmQv+DsSXBKe8bsf4jjyF9xYv7Ij4lWaUR1B/BbwpF7WziAZ4VT93hXB4rj+orjsulr8f/3xPF5sXxAV42H4kooBYDzEHKGpsmdNNEeBP2cAjmpXqTMwfbEEKts53F2YwLeoGvnSzY6L/RmOP/ZUXLXWVcxfJRHUKaUCTmOZN9Uy5L7OnRHV/tRkVphj05pTbJTsteu8l+SvZPdk/3LlZ5nRlrlGm7Ogw2ZzWnhP5Af4fS71Hd35X+Qf0J+iuOzUPL0rsLOVHcApQhnbk13DqBw+iYJJ3BwxN80xnLuWBoPdQzOJg5i+asfWvnpa61T245aZbtPWCVbj8gbTYkcnWMWvzBW2eShwB107nxvVtVa60fNDtsrLRXQTAi9OZbtOiHt+uDibXZ1j5DjR0lxaTbbz/JyJqOz/agI2eWhZTvCVZbIbmlZmOyY7Jnsmuyb7NxZNibWvzNH7pbn1h82BDqD/AiKtXbslfwM8jfI7yC7PiX+p80dy/4wKXxM5nNjYso2YowDKH6fKXgl4vuGHj16fKe7c1PjuXfPvhFd0dxw1zq2Or/dg+gMWho7ufGAdUd0Rt2dE+gN2U2s9qMqlUfOWasHT+/SpmlHJHU4Ny/eYtfXJEywHxUhO6WVGyc/ZTRo9zrlfOXWNxlgQ8GgteUL6+SGA+FNT9Ggiadja/ZIfyVW+3HDR/NUYpwBzEpNTe0f8X1Lz549v+22Li/9zUvf/LTvm4/M6Dvg3ZmPDFiT9pMBOYJlMx554/1pfQf8d3HIA25/JgTitcz4hz/+P2mPDBgys++b86RdPzJgQ9ojb05O6zugX6CLhUO0lal/99J3yH6lHQt7Jrsm+yY7n/qjAf83t34QSALywIx/fP1/kL9Bfof0Px55czX5I+SXkH/CrWBcIhy1x4RzVyo4FUFpZAxfHEvAAyO+b/ZSbwgEAoFAIBCIh9KZAyicvZTI74XD92OaBaSve/XqJQ7vne+njhAIBAKBQCAQl0Q4esOFM1clyBFfPxH68QPi+xrx/Xc7HJsmnMCXBekpKSmp/msLgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAkpc+ffq81atXr0cjf5aamjq+d+/eLwimi6+/z6UbRB8RdvT34r9vUvUZ7ECHxCLoZyDJCPocSKLS0e8JYl/0LXGhb4sbcTYyx6D4WV/xs2z6Wvz/vciE1BBINBF2UiHs5Z5gZ8+ePR/k1geitqCfgSQr6HMgCch9fk+g+6KOSaZDFUUGR/y+kUcziE4i7OZ1bh0g+gj6GUiygj4HkqhE+j2B7os6OoDi60zBKxHfN9AUO492EF0klHz8WfH/xIceeuiH3PpA1Bb0M5BkBX0OJFGJ9HsC3Rd1MgOYJbzh/hHft/Ts2fPbPNpBNJIH6J8HH3zwb6mWNbcyELUF/QzEBUGfA0lIOswAmtkXiQt5hUP8kwAAIABJREFUjBqG4FQEpZFr3FGWgAdGfN/st94Q9SSKLRF54i28n/j9vNCh3xA/+zOrshDlBf0MJBkJ9TkZoW/R50Dikk6WgIPZF3XiAP6YPGL6ulevXuJXvfP5tIPoIKIzflLYyo/o64cffvgHwmYKuXWCqC3oZyDJCPocSDLSwQEMZl8kvN7h4mKrBDni6ycifp4mbsjLoRgLbK+HdCsUREtvUcKWpmFHHiQWQT8DSUbQ50ASkc78HvRFEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEwi99+vR5q1evXo92dUxqaur43r17vyCYLr7+vl+6QSAQCAQCgUDclW8JZ+5t4QCeFY7d49EOEsf0Fcdk09fi/++JY/P8UxECgUAgEAgE4roIh25NVw6gcPomCSdwcMTxjf5oBvFaRqU++9/S/umNn6T1HdAv7ZHXX5z5T6//bPw/vPR/cOsFgSQqL/3NS98U9vzDGX3f/EXaIwNek/+L7+nn3LpBIInK1P9vwP854x8HPE39tOyvRb899e9e+ha3XhDNpTsHUPwuU/BKxPcNPXr0+I4/2kE8kAfSfjLgl4L9Mx8Z8G8zf/Km1Y5HBnwtfleZ9sgbw8f0fel/41YWAolF0v7x1f9XOHwZM38y4PZ9Ni0QNt1Cv6fjuHWFQGKRqf/wm2+L/ngE9cfUL99n04+8+Wfqx2f80+vPisMf4NYXoqHEMAOYlZqa2j/i+5aePXt+O5Zzf/311xZEHWmsrLbWDPok3IHMenywtW7YDCt/2gqrYMYqK3dMhjXvFyPCv1/wq1HWpQOnuNWGQKLKv/3pf1oH566z0h8bGLbb7Fc/tLZPyLT2z8qR/9P3zu/ouIMZ661//9O/cqsOgUQV6nep/3Xslvpl6p+pn6b+mvpt6r+d3+cMnib7d4ha4oaP5qnEuAQ8MOL75ljPTTfg3r1/sT77DHByp/Urq3DxtvAgufiFsVbxpoNWS8Nn9x17985XVkXhGWvtiJnhzqVg9jpxji991ZnsBvYDuqLy6Hlr/i/tQXL2T9+yCuast6rLq+XvOtoP/Zx+T8fR8fR3F4+Vs18DUBeOPoj62T2z1ob73nUj0q2KQ2dkv9zxWOq/T4p+fNHz74dfbgqztsn+nvveAdt+kvXPPJeODqBw9lIify8cvh/TLCB93atXL3Fo7/xYz02Nh27E3buAi9vNX1jrR822O4jHB1mHlu2wWlu+jOlvT+8oCg+Y696eZTXeavVNb7Ib2A+IxokNB6Q9k21uHJ1h3bxU2+730eyn5uIta8O7c8Ptgc7DfS1ATfzugxpv3hYv3unSNuc8OdQ6vfN4TH9H/fmhpXnh9rD+nTmy3+e+f0GH7MY9T80DEc7ecOHQVQlyxNdPiB89IL6uEV9/t8NxacIJfFmQnpKSkhrr+TGA89J6+0tr8/vzZaeQ2e89q6r4YtznuHL6ivxbOkfWi+Os6+erfdEdDiCIBg12cobk0YHy6zt3/nTfMV3ZDx0fPoeAXoq4rwmoh5990PVz163Fvxsn7XFRv/etq2VX4j5H1cmLVuZvx8hzbB67QPb/3PcwyCjvAHotGMD5oGWA7VOW2bF8v37Xqqm8lfC56qubrTVDPpXnmvv0cKu6/Ibn+sMBBJ1Bs9LO7N2ZPcVRj4vFfs7knwzPmpTFONsCgoNffVC1eKmmfpXscM1bM6z6Gy0Jn6um8qa14FfvyHPlfbSs05cj4A9wADGAs0CNPj/djiPJ+PkI69rZa0mfk5YZtk7Kkudc0n+C1VR319NrgAMIOnLpRKU1+4kh0gaLcw91eWys9lO8qTAcQ5jIDDkwFz/6IOpHl/QfL21w24dLYg7P6YprZ67Kfp/OuYfit+EEsgAHEAM4C4VZ28NxJDRounVeiitZ+aa9i3jTe/PlLKNX1wAHEERCMX7zn7U3fOybt6nb4+Oxn70ZG8MbQ25W1SatKzADr/sg6j83vTdP2t6qgZ+4GrcnX5ZC8duFS7az38sgAgcQA7jvOEtks/55sFVeeMb189debQgvMVAclVfXAQcQODTWtlpLfz9B2lzu+MyYXjzisR86X+64hfL8S1+eaDXV3mG/ZsCP132Q86JOITq11xpdP3/5wTI5DtBnxLqhBLgHHEAM4L5SX91kzfvF27LBn9p21LPPuVhUYcdOPTpQdjJefAYcQECQc0Y70Mmmafa5pfFeTH8Xr/3QeVe+OdXe8T5ylqez20APvOyDzu8/LftP6kepP/XqGkq2HrHzCD4zUsZyc9/TIAEHEAO4b1Cch7PjN/eDTM8/79jqPXaMoXA4KbWG2+eHAwgIStPi7GKPZwBLxH7oBcrZRUn51bivHfDiVR9E/aUTo1eUU+D5dWweuzC0M3gh+z0NEnAAMYD7Bk3xyzimZ0cmtYssVsjhdDaF5Ayd4XqgMRxAQA6ZM1DGO9OcqP3ImZnQiw1mTIKNF30Q9ZO009fZ9OHHBg2yY5oBxG53f4EDiAHcF8jhI8fP71iP5obPrMznxnjyuXAAwZYJi6Rt0f/x/m0y9kNxhvS5WycuZr8HgA8v+qDSPDtGm2aaqf/061qc2HDaSOXHBAGAAwgH0CdoyddJ/un3lv+y0MzjwudGW8317nVocACDDc34OWmMaCYw3r9Pxn7qrjdZGU/bM48VHmykAnrgdh/UVH/XWvib0fZM3O4Tvl5LuxAh8YLDfW+DABxADOCeU7brRESQb/wDZbJQx5IzLE3qQOk03DovHMDgQhsyqF412VSipdqStZ8T6/eH62bHuvEEmIXbfVDB3A3SpqjOOkduvshNgn47oEEEDiAGcE+hJQRKIUANujTvGJseVB6OdrNRyoEbFTWunBMOYHDZN8/Oy7d60LSEd+Mmaz/0uavE58eadxCYh5t9EFVPov6R+slqn8ppdkbp9qPh1DN4sfEWOIAYwD3FqWe6djjPG2UklHE+nELDBV3gAAYTqlrjvExQfdREz+OG/Ti6EG5U0wF64VYfRP3h2hHpsn8smLOe9ZqkLmK8IF0OL9/Jfo9NBg4gBnDPoOS4zg7JyyWX2PWhkkbObOTZPSVJnw8OYDDZ8M4cV2bd3LIfZzZy4+gM9nsD/MUtG6Ka0zJOWvSPFAfIfV2Xiy+Fd7rTOMKtj6nAAcQA7hn75m8Ol2Tj1sXhVCjp6KLn37damj5P6lxwAIOHMzBRPGuyA6Vb9kMvNk7c1OVTVez3CPiHGzZE/eCifu/bYTrbvUvOHy9OCbr9Czaz62IqcAAxgHsCBfPOeWqozCSfzDKZ29DyAtW0pI7l+Lp9SZ0LDmDwWD9qtmslBt20HyfUgmYnue8R8A83bKho7d62eFbmMJ1IKKSBxg8aR5Dv0hvgAGIA94TdaWvCiUS5dekI1R+Ws4Dirbe15cuEzwMHMFhUnbzo2uwf4ab9kD5OIl2apeS+V8AfkrWh281fyAo2Mp3QobPs19MRJ5F/fnoOuy4mAgcQA7jr3KyqkwHyxM1Ltez6dITecrPf+Fh2LMW5hxI+DxzAYEGbh+Ts37IdrpzPbftxZgFplpL7XgF/SNaGijcVhmpYT1Vq9s+hpvJWeMPVrct17PqYBhxADOCus33KMtmp7Jq+il2XaJzbe0rqmPXiB1brbZ40HkAfLp2oDJcxdCuZuNv2Q3o51XZotpL7ngHvScaGWm9/Kfq/cdJezu0rZb+WaOyctlLqmPfxcnZdTAMOIAZwV6FcUumPDbRm//Qtq+5aI7s+0aC33eWvTg7lJyxK6BxwAIODkyLDzbQUXtgP6eekOuK+Z8B7krEhJ9/e8j9OVnL2z6FWjCM0ntC4Ul1xg10fk4ADiAHcVfI+WqZELqlYcErELXtlUkLJfOEABoNLxy/Ys3+/HOVqbVQv7If0o1qqpC/NWnLfO+AtidoQ9XdLX56oTcWNgtnrQ7OAK9h1MQk4gBjAXYN2as1+YoiM11B59s+Bln6X9J8gO5Yze4rj/ns4gMGAymKRjRzJ3uXqeb2ynyMrdoXKeaWz3zvgLYna0Jnddt6/pb+fkHAlGz+pvdogYwFpfKm/0cKujynAAcQA7hoHFm1RdudvNEpCeQGzX/8o7mUQOIDmc6X0cnj2z+2yVF7ZD+lJ+pLeV8uusN9D4B2J2BD1cytemyLt49Q2dfL+dcfWiYulzgcXbWXXxRTgAGIAdwVKJuosPV05rc+gQ4HQi18YK/U+v/90XH8LB9B8tk9ZKm2DXm7cPreX9nMg034Zo5AM7nsIvCMRG6INH2Qbi383TvZ/3NcQK87L2IJfvSPT13DrYwJwADGAu4KTTiBn6Ax2XeLlxIYDtu7D0uL6OziAZkMhDU46o7rrTa6f30v7oRAM0puWzBpqsGRmKonYEPXR1N+d3HiQXf94WTPk06TTd4E24ABiAE8aWlKgjRSyxm5B8jV2/YaWzJxSWtXnq2P+OziAZlOYtV3aBCWj9eL8XtuPs2TmRtUSoCbx2hBVZXLSGSVbCpMDquEuN+79YZLSO5d1AQ4gBvCkqQhV1qCcUjoEFHdGwdwN8hp2z1gd89/AATQXqhCz8Dej7coaJd5U1vDafpy6xZnPjUmq4g1Ql3htiHKzkk3sFf0dt+6JQBv3aOmaruHCYfUql+gGHEAM4Enj1EctytnLrkuiUMUSqjs592fDYi7zBQfQXE7vKApVSPjEs8/ww36owoNM9bHzOPs9Be4Tjw011d215j41TPZzN6vUq9AUK0U5BXbFG9S9Tho4gBjAk4KWTKkxZvx8hGsVErjY8O5ceS3H1+2L6Xg4gOayatC0UJLwY559hh/24yT7XT14Ovs9Be4Tjw3RCzrZwsbRGex6JwONMzTeyJCdciSGTgY4gBjAk2LHJ9laLylEUn6gzM6N9fLEmOJL4ACayeVTVdIOFv76XU93G/phP6T/AnEdcnd+6WX2ewvcJVYbov6Mcv6RHZQfLGPXO1mckB0qE8eti87AAcQAnjC0pDDnyaFW+mODrNorDez6JAvFLzq1MSuPlnd7PBxAM6E8ljLf2OJtnn6OX/ZDedPoeiilDfe9Be4Sqw1dOHJe+zjtSG5dqZfjDo0/sYbsgPuBA4gBPGGc1C+6LylEciR7t7ym3HELuz0WDqB51Fc3hVO/0NdefpZf9tP+mprZ7zFwj1htaPPYBbJfO7pyN7vObkHjjkwJs7mQXRddgQOIATxhVodyMp3JP8mui1s03mq1C48/PkgWIe/qWDiA5uGkfvGjmo2f9uPMahYu2c5+j4F7xGJDtDpDs2XUr1H/xq2zWzjl7Cg3ILcuugIHEAN4QtRU3pSNb94zI43Lyp738XK7+kNm19Uf4ACaBcVJOSEAl05Uev55ftoPXQ9d15KXxiN/mkHEYkP7F+TaVWE+XsGur5vQuOPkb62pvMWuj47AAcQAnhBOp7I7bQ27Lm5DpeycTQBd5U+DA2gWjpOU9eIHvjhJftpPpHNbVXyR/V4Dd+jOhuQmoF+9Y2xdaMrbKl/WF+ay66IjcAAxgMcNBRFn9nvP6J2FlP+Nru/c3lNRj4EDaBa0o1Bu/sjydvOHg9/2Q5ta6PooGTD3vQbu0J0NUWUmeuarBnqXz5ITpz7won7vG7G5xW/gAGIAj5sLh88ZX46HcgHKzSAfZEY9Bg6gOdBMiZNbzK8kuX7bj0x2TmEbv3jbuLCNoNKdDW0eu1A+8xPr97Pr6gWRZUgrj55n10c3tHAAU1NTx/fu3fsFwXTx9fejHdenT5+/F/99s0ePHt9JSUlJjeXcGMDjxwkopx2z3Lp4RePN23LX5OwnhlhNtXc6PQYOoDmU7T5hB5S/NcO3z+SwnzUGbtwKMl3ZUGNtq+y/qB8zafNHR45k77LTHE1GmqN4Ud4BFA5fX+HYZdPX4v/vCScwL9qx4ncV4ph7gp09e/Z8MJbzYwCPD8q55OT+8zpNBjeb3ptnpxnY1HmaATiA5hBOKRHlWXsBh/2c3HRQXifZNvc9B8nTlQ2d3Og86/nsenpJ3fUmOyfgU0O1r0blN8o7gMKZmyScwMHO98LJa+zi2NfjPT8G8PignEvUqVDZNG5dvMZJM5AztPNZITiAZlB/o0Wm/aE0GZTc3K/P5bAfms2m66RZoYaaFvZ7D5KjKxsK0mzvhnfm2C9wuYfYddEJ5R1A4fBlCl6J+L6Blng7O1Y4gOkpKSnPiv8nPvTQQz+M5fzUeO7ds28E6J41b4U6ld0n2HXxmtaWtriw2it19/2e7Ab2oz/H1uyRz3jrxMW+fi6X/WyZsEheb1FOAfu9B8kRzYZuVbXFe1I/xq2n15yJCOHg1kUnyG7c8tU8EeHMZaWmpvaP+L6lZ8+e345y+AP0z4MPPvi3wlEsjeX8FiRm+aLpjmxk858daf3lf/0ntzq+yP5ZOfKaT60r4FYF4pGsGTjV3vxx+hK3Kr7IzdKL9sz24GncqkA8kpK19kvN/tlruVXxRWg8mv/MSHnNXzbf5VZHK3HBTfNOQkvAAyO+b+7suJSUlH7idxmhb78hHMA/x3J+ugGYwYmNA5mh3H8zVrPr4heXiirkNS99eaJ19+6f2v0OM4D6U33+ejjn453WL339bC77oetcIK6Xrru6vJr9GYDE6cyGqJ9a8vsJoYTmF9h19AsnJ+DBRVvYddEFHWYAf0yzgPR1r169hF/XO5++Fk5hSuRxwgF8Uvz+R/T1ww8//ANxXGEs56fGQzeCey1edSjHEuVaMjn3X9Trfj503afbJ1Ilu4H96M3euRvksy2Yvd73z+a0nz2z18nr3jdvI/szAInTmQ05ufEWvzDW2DRdnXH5VFXbdSMnYEyQ3bjts7kuwtlLE07gy6EYP0rv8oBw8GrEz7/b4bjBNFsofjcNu4DdhXIsOTNhQepUiH3zN8trz09f2+7ncAD1pvX2V9bC50bLZ3vt7DXfP5/Tfq6duSqvO/O5MRgsNaYzG8qfaYetULUmbv38hMYlGp/snIDl7ProgBYOoJeCATw2KMeSzP23Yhe7Ln5TXXFDXjuVVGq93VYaDg6g3lQcOiuf64rXprB8Prf9LH91srx+SuzO/SxAYnS0Ieqf5v9ylHyuNypq2PXzm8PLd9o5AacgJ2AswAHEAN4tlFuJcixRrqW6a43s+nCQ/cbHsmMpP1gW/hn3AA6Sw0lofnRVPsvnc9sPJXJHAl296WhD5/efls905YCp7LpxQONT+mMDkRMwRuAAYgDvFsqtJHP/vTOHXRcujq1uSxXi/Ix7AAeJo0JCc277sRPoYrDUmY42FJnih1s3LtaHcgKWbDnMrovqwAHEAN4tlFuJGlTZrhPsunBRX91sZ5t/sm2w5B7AQeKU5B5mf6lRwX7Wj5ptD5Zbj7A/ExA/kTZELzWU5JuSmlNyc27duCjbeTyUwD+NXRfVgQOIAbxLai7eko0pAwXk294sQ4OlCgM4SIycYWnyWZ4WgwWXDirYT2lekbwPa0fMZH8mIH4ibSj8UhOAKk1d0dL0uRyvZG7Pqlp2fVQGDiAG8C45kLlFNqRd01ex68JN22CZLr9XYQAH8XPrcp0189GBVsbTI6yWxntseqhgP3T9c58eLu9H7ZUG9mcD4iPShtYOn2m/1OwoYteLm53TV4ZyAm5l10Vl4ABiAI8KpYegnErUkC6XXGLXhxs5WP5smIybqr3WqMQADuLn0NI8adM7pq5g1UMV+8n7eIW8H4eW7WB/NiA+HBuqu9YgnXhy5jlfalThcvGlQOZCjBc4gAp0wKpCuZSCmvsvGpReQKbDyd6lzAAOYofseEn/UJWE4xdYdVHFfi5GVLtBO9cLx4aOrLDTn+R9tIxdJxWQOQFD1VDIvrn1URU4gAp0wKriODuUW4lbF1WgnGl0T5b/cbIyAziIHZrJVmVmQBX7iZzpD1KVHxNwbGj5qx/aOR2PnGfXSRWcnIBwiqMDB1CBDlhF5HLnU/ZyZ1Bz/3VGZPWI6+euKTGAg9hx6oUeWLSFXRdVHEDiwMJQne+0Ney6gNgh27lzowFVXTqhNpQTkMYxLIt3DhxARTpg1Tiz+6S94WE4dgd2pCBUP5bqyMJ+9IF2sc97ZqR8drS7nVsflRzAmsqb8r7Mf3Zk4Hf76wTZzpHFW8L9Ebc+quHs9j+zp5hdFxWBA6hIB6waW8bbCUVPrN/ProtqUN1Yujc0E/j1X/8K+9EEGgToua0ePJ1dF0IlB5BYNWiavD9nC0rYdQGxQTN+i347JrQicZ1dH9U4vm7ffQn8QRtwABXqgFWBpsvt0m8DZQJkbn1UxKmjWnvuCuxHE3I/yLRfajYcYNeFUM0BdAbL3PGZ7LqA2LhwmLeeterYCfyxDBwNOIAKdcCqgOXf7jmyYpe8RwUzVsF+NEC+1IRKvzXUqFElQTUHkKpHyGo34uUPg6UeUB1nWc965W52XVSFKoJgGbhz4AAq1AGrApZ/u4cCjO1kwsOt200YLFWnbPeJdkm8VUA1B5BwkgmfyT/JrgvomsiNevXXsVEvGlgGjg4cQMU6YG6w/Bs7GCz1IfxSo8jyL6GiA0gvfRgs9YBqs9Oz2jx6rlI2pBpYBo4OHEDFOmBuyJmRhbSHoZB2d5wUzgTdqy0TFrHrAqLT9lIzSC5zcuvjoKIDGB4sfzZM1lTl1gdEx4lpvZB/XCkbUhEsA3cOHEDFOmBuyJnB8m9sNNywB0vETKmN81KjWkyrig4g4QyWZ/dgN7CqRMa0/vnLf1HOhlQDy8CdAwdQwQ6YCyz/xgfZzaZ3ZuPNUnGo01fxpUZVBzA8WE7KYtcFdE54o96ImUrakGrUVzdhZrsT4ACi8YTB8m98kN2U7zyKN0uFoc6eOn0VX2pUdQDrrjfJDU5zaYMTkkIriRPTSmEoKtqQimBm+37gAKLxhMHyb3yQ3fzr51/hzVJhqLOXLzVD1XupUdUBJNa8NUPet3N7T7HrAtoTuVJDKY1UtSHVwDLw/cABROORtEspoNhMiao4A3jO0BmooKAotIxJz6Zo7V52XTqisgNYlFMg79u2D5ew6wLa41S0oZUalW1INbAMfD9wANF4JFj+jR+n8z0unAvETKkHLV/SMiYtZ9KyJrc+HVF58K4L57kcgWVgxXBiWmlGS2UbUhEsA7cHDiAaj8RZ/qVOhVsXXXA6X3qzRMyUetDyJdk0LWdy69IZqg/eq4d8ai8D7ytl1wXYtI9pbVLehlQDy8DtgQOIxoPl3wSJ7HzXOIMlYqaUgZYv5fJvTgG7Lp2h+uB9bPUeef+2T1nKrguwoTATO6bVfqlR3YZUA8vA7YEDiMbTLqaEWxediOx8ETOlFjQTS8uXcvn3mpplslQfvGuvNkibzvg5loFVoWNMq+o2pCLhmG0sA8MBROPB8m+iRHa+tYiZUorz+0ulTdMyJrcu0dBh8F49aJq8j+UHyth1CTqdxbTqYEOqgWXgNuAABrzxYPk3cTp2vqsHT0fMlCLQsiU9C1rG5NYlGjoM3kdX5cv7mPfRMnZdgk44pjXipUYHG1INLAO3AQcw4I0Hy7+J07HzRcyUGsjl35+PkM+CljG59YmGDoN37RV7GXjeL962Wlu+ZNcnyHQW06qDDakIloFt4AAGvPFEphTg1kU3Ona+iJlSA1qulMu/g6ax69IVugzeqwZ+Yi8DF55h1yWoRMa01kbEtOpiQ6pR5KTuCvgyMBzAADceLP8mR2ed76pQzNT5/afZ9QsqtFxJz4CWL7l16QpdBu8j2bvtZeCPV7DrElTCMa2Dp7f7uS42pBoUQ4llYDiAgXYAsfybHJ11voiZ4oWWKWm5Ui7/XlF3+ZfQZfC+dbnOXgZ+ZiSWgZmIFtOqiw2pCJaB4QAG2gHE8m9ydNb53rpSj5gpRmiZku4/LVty69IdOg3eK9+cKu9rxaGz7LoEja5iWnWyIdXAMjAcwMA6gFj+TZ5one/KN0MxUweROsNvaJmS7j0tW3Lr0h06Dd5HVuyS93XHJ9nsugQNJ6Z1VScxrTrZkGrQMrCs4BTgZWA4gAFtPFj+TZ5onS9ipniQy7/PjJT3npYtufXpDp0G75tVtfK+zn92pNV6GzPbftJVTKtONqQiQV8GhgMY0MaD5d/kidb5ImaKB1qepPtOy5XcusSCboN39hsfy/t74fA5dl2CQmRMK4WXdPy9bjakGkFfBlbeAUxNTR3fu3fvFwTTxdffT/a4jhLExtO+oDiWfxOlq8535YBQzBRSZ/gGLU/K5d8Vu9h1iQXdBu/Dy3fK+7tz2kp2XYKCE9NKYSWd/V43G1KNoC8DK+0ACkeub58+fbLpa/H/94Rzl5fMcZ1JEBtPW0FxLP8mQ1edL2Km/IWWJWl5ku45LVdy6xMLug3eNRdv2cvAvxwl7vdX7PoEge5iWnWzIRVZ85a9DEyVVrh18RulHUDhzE0Szt1g53vh2DUmc1xnEsTGE84oHyooDhKjq84XMVP+QsuSdL+z3/iIXZdY0XHwXvHaFHmfK4+eZ9fFdGKJadXRhlSDKqvQPaZxkVsXv1HaARSOXKbglYjvG3r06PGdRI/rTKjx3Ltn34gg0NrSllGeaiJy66MzZDdd2Q85I3bM1Fl2XU1n5/SV8l7TMiW3LrHSnf2oyOFlefI+7/p0FbsupkP9hlz+HTA16jE62pBq1F1vlOMhjYs0PnLr4ydkN+54ax5Inz59slJTU/tHfN/Ss2fPbyd6XGdiBUxqTlXKTmXD2zO5VTFeSjfsk/f6wJy13KoYLX/9r79aC3/9rrzXXzbd4VbHaPmisVXe58znRsv7DvFO9s/Kkff69Mb93KoYL+uHp8l7TeNj0MQdb80DCS3tDoz4vjmZ4zoTugFBensGvjxvAAAgAElEQVRyUgoUrSlg10V3unv7vnmpLWbqTutX7PqaCi1H0n2m5UluXeJB19mbFX+cLO/3xaJydl1M5U5rW0zrraraqMfpakOqcWx1WwUnbl38RPUZwB/T7B593atXr95C8ulr4eylxHJcLEKNh24E91q8H1BMSYZTJuuq2mWydIDspjv7cWKmLhxBzJRX7Jq+St7jQ0vz2HWJh1jsR0UKl2yX93v3jNXsuphKrDGtutqQagS1ghPZjZs+m+sinL004dy9LEhPSUlJFT96QDh4NeLn3+3muJgkSI2HKlNEyygP4ieWzpecEhkzJZwUbn1NhHajLggt/9ZU3mTXJx50HbxvVNTI+03L7jSzza2PiVCqHSemtavjdLUhFQlXcApQ6i7lHUCvJUiNx0kpcHSl+mWydCCWzrem0l4GXvCrd5A6wwMqj5XL+7v8j5PZdYkXnQfv5a9+GFoGrmDXxTSon6CwEZnS6FLXKY10tiHVOJIdSt01NTgVnOAABqTxUCoSncpk6UCsnW9b6oxydp1Ng5Yh6d7SsiS3LvGi8+B9MGubvQyctoZdF9NwYlqzX+8+pZHONqQaN6vqApe6Cw5gQBpPOKWAJmWydCDWzhcxU95Ay4/O7l9aluTWJ150HryrK27Yy8DPjcYysMvEE9Oqsw2pSNDKHcIBDEjjcWJKdCmTpQOxdr43LiBmygto+VEu/776IbsuiaD74L3slUny/l86UcmuiynImNZfvROKab3V7fG625BqhMsdTg9GuUM4gAFoPPHElIDYiafzXf7qZMRMuQwtP9I9peVIbl0SQffB++CirfL+56fnsOtiCk5MK4WNxHK87jakGkGL2YYDGIDGE09MCYideDpfxEy5i1z+fW60vKe0HMmtTyLoPnhXn68OJYUeg5ltl4g3plV3G1KRIMVswwEMQOPZ9elqLfOkqU48nW84Zuo3iJlyA1p2pPtJy5DcuiSKCYP30pcnyudQdfIiuy660y6m9UJsMa0m2JBqBClmGw6g4Y2HOhVd86SpTryd77I/hGKmjl9g1113aNlRLv8u2squS6KYMHgfyNwin8OeWWvZddGdtpjW2FMamWBDqhGkPJdwAA1vPOFORcM8aaoTb+cbjpmaiZipZKBOmZYd5fLv+Wp2fRLFhMH7+rnr9jJwv/esO3f+xK6PziQS02qCDamIk+fS9Jd1OICGNx5yNmRMSZZ+edJUJ97OFzFT7kDLjXQfafmRW5dkMGHwJqdvSf8J8nlcLr7Ero+uJBrTaoINqcjBxdsCscEJDqDBjafdTImmgfIqk0jn68RMIXVG4uyZvU7eQ1p+5NYlGUwZvPcvyJXPo2DOenZddCUc0/qH+GJaTbEh1QjKyzocQIMbjwmB8iqTSOfrxEzlpyNmKhFoxmlRv/flPaTlR259ksGUwfva2WvyeSx6/n0sAydIojGtptiQigRhgxMcQIMbDwVm6x4orzKJdL7hmKnfjsFgmQC0zEj3j5Yddb9/pgzechn4pfH2MvCpKnZ9dCOZmFZTbEhFwhucZq9j18Ur4AAa2nioU6bAbDlTonGgvMok2vku/b0dM1VVfJH9GnSDlhnp3tGyI7cuyWLS4L1v/mb5XPbO3cCui24kE9Nqkg2pRnhmu5+5M9twAA1tPJdL7JkScja4dTGVRDtfJ2bK5DdLL5DLv8/by7/Xzlxl1ydZTBq8r5Zdkc9l8QtjjR0svcJZqUkkptUkG1INe4OT2TPbcAANbTwF4k3clJkSVUm08w3Cm6UXUCcsl39fGm/EfTNp8KbnkfXiOPl8rpReZtdHF9qt1CQQ02qSDamI6TPbcAANbDzUqdCbuCkzJaqSaOfb7s2yBKkzYmVv6KWGOmVuXdzAtMF737yN9vMR/3ProgtOTGuiKzWm2ZBqhGe2fzfOiJfOjsABNLDx0Bs4GW3Wix8YabSqkEzn67xZInVGbES+1FCnzK2PG5g2eLf1O2YOll5QMDu5mFbTbEg1ZL/zu9DM9mkz+p1I4AAa2Hja3sQ3setiMsl0vlfLriJmKg5MdC5MG7xNdNK9vl/hmNaz1xI6h2k2pCJ7M8wdT+EAGtZ47FicD4x9Y1GJZDrfds8JMVPdYuLyoomDt2nL9F4Sjmntn3hMq4k2pBomr6jBATSs8TidiqkxCyqRbOfrODWmBhi7hakbDEwcvE3bqOMlBS44yybakGpEzmyb1P8QcAANazxO7V/dy2TpQLKdL83QwlnvHlNTjJg4eJuWqsfL+9S2XJ74fTLRhlTESd1lWm1gOIAGNZ7W219a8385ShrqjQs17PqYTrKdr+kBxm5BsTcmzpSaOng7ybqxDBwdt5YVTbUh1aiuuCGf14JfvSPHWW593AIOoEGNp/xgmTTSlQOmsusSBNzofMMxUwbFtrkJlclyav+a5iSbOng7zo1pM7Zu0raxILl2b6oNqUj2Gx/JZ1ZeeIZdF7eAA2hQ49k6KUsa6LE1Bey6BAE3Ol8Td7e6SeWx8nCZLNPuj6mDNz0np9zhxaIKdn1Uo11Ma5IvNabakIocXZUvn9m2D5ew6+IWcAANaTzN9Z9Zc54caqU/Nsiqr25m1ycIuNH5mhxg7AZ5Hy+X9+bQsh3suriNyYP3oaV58rntmLqCXRfVCM+QuhD7a7INqUZ9dZMcX+c8NdRqbviMXR83gANoSOM5te2o7FTWvzOHXZeg4Fbn68S40QYe7mtSiZbGe9bcp4dbMx8daNVeaWDXx21MHrxvXa6Tzy3j6RFWS9Pn7PqoxO60NaHkz8nHSJpsQyqyfuRs+exKtx9l18UN4AAa0njChpl3jF2XoOBW5+sEGM9/dpTV2mJOgHGynN55XN6XtcNnsuviBaYP3jlD0+TzK9t1gl0XVaD2Pf/Zka5t1DPdhlQjPNEyaja7Lm4AB9CAxmNPTQ+05j41TM6acOsTFNzsfFe++YnsWM7tPcV+Xaqw4d258p6U5B5m18ULTB+8izcXyue3cXQGuy6qcLagRN6TVYOmuXI+021INWjpl5aA7VCrJnZ9kgUOoAGNx8TgVB1ws/M9vm6ffIabxy5gvy4VoDhWGW/z5FCrqf4uuz5eYPrg3VR315r907es9MfFYHmjhV0fFdj8/nzZzk9sOODK+Uy3IRUJb7ZcvYddl2SBA2hA4zFxe7oOuNn5Nt5qtWY/McSa9c+Drcabt9mvjRvqXMmmt05czK6LVwRh8N4yYZF8jkU5yEzQUHNbtm9q5421ra6cMwg2pBrlB+x0a9lvfMyuS7LAAdS88YQTVP76XaMSVOqA251v7riF9mC5di/7tXETfqk5WMaui1cEYfA+v/+0MYNlshTl7JX3Ind8pmvnDIINqUa7ggsVehdcgAOoeeNpK1Gzll2XoOF253tuXykSeQuqz1fL+7DQ8JeaIAze9PyoegI9z+ryG+z6cEJOMN0HcordOmcQbEhFwiVXF+ay65IMcAA1bjzIIceL250vBksbqo5A92DP7HXsunhJUAZvejm1q15sYteFC+elxu2VmqDYkGpcPlVlRLUbOIAaN55LJyrtKgm/n6C1EeqKF53vnln2YEmlorivjwMq/Zb52zHyHlwtu8quj5cEZfCmahf0PDP7vSefL7c+HDglHwtmr3f1vEGxIdWg8XZJ//HymdI4zK1PosAB1Ljx7Jy+Uhpg4ZLt7LoEES8632tnrtrLn8+NtlpvB2+wvHDkvLz+ZX+YxK6L1wRl8Jal4V6eKJ9r5dFydn38htrxwt+Mltd/7ew1V88dFBtSkYNZ2+Qz3TV9FbsuiQIHUNPGc7v5C2veL96WBnizqpZdnyDiVee7/I+T5XOtCOCu7u1TlslrP7JiF7suXhOkwfvw8p3yueZ9tIxdF7+h7Ax07Stem+L6uYNkQ6pRc/GWfK7znhkpx2NufRJBeQcwNTV1fO/evV8QTBdff7+rY/v06fP34r9v9ujR4zspKSmpsZxf18bjJBRdPeRTdl2Ciledr5PX0eQUKJ0hS7/9bJhMal57rZFdH68J0uBNpfyoNByV9gtasnpqx17ljQuSDanI6kHTtE7gr7QDKBy+vsKpy6avxf/fE05gXlfHi99XiOPuCXb27NnzwVg+Q9fG46QMObF+P7suQcWrzlcmQX58kEyiS8l0ua/TL6iMoSz9NiKdXRc/CNrgTSX96Pme3lHErotfeJ0MO2g2pBpOAv/cDzLZdUkEpR1A4chNEk7gYOd74eA1dnP86/F+ho6Np6n2juxUkDSYFy87XyqfRR1L8aZC9uv0C6qvSdd8ausRdl38IGiDd8mWw3Yd1XfmsOviFyc3HbTL4Y2Z58n5g2ZDqkHJvXV+WVfaARQOX6bglYjvG2h5N9rxwgFMT0lJeVb8P/Ghhx76YSyfQY3n3j37RuhCSa5dY3PTe/PYdQkyZDde2c+Z3SfkM17z1qfs1+kHdj3rQbLOZkvjZ+z6+IGX9qMiLVRH9clQHdUbTez6+MGaIZ/Kdnx2z0lPzh80G1KRjWMyQjXLD7HrEi9kN274ap6IcOSyUlNT+0d839KzZ89vd/EnD9A/Dz744N8KZ7E0ls+wNJRN79gzJVePneVWBeKR/OV//ac1/5mR8jl/2XyXWx3PpSzXninJn7aCWxWIh5L/yXL5nM9sKeRWxXP5sumOnfvvl6Os//rPv3CrA/FIrh6xN/nQuKyjJOmmJSfCqXuMnDXBqQ7k0UyecAAHRhzbHO08KSkp/cTvM0LffkP8/Z9j+Xy6ATq9PdVdtYOpM54eYd1u/pxdnyDj9dv3rk9XyY7l4KIt7NfqNbRDkq71wuGz7Lr4RRBnbyoidsRy6+I1BzK3yGvdPWO1Z58RRBtSjdtN9+TmJhqX6641sOsTD6rPAP6YZgHp6169egmfrne+8zvhGKZEHiscwCfFMT+irx9++OEfiGMLY/kMajx0I7jX4mMlnE7h4xXsugQdshsv7edy8SUjss13B+VGk7kPfxOs3Ide24+KyJx4v35XPu/r566z6+MVlPDaqdJEVSO8+pwg2pCKUHojHdNXkd246bO5LsLRSxNO4Muh+D4ntcsDwsGrEb/7bodjB9OMofjdNBN3AZMTsPzVDwObUFU1vO587WzzE+TzvlhUwX69XlHgVEmY426VBNUJ6uBNJf5ktRvx3Ll18YrKY+V2laaXJ3r68hZUG1INJ4E9jc/cusSD8g6g16JT43FmhIJcUkkl/Oh8Dy3NM3rGV84IPedNlQTVCerg7VS7yXxujLH9WN7HdqzjoWU7PP2coNqQakSWsLxccoldn1iBA6hR49k+Zald+i0Lpd9UwI/O1/QEuhTzJ9+c/ziZXRe/CfLg7axkXDh8jl0Xt2mX0Pxqg6efFWQbUo2Di+3ScFTNiFuXWIEDqEnjoXxDTu6/uutN7PoA/zrftSPsBLqUKJn7mt3GqZJwJHs3uy5+E+TBm2KlTK12U7r9qLy2dW/P8vyzgmxDqlF3rTGcE1CX/LxwADVpPEey7Q4zd3wmuy7Axq/OlxIjywFlpPcDip/Qiwy90Mx+YognVRJUJ8iDN1W7oWdPUA5Ibn3chBw/+cImHEGvPyvINqQiToUuXV5o4QBq0HgoviDrxXH25o9j2PyhCn51vs0Nn1lz///2rjRIquoKxyRlqqwkf4J/Rn/oMJDtR35FBZegxqjRVLmihhKGRVRA0aCioDiADIsyIJviwDDDvgjIAMOmLMOwzIDsAsKwb2rcysSqmIrVud99fZtmHGa6p7vfObf7+6q+onum6Xfem++ed969555za3RJaX9ml5TCZGzJ5OW3xG2RYK7fvBcMnBSUOZq4QNyWdBHjE+MUS8BhpGzkuoa0cffaYDPIxAde8CK/lQGgB4NnR7R2VqZ3lJHJMUznu6joHauBqjFzxM87Hfzk7Fe27Eumy2RoZq7fvN2mNmwCgh6k7UkHq0pm23NaNLg0lOPluoa0Effntx4KKjeg5qW0Pc2RAaAHgwd9JCGo9eXLxW0hzzNM5+tq5ZXc0ScrNoNsXbzBns+UroPFbZEib97fRKYUFlkd1Bo9SNuSKjEuS6Lde8KqcUgN6eO6actirVqlbWmODACVD56j+0/YJQX0SPWx2XQ2M2znW/FksBkEDealzz1VlvUYas9l84LM50lpJW/e5/Nb0TNX2pZUWT1zpT2Xil4jQjsmNaSPp499Gu15rT9lhwGg8sGzYuwc61QWD5kibgt5IcN2vtuXb7ZaePuRAV6nAhyo3R/0SL3r6ci5M1+K2yNF3ry/sX//MX99KqgDWXdA3J6W0i79PfySPY/tVVtCOy41pJNIAYAWVoydK25LU2QAqHjwwDniJum7c8xWhu18bXup+5+P9cyVPv+W0hXJXfmmbueYafLmHdA95CLPVdqWlnLnmm0iyf/UkE7GHnLv7qs6v5UBoOLBs3XReiuisu5DxG0hf0gJ5+vyS2Y9M1r8/FtC1MdCnSzUyzp28JS4PZLkzTtgsHPWr/ppDTnz6ddF8rSpIb2c2m2w1cRWxfmtDACVDh4sKZR2HpS1BYCzgRLO9/SJz2xXEHQHqd99RPwaJMv3Jy9mPcsoefM+z/P1094TtyVZHt5Vb20ffVuvyJkT/wz12NSQXiK/Gboo7TJIbcoOA0Clg8eVfplw33ORT87pnULOZUo538oRFVYbS4qniV+DZIi+v+Pv7Wdt37N+p7g90uTN+zxR3/S8v9NfPy2eS4aVWduXjpoe+rGpIb3E0q/zd1pLwjAAVDp4pvUcZoVTPWOFuC1k45RyvvV7jgb9gW99wu44k74OiRIz2a7vr9Yn4jDJm/d5Qg+TO70cLJktWi9uT6I8dewTW6EBOz6P7DsW+vGpId3cML3Karr88WHitjRGBoAKB8/eDbuCAql3942cPf2FuD1k45R0vqgxBY2sneJHyyHM6rgCqbXvVYvbo4G8eV9IVxvSFrz3oIsC6Fp0zuk3RuT41JBu4v7tNnLurd4tbk9DMgBUOHhcQrGP+TC5REnnu3vtjlgXBR8eEny8uWeavHlfSN8eElD4GQ/pkikN1JB+urznmX3fELelIRkAKhs8bvv46Nt7h55QTCZHSeeLJTMUz7WzgFMrxa9Fk7aagM/VSPNpeS/T5M37h3RpAm//fYD6BwXMvrvlPamUBmpIP7Fxb/RfelmtHKjVVc6NAaCywYPdkbZG2vh54raQTVPa+brEeRTSPXNS78NC7ZJqa+ekji96l+CfSUrrRyOhj0kd+1u91FVuFLfnYsTD+Zg7nxLf0EQN+UHUPIVW5vUfL25LPBkAKho8h3fW2+R+JBX7Wg8rl6jB+aLtFBwLlhmkr0djxCzO5E4Dg3JG7+Zu27fGqEE/Gunaw2neLLTmrYXWxul9RoraQQ35wZP152KbhVA2SNoeRwaAigaP65AgUU6ATJ4anO++mj1WMyW391bZK7puaU0w+/dgf87+NaAG/Wgkyl5NfCDoeLNt2SZxexoSO++RogP7PqrZK2oLNeQPXfmuha/q6XjDAFDJ4MHsH7ojjPxTj5zvkOALtThfJBfDsawaP1/8msQTszfvPPqKtW3T/A/E7dFGLfrRyE1z3w+K6HbWV0QX6TlauvFQQ/7w2IGT9v4OapkFZACoZPC4nb9LR1aI20ImRi3Od//WYOMQOoRoSh3YvnxztD/q8yxm3gi16EcjoRcUhYZ+tldtEbfHEePLduJRktBPDflFNwuo4eEBZACoYPB8uGJrLJnfp8K+uU5NznfOc2OthqpKZovbAp4786Xd9AGbauauEbdHIzXpRyNrZq+OlQ6CnqTtAatKZgWtDJ9/U9wWkBryiygc7jYP7VhVK24PA0DhwRPcKINdbxtnrxIXBJk4NTnfj7d/HNtAdPzj0+L2uCR5LAEz969xatKPRkI3LoVAwyYnjCuML4yzjz88JG4PSA35x+qZK4MHm4detO3iJG3J6QCw+JrOv/rvf74THTyulhRvlP5Rm/NdMHBSMDvRf5yoHUf2HY+MurmnvVFKJ8lrpjb9aKTd5IQHm1sejxz96LioLZj1w/jCOJO+Lo7UkH+Mf7CRruF67vTnEcRB0rFY6Hiq4M6fDW/f9eupha9Gzp2R6aRw4tCZyOjbeonXkiJbRm3OF3oqie5ORP6dlB2zng3a1C0eMkX8mmimNv1o5aLBpVZPs/8h024N3LZ0U2y3PcaZ9DVxpIb8JO73tuGDuf+fOHxWxAZ0kEL/7eLrC78q+v2Dl0rHZGHjkuL2hXX4Iyx7fYbIH8A5tnkv6ioOSSZGjc7X7Z5EiziJfFK38QN5LqeOfiJ+PTRTo340EjXUxtzZR2xDCMbRm397RuVudmrIX7qmD1IPyig3h+ObOKhWOhgTQfG1nX436ubH7BJD2DNwduemOS6Wyo7uPyEuRjJ5anS+KJkxvfdIEceC3qjj7+0X3ChNICp9LbRTo360smZOsCEEO4OhszCPvTj6oI5xpa0kDTXkL5HSgPs/ikOjBWyYx7ZdpBB/dHgsMvS6R38rHYuJYevsFTHHElbvXRzHNT3XVruNTJxane+RvcdszlTYqQVVY+bYY5Y99pq6G6VGatWPRqKjTFn3IVZfK8bODe24u9cG7Rax+ePIvmPi16EhqSG/6WpKYqd7WO080ZvYlVhaO3VJ7m4CAb7/3/eRaeaGZWdMhmZ+xgQ3xvkvTbDHm9K1SE15AzJ5ana+bnMROnAg1yPTx0OyPgqcjrixe+TgtoPi5+8DNetHIw/WHbD6gs7C2FyEmcaJD7ygIln/YqSG/Cbu/6VdXrUamz9gYigPzm5GG3HPZ59+ndsBIAbPkb1Hg+39qM2zui6jF3/D9KpYMrH0rjYyNWp2vthpNqWwKJTWgqhwP/buvvZYK8fNEz93X6hZP1qJ2T+b42r0lumOSSjK7x7UtVZooIb8J6omuNaCKBGTyWPtWFkbNA249Qm7UpTTZWAAN3iqZ6yIJc8j6TgTF3//lo/s0yuOg+LP0sIjU6N254uZOOR4WMdi9J2JY2CWpLTLoKC6/bMldqlO+rx9oXb9aCT0hS4Ktk1cl1czlg/oHtQxfjTPaFND2UFsboLeEB8gTsjEMRDXuM1MLtBkABgdPJh6ndFnVNSxDEr7DkrsiHQJ8siVkhYcmTp9cL61S6ptsi8Sjbct25TW78aYwQ52aPrtRwbY3BLp8/WJPuhHI6Ez5EzZZbOXJqR92axuaY0dLxg3dUs2ip9vU6SGsofo4uT2I6S7ggI6kLjagzOeGhUbMwwA4wYPIuTJnQZGp/0Hp+2GhnV+1+u3/IlitcsJZHL0xfmuL18WzGbc3DOyt3p32r7XdfsouaOPXU6QPk/f6It+NLJ+z9FYzcs1by9K2/difNgi5uZ715cvFz/P5kgNZQ/R/7r88WKrvZl930jb/oDTxz+zaQz4XsQ38SucDAAbDB4U+XRPl2U9hqa8MweRfPnjw2J5KycOybfpItNDn5zv8jdmxnJPD+08nPL3xWYWb+pud0pKn5+P9Ek/Grnrgw+t/qBD6DHV7zu043AsqETPX+nzS4TUUHYR7QbfjOZTIxhMdSYQFUfc7nnENQ2LTjMAbGTwHD94yu6edDN2Lc0zwVOq6/M74f7n03LjJfXQJ+eL3CnsMoMWx9/TL3J4Z32Lvwv5UXaJzHwXXkufm6/0ST9a6XL1oMdUtIjxgHHhWr35UsaIGso+Ik5wZVomdXzRxhEt+R7ELW7yCfFMYz3ivQgA27Zt2zM/P/+G5j5XUFDQv02bNvcZDjWvr0zkuy82eLCz0f0RMBOYbA0oLCW46vVTTQR+sl6m3QuZOfrmfLGkUNFrRLAL7M9PROoqk8tvgkOpHFFu/z9mXdZNWyZ+Tj7TN/1o5bqypVaP0GXliIqkyx4hzw/jwRV79qk0FzWUncRM3dRug2NdlfZt3JPU/0dKjpv5w+QT4pnGPqc9ALzUBHK9TQC4zQR1NzX1QfO5duZzpXht/r3CfH5hIgdoavBgezYunts2jSfM5pwDbpLvT14c232Jdi9h1GEjw6ePzhdadC0I3WxHIuWIsMzrZsWRI5Vs8Ehmh360EkGcy92DThNJS4B/h/7dWEB9NJ+CP5Aayl4ilpj7wriYz0Vc0dxqJPS7vmK5jVdc8NeUf9ceAFqYYG5acwGgCfoGmCCwR9z/OZXIdzc3eLARZFHROzEngfX5VRMX2IgcN1MsFeCi792wy9aoGnvX07HPIo+EZTGylz47X7TWcrUv8bDy7itv2Yb3SBCGZpGQjJyojbNWxQqV2s1RhUWqy2L4RJ/1o5HQpat96crEbJy9yuoYeoauoW/oHHp3D+m4WdbMXSNuPzVENiQ0u3z0rJimUW8VcQbiDcQdiD8QFGLFcdWEBbH8QRAP+s1tZM2aAND8fpzhI3HvT15++eU/b+67MXg+/zy4EE1x5+q6SFmPIbGL6/JOXC5UPCt6DTcB4u5mv5P0m9BNovrRyBOHT0feGzrFdle4QMPRzR3xP0N9zHXTllqHJG13ttB3/Wgk9LmurNLq9QJfHd0scqH/7h5577WpdhxI200NkU0R8UTFk8N/EGs0FoMgZW3nmrqE9ZOOGC2jSHAGcGJBQUHHuPdn8/LyLku3LcXXPXrt8PaFYw03Db++8N/F7bt+a/hFcfvC2uL2XYa+1q7zNek+JkFkEkXXdrpyeLuufYqvL1w9vH3XU4GmC78z73cbzipuV3hP0Y86/FTaToJIFNCr8cX3Wv1Cx9Cz0bXVt9H5sHZdekP30nYSRDJA/IE4I4g3EHcYX319138ZTdcgLvEu/jCB2o0muNtiuDmOW+Jz+JJYAu4W9/5MJu0miCzHJdIGEEQaQT0ThI9oLAA0wV7r+Pcm4LsGs4B4nZ+fbz7epjJMGwmCIAiCIIg0wQR6T5pgbp9huXndIfrjS8z7evP+lw0+W2yCwIcNR7Ru3bogfGsJgiAIgiAIgiAIgiAIgiAIgoEczbYAAAI+SURBVCAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiCIJNG2bdue+fn5N8T/rKCgoH+bNm3uMxxqXrNaPNEsjI7+YP75CdoPsgQRkQjoZ4hUQJ9DtBQN455c9EWXmhPtbS7Etvgi0+Zn7czPSvHa/HtFfEcSgrgYjE52Gr18brg4Ly+vlbQ9hG7QzxCpgj6HaAF+EPfktC9q2GUk2lKuR9zvT8lYRvgEo5vO0jYQ/oB+hkgV9DlESxEf9+S0L2oYAJrX4wwfiXt/ElPsMtYRviDafeZO8+9LV1111W+k7SF0g36GSBX0OURLER/35LQvamQGcKKJhjvGvT+bl5d3mYx1hEewzeZbtWr1C6OnLdLGELpBP0OkAfQ5RIvQYAYwO32ROZEbMTAMN8dxS/wa90WWgLvFvT8Ttt2EPlxES+BC8xR+j/l9SfSjPzY/+1bUWEI96GeIVBD1OaOjb+lziKTQyBJwbvqiRgLAaxAR43V+fr75VZtKOesIH2Cc8S1GK3/E66uvvvrXRjOrpW0idIN+hkgF9DlEKmgQAOamLzJR75PmZPcZlpvXHeJ+XmwuyMPRHAturyeaBZJo8RRltDSEO/KIREA/Q6QC+hyiJWgs7qEvIgiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCyAD+D+O46hXlUgzoAAAAAElFTkSuQmCC\">"
],
"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": 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 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": 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": [
"# 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": 69,
"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+AAAgAElEQVR4nOy9B5QWR5YmOjs9b/bNebvvzM70nHnb0mxLCOqdPbO7Z/bN9M6003S3RLfUapluuW5ZJCQQCHkhaEk44W0BRWGLwkOBcIX3tjCFK0xRQFVRBgorvz2mp43q5ReZkZUk+f9/Zoa58f+Z95zvQGEy42ZE3IyMuPf7/uAPUksttdRSSy211FJLLbXUUksttdRSSy211FJLLbXUUksttdRSSy211FJLLbXUUksttdRSSy211FJLLbXUUksttdRSSy211FJLLbXUUksttdRSSy211FJLLbXUUksttdRSSy211FJLLbXUUksttdRSSy211FJLLbXUUksttdRSSy211FJLLbXUUksttdRSSy211FJLLbXUUksttdRSSy211FJTb507d/6/i4qKTnbq1Om/BPzdX3fp0uWAhTrr3yy79dZb/4SijamlllpqqiyNgamlllrizApu/4DAZwW3XwcFP+vPa6w//w5+b/27Ida/H66/lamlllpqaiyNgamllloizQpus++4445vW4GtyR/8rEB3q/X35/nP1r/7K+/PqaWWWmr5bmkMTC211BJtVvBr9gc/K9D9vYU9nj/6Cr6SNTcttdRSS025pTEwtdRSS6QFBT/ra/dbVrDb7fkjBL9/1tw0rTbsG8/91Yhvdus/4pvP9ezxt3/7f1C3Jw/t3w371rMPj/h2t+KR33iiE3Vj8tGGfuvZO0Z867n3R/zDc88O/oPv/RF1e5JiaQxUY4P/+tH/MPJb3Xojrg7+5qN/Rt2efLRhf9/tH0Z8q9tkK7beSd2WfLSR//2J/zT828++AQz+m25/St0e4yxD8MNxRyP/2TkOqQ9zvS+//LI93+xXH3/ePuWnb7aP/PZzDKsHTmv/8ve/p25WXtm2yUvc5zf2Bz3br5xtoW5SXtknrVfaJ/3kNfcZbh6/gLpJsUx2fNJhaQyUb7//3e/bF/UZ7Y7nWU+93/4vn/+Kull5ZXXbqttHffd59xme3FBF3aS8st/8+t/a577wgfv85vUY1v6bf/218vvKjk9KLSj4waxgd9z6u+/i91bwG2j9XBzmengAH3/8v9s/+ih/sPitYjZASn76Vvu4u19iv69evTvydeB3PvovirPVde0jv/N8+5jv92hf3n8ye36z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nj8hUBM2ER8bng92AH9U8L4O2C0Mdf33ovPBjmVPvwD04sWLFy9evORKxALpD8Odt75YDArcKV57FIumwvchxIvXwwVgXcHrP8MuoHquFoDitZuwyCo8xsUXX/zXzcLwcLGEId2T4u/Lpf5fuAAUj/uIx+8hpNy8efP/Jf72UueABSB2IAs+h13OKULHfxCPf1F4zC9+8Yufx06gXwB68eLFixcvXnIjYqHUBeFT9VwslMaL13qHIeCPxMLob/C6+PtP4n+/wvO4C0Dk6YnHH4v/XY/XEdbFAkw8v6L4PLBIQ14eFmTYXcTuYYn3RAtALCzFd9yBx+H37BDPJ4b/Qwh4lnj46fPOO++PcVzxv7vF889iB1I8flB9Lnx+h68C9uLFixcvXrzkRpCnF4Z2d4eFGjORq4f/oQgEhRtYXCFsqnbVYiwAF2ABiMdiIXm1+N9aFFyEBRltis9BvP9/YLEp3nsZnovF37fE+85ceOGFXyx6X2EO4A/C/MLNYbHHCHxP+L7leB7qg3zEbuoY4vGXxetLoZPAPiyA8brfAfTixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHixYsXL168ePHiJVPy/wHSIpNjN0eUywAAAABJRU5ErkJggg==\">"
],
"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": 44,
"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": 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": [
"# 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": [
"## Animations"
]
},
{
"cell_type": "code",
"execution_count": 109,
"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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+GATxCfYVBZSzLDXzQx0J03NNB/fb/7XbebjSvPxHU1u18lUB/O1/hwFnJuGwQcbfLDBRkfhg00Qn2zMZ7EKDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9b6kLDePfMPhggw822OgofLAJ4iM9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AFhcXFzU+HMzAD5QWFj4fftxu3btvmNuvymT+7INY3Gk35/XWNYFH2zwwQYbHYUPNkF8Mp/KQooZ9LqZYe6kqZnm4/vr//dt5vNK8/kdTW7byVQH87X+HAWcm4bBBxt8sMFGR+GDTRCfoPNZ7ELD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9b6kLD+DcMPtjggw02OgofbIL4SM9bLaa4uLibqU4lJSXz2rVr9/ct3LaPud0TpgaYj7+dyf3RMP4Ngw82+GCDjY7CB5sgPplNZSGlqKjoUVP/WP9xezPYrW7utmbg+2FpaWm5/dj8+S1z24pM7pOG8W8YfLDBBxtsdBQ+2ATxyWwyCylmiOtlBrtx9mPz5z+Yz482d1sz9PW1rxQ2+rvVmdwnDePfMPhggw822OgofLAJ4pPJjBRmvlZYWPi39oP6t4GHNndD87Wxpp5p9PnVtm3b3t7aO7QNc+tWAof6clkXfLDBBxtsdBQ+2ATxyWwsCzlt2rT5phnolt15551/09xtSktLy8yQ+FSjz2sLCgq+Ec4jJIQQQgghaccMavea4W6vqT2Nam+jffhuMx9/cNddd/1dC/+OfQu4Q6PPr+X0gRNCCCGEkNzEDHIvtGvX7k77sT3CN/n/zbBX1OR2P7CvAtqPCwsLzU1LVoX7SAkhhBBCSODYI3/NUPdvZpi7WV8z6r9kXxWsNEPgHY1vbz4faG7/tKnB5u8WCzxkQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCMmXFBcXdzPVqaSkZF67du3+voXb9rHXJDY1wHz87bAeo2RKS0s7FxYW3pPG7b5n/vha27Ztb8+XS/Gla5OPfdOaNedD76TrkY+9YpPuuvOhV1IlnZ81+do76djka9+kO9/kZe+YRnjU1D/Wf9zeLH51c7c1KD80TVRuPzZ/fsvctiKsxymUr5s19zBrPWjWel9LNza3OWJue8vU8oKCgjZhPEDBpG2Th33T6jXHvXfS9cjHXrFpzbrj3ispktbPmjztnbR/Dudh36Q93+Rp77im6GUWP85+bP78B/P50eZua2D62km60d+tDuMxSsesc0Y6A6DxeS6Mx6Mp6djkY9+0ds1x7510PfKxV2xas+6490pzaelnTb72jk2aP4fzrm/SnW/yuXe+VlhY+Lf2g/qXSYc2d0PztbGmnmn0+VX7cnIYD1IyrRgAB9vfOMyfb919993fDeOxSScdm3zsm9auOe69k65HPvaKTWvWHfdeaS4t/azJ196xSXMAzMe+SWu+yefecWnTps03zaKX3XnnnX/T3G1M45QZxKcafV5bUFDwjXAeoVzSHQBNbrP/qbfcm+OHpSJp/uDJu77JYM2x7p10PfKxV2xaue5Y90pzSeMVwLzsHZs0t1F52Tc2Lc03se4ds5h77Tfc1J5GtbfR+9y3mY8/uOuuu/6uhX/HvkzaodHn13L6wENIGjZpPbns/gXm3xpR/+lXze3/mNMHHkKyZRPHvrFpxsdWhf0tO901x7F3mibdHohrr7SUdNedD73SXNJ8CzjvesemJZt87puvpDHf5HPv2MW+0K5duzvtx/YomOT/NyBFTW73Azsp248LCwvNTUtWhftIZZLqydXUxjzBHjAm37cfG8vvmNtvCvMxSiUdm3zsG78152PvNOdBrySSrk8+9Epzafqzht75a1qyyee+STXf0Dv1qf/N4N/Mgm/W14z6L9mpudJA3dH49ubzgeb2T9fvTxD7Q8ntIeTG4aSpmebj++v/d3M2nexvEeZr/fPhKKtW2uRV39g0s+a87Z0UHvRKo7TCJ/a90jQpftbQO/VphU3e9U2K+Wb6V+gdQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhJBw8v8BckIJoE38nEUAAAAASUVORK5CYII=\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10))\n",
" figure.animate()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Hacking with matplotlib"
]
},
{
"cell_type": "code",
"execution_count": 73,
"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",
"ax.set_xlim((-20, 20))\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": 50,
"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-50-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/figure.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 304\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 305\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--> 306\u001b[1;33m \u001b[0mplot_\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplot_helpers\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot_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 307\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 308\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/helpers/plot.py\u001b[0m in \u001b[0;36mplot_function\u001b[1;34m(data, *args, **kwargs)\u001b[0m\n\u001b[0;32m 40\u001b[0m raise exc.InvalidParameterError(\n\u001b[0;32m 41\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---> 42\u001b[1;33m \"specifying plotting interval.\")\n\u001b[0m\u001b[0;32m 43\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[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": 51,
"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-51-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/figure.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 296\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 297\u001b[0m raise exc.InvalidParameterError(\n\u001b[1;32m--> 298\u001b[1;33m \"You should pass at least one argument to this function.\")\n\u001b[0m\u001b[0;32m 299\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 300\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": 52,
"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-52-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/figure.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 300\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[0;32m 301\u001b[0m \u001b[1;31m# kwargs\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 302\u001b[1;33m \u001b[0mkwargs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcustom_kwargs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcustom_kwargs_parser\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparse\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 303\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 304\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[1;32m/home/phyks/Code/replot/replot/helpers/custom_kwargs.py\u001b[0m in \u001b[0;36mparse\u001b[1;34m(kwargs)\u001b[0m\n\u001b[0;32m 26\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 27\u001b[0m raise exc.InvalidParameterError(\n\u001b[1;32m---> 28\u001b[1;33m \"Group name cannot be longer than one unicode character.\")\n\u001b[0m\u001b[0;32m 29\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[0mconstants\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDEFAULT_GROUP\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 30\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": 53,
"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-53-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": 54,
"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-54-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\"])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"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
}