replot/Examples.ipynb

40648 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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Or a (X, Y) point series, as we would do with matplotlib\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" y = [i**2 for i in x]\n",
" figure.plot(x, y)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nO3db4yd51kn4LRJs8h1BS0ejMZe23P+gWirCqREcUBVhSCi5V/lIjdWaSmWS6mqIhVU7KYqK3BlWUiN1NCEsN6qIBUhgUzBDR8gSRvtFwqs2i1CJSKpSOzaH8qYSN1NUfjQ2fuxz5ue2PPYPifn8e3Ne/2kt+c970yPzrnue9Jf5sxMb7pJREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREFsh4PH5vHO+O4yOj0WhnuRa3h+P+vjiOdtdERERE5CWQKHc/EiXv98v5ysrK1jj/k7i2dzKZnCjX4nZHXDuZ+yxFREREZGmJcvehKHkfnrn/1XI/SuChmWtncp6diIiIiCw9UfTeF8dvdfej/J2PwvepOA501+L8dPnuYM4zFBEREZGlZjgcfl8UvD8o54PB4PVRAP9vHP8jSuH+7nPi/rnV1dUt8z72t7/97Q0RERER2TzL7HRzpxS/KIE/E7e3Rdn7++lbwAe7j8f9s4s8bnlh6+vf3Pi3f+vnUV47AwYMODBgwIBDzWB5bW7ORNEbRvl7sJyXAhj3P1hu49oD02txOj61yGOXwZYX+I1v9PMor50BAwYcGDBgwKFmsMxON1fKW7tR+o7E8YvlT7901+P82GQyuTuO48PhcLTIYxus5WbAgAMDBgw41A2W1+huoBis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw4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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+AAAgAElEQVR4nO3db4yd51kn4LRJs8h1BS0ejMZe23P+gWirCqREcUBVhSCi5V/lIjdWaSmWS6mqIhVU7KYqK3BlWUiN1NCEsN6qIBUhgUzBDR8gSRvtFwqs2i1CJSKpSOzaH8qYSN1NUfjQ2fuxz5ue2PPYPifn8e3Ne/2kt+c970yPzrnue9Jf5sxMb7pJREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREFsh4PH5vHO+O4yOj0WhnuRa3h+P+vjiOdtdERERE5CWQKHc/EiXv98v5ysrK1jj/k7i2dzKZnCjX4nZHXDuZ+yxFREREZGmJcvehKHkfnrn/1XI/SuChmWtncp6diIiIiCw9UfTeF8dvdfej/J2PwvepOA501+L8dPnuYM4zFBEREZGlZjgcfl8UvD8o54PB4PVRAP9vHP8jSuH+7nPi/rnV1dUt8z72t7/97Q0RERER2TzL7HRzpxS/KIE/E7e3Rdn7++lbwAe7j8f9s4s8bnlh6+vf3Pi3f+vnUV47AwYMODBgwIBDzWB5bW7ORNEbRvl7sJyXAhj3P1hu49oD02txOj61yGOXwZYX+I1v9PMor50BAwYcGDBgwKFmsMxON1fKW7tR+o7E8YvlT7901+P82GQyuTuO48PhcLTIYxus5WbAgAMDBgw41A2W1+huoBis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw4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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plotting a discrete (X, Y) point series\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" y = [i**2 for i in x]\n",
" figure.plot(x, y, line=False)\n",
" \n",
"# or equivalently plotting a discrete (X, Y) point series, as we would do with matplotlib\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" y = [i**2 for i in x]\n",
" figure.plot(x, y, \"x\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plotting broken lines\n",
"with replot.Figure() as figure:\n",
" x = [1, 2, 3, 2, 1]\n",
" y = [1, 1, 2, 2, 1]\n",
" figure.plot(x=x, y=y)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nO3db4yd51kn4LRJs8h1BS0ejMZe23P+gWirCqREcUBVhSCi5V/lIjdWaSmWS6mqIhVU7KYqK3BlWUiN1NCEsN6qIBUhgUzBDR8gSRvtFwqs2i1CJSKpSOzaH8qYSN1NUfjQ2fuxz5ue2PPYPifn8e3Ne/2kt+c970yPzrnue9Jf5sxMb7pJREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREFsh4PH5vHO+O4yOj0WhnuRa3h+P+vjiOdtdERERE5CWQKHc/EiXv98v5ysrK1jj/k7i2dzKZnCjX4nZHXDuZ+yxFREREZGmJcvehKHkfnrn/1XI/SuChmWtncp6diIiIiCw9UfTeF8dvdfej/J2PwvepOA501+L8dPnuYM4zFBEREZGlZjgcfl8UvD8o54PB4PVRAP9vHP8jSuH+7nPi/rnV1dUt8z72t7/97Q0RERER2TzL7HRzpxS/KIE/E7e3Rdn7++lbwAe7j8f9s4s8bnlh6+vf3Pi3f+vnUV47AwYMODBgwIBDzWB5bW7ORNEbRvl7sJyXAhj3P1hu49oD02txOj61yGOXwZYX+I1v9PMor50BAwYcGDBgwKFmsMxON1fKW7tR+o7E8YvlT7901+P82GQyuTuO48PhcLTIYxus5WbAgAMDBgw41A2W1+huoBis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw41A2yu1qTGKzlZsCAAwMGDDjUDbK7WpMYrOVmwIADAwYMONQNsrtakxis5WbAgAMDBgw4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\">"
],
"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": 8,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 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": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# We can also do the same forcing replot to use some evaluation points\n",
"with replot.Figure() as figure:\n",
" x = np.linspace(-np.pi, np.pi, 200)\n",
" figure.plot(np.sin, x)"
]
},
{
"cell_type": "code",
"execution_count": 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": [
"# 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": 21,
"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": 12,
"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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9B3gcx5HoL9nnd/8L9nv3nnS+R9MyiSQ5K1nBtiRKVrSClaOVKEqWla3ELCYx50yJOeeMRIIESABEIEEQBEkEkiBIZFKUSPnOvvfuWdp/V880sAB3gd2Z7qnumarv+xHAcnenZqa6pqanuuqii0hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEiUy98lJyefSUpKGunkw+xzN7DP17NfvxXtPSkpKS8zKhknHGtpbetq9h172fZ2sZ8lPXr0uMLN93UlbDvrGefYdj+S+b3s++5i31vKyIH9SUhI+HVXx5CEhISEhISERJokJiY+CAGgHYBc3Nl72XsWMhZ0fL179+7/M/xvFtTUMp7r8NrzbgNA9vlstv2B8DsLou5kgVOKm+/r8N2gX23H1yFIkx0AwnFg3/mM/f1Pw/HreAxJSEhISEhISJQJC0DWMe5gfA1BVRfvjRgAdhSFAeCJjt8rS9h+vRBJPxUBIBxrxs0yv5OEhISEhISEJCbp1q3bJfCYE35nPwsYK6O9l/3fCBYgNTOaYCaOsZQFRons9UIIaBISEi6z37eV8VdGhf2+9+D1SAEg+/yf2PuKIMhibGN//zjK5r9lv6f1e9n2rrW/43H29x77cWo++/uxDp/5T8Yg9n+r2c+yKEHeI/CIGr7f1jn7e9/73v+y/w++Ywpjvv34uUjsqy1/B4/P7eMAOmxkf3ePtBOJiYnft7/vK3gEbG/rpo7H0N6v3uy1Q4zdsG3GWvv4z7D3ufWRes+ePb/b8TvY/82E97PXljOm2d/zN/j/Sy+99J/Z77Pscw6P05f06NHjf0Q79yQkJCQkJCQ+EhZIvMO43/4dAo6/sgDhv0d7f6QZQBZ8/AACmvDgJZYZQLa919nfJ0XgYQdhTezv/y/a9jt+Lwuo7maf+1Jsm322B/wdPpMJn4Hg5yI7vw4CnyjfHXGG0g7qyrt37/4P9t+ZEFCF/f94RjH79b/Z3/Me+/tAtH2wP/M1BH7i747HEP6P8f9EQAyBNvv738OPfUd9I50H+3ydEQEpe/9Qdsz+1Q4mN4n3sf+fzl7b3JnOJCQkJCQkJD4RFgSksx/fgN+/+93v/hMET4xXo71fZgDIPnOk48ITO3h7vBN9230ve38aY1mH74AZr9Twz7C/3472ndH0C/s+CAAnib+ZfqPY3xlhn/t3WOQi/oaZQzvAuy7atjo+Au54DNk2PmV/53b4TKqTABBmJMO/h333pfb27xCvsaDwGngNZhKj6UxCQkJCQkLiA2GBwc9hBk488rQDnUZ4xBntM5IDwL+wv6vCt8842lkAGiEAhCByQof3TIJHp53pEuW7owaA4TmA7PchoK/9uwimyjrsRw3jvmjbihIAhj++TWd/r+vwmUUOZwDbnS/2/7+wt19kn3PQO8/W+cqujhMJCQkJCQmJwQJ5bSxo+FmH1+6w89N+GOUzsmcA+4W/B3LT2Gt/H01npzOAqgJA+3MwA/hk+Gfsx+h/F21bXc0Ast8/6WoGkP3+FATsYXpdFUsAaAetX0H5nvDX7VXIna4CJyEhISEhITFbvgWzPhFe/yYLDk4zxkb6EASNsJgCfmc/V33/+9/vZufdfd0h8ChjAcYfIZ+PvW+H/Vq7Vbbs/19jfx+85JJLvg1/w0/InWOv/yia0hFyAO9hnzkPART8/YMf/KAn/A119qJ9JprY5XBO27r9iX3mIVvvTgNAOFaQF3iRnQPIdPjf7O9jnZV16RgAdjyGbBs3sm38lwjQ7cU258KDOVgEA3mCsD17P4fGEgDa74UFMfMvsgM+CPjZa9Xs1292dZxISEhISEhIDBQWTHwHVrPCggsIZsL/jwUCk9nrn9nBxuwIn72avV6RbK0oXcTem5BsrT6FWcMCmIWyv+dFCCjgMSMEgil2Iehke5XtRW2Bx5vwefbaTvZzFwRhUdT+VnL7VcCrw3R6PNlazQqPM/eE5xDaj1LFZyZF/mpLYPYRVhHb+7Prsssu+xcInthrX6TY5WfsWUIIKL+wAyiuG/t7mL0fOwAo7BxpGx1XATOmhq2kbncM2c9n2d+HQZdka8XuirBtivM11X5svgGOefh32LmKTTbZ4Z+DfE/22gw4XnDsIaexs8CbhISEhISEhIREvVwMAWj4C3Yw+zGWQiQkJCQkJCQkJAoFVhLDLO1F9iNZ6Hhi5xpGXVlMQkJC4qkwh/RKtMcdQpKSkvqyO9eHGSOiFUglISEhIbEEFsLYq36L7cftxYmJiU9g60VCQkIC8t/sQq77kjtpaWQnM8+F39nP7yXbXQdISEhISEhISEgMFXuVWdQAkAV9A1gQ2Cfs/fXeaEZCElEuvuTDzd/u/qfNSd99f8k/YStDQhKzPLbmm99/P/Un3f+0JurqYhISHeWyfqn/cukHa/6t23tbL8HWhUSidBUAJls9KJ8K+7sOVtt5ox0JiS29hv7dD/pufZ1x+gf9UkPAZf22/jv7exZzSldgq0dCEk26f7A1mdnqIsbZVtvtu/UEs91BYNfY+pGQRJPu/bb2uqxv6h5ht5bfTc36ft/NUWMGEoMkhhnAmR3KMjR169btH51s6+uvvw6RkMQrJz77j9DdU3NbHdA1H2eF7pi8K9Szv/V38qD0UObhZmw1SUgukOzK06GfDMlstd3bJ+0KXTl8W+vfD8zI5/ZNQqKT/Nffvgq9tbK01U5/PmxbqNf4nNDPhrXZbt/1B0N/+8q/13QnMY5xEuMj4N5hfzdGe29XAgf17Nk/hz77jCCiAzYibOXIic9CN4zK4g7n1vHZofT9p1rfd6jmTOiDVZaTgmBw7s5qdN0JPFvB1qUjs7OqQj3si+Vby0pCh5ktw+tnznwZyilvCN0ybmfrxbXs+Gl0ff2OzraiE82nvwy9tKCI2+bPhmaGZmyvDDU2n+f/V990LjRtW2XrTc1rS/aGWtj7sXVWYStO4xyjpGMACEVNw/8fyhbALCD8npAANWOTtzjdFgw+OLhnzhBEdMBGQI7Xfc6DPnA0T8zew51QpPfPYA5JXGjTS+rQ9Se8txXd/EpmaV0oob91YzJze1XoNLtIdnxPXeO50IvzrQvtbczOT9R/ga63n9HVVnQDgjqwyauGbwsVV7ZEfE/uocbQT+0g8J3lJeg6q7AV51GVIQIV/u1K9YvY773YSxez349Dp4EO74OK9E8yxiQmJiY53R4NPiIWhKN+fl4hdzC/nbI7dLLhXKefmZJRwd/ba1x21ECR8B86XtQras+Grh6xndvjhLQjnb4XgsB7Ju/m733m04KIgSLhX1vRjY3FJ1tn/goqmjt9b97hptCPh2Tw968trEXXXbatuI2vSDoIDT4iFsBGMg43c8dy5bBtoeqTZ7v8THPLl6G7Ju2K6aJL+AfdLuoQwD0+O5/b4bNzC2MK6CDN4Vo7YFy06xj6PvgV3WxFN5rYjbNIS5iXfTSmzyxk9ipmC4+e+hx9H2TaCna85DuhwUfEQm3DF6HrR+3gjmXx7tgviNkHG/ij4MsHpYfKa86g7wehHt0u6msLTnC7/cXH20M1dbE/0hWfg5lDehQcDFvRjenbKrkN3slupOGGOpbPwA0O3OjA515eWIy+DzJtBTte8p3Q4CNiod+aA615f/E+Ent7eQn/LORWYe8HoR6dLuowg3LT2J2OZvLAzp+cs4d/duDaMvR98SM62YpuHDv1eWtOX8b++PKoIeVBfHbPkSb0fZFlK9jxku+EBh/RFfAYIWVQeihxQFrowLHTjj4P+SvgjDYVn0TfH0ItOl3UZ9gzKHdP3sVXRsb7+X3VLdzuExj7q+O3fcIcW9GND1eXurpxHrGpvHVVMPa+yIACQAVCg4/oirFbD3NH8ubKUse28smOav4dvxq9I1TfRAtC/IwuF3VYzCFuPOKdQQmn72pr9htmwbGPrd/QxVZ0A1b6wor1pIFpodKjzm48qk6eDSUPtG5eDtV8hr5PMmwFO17yndDgIzoDHqFB7hRcAEtPfeHYVmD25d4p1srKiem0IMTP6HJRn59zlNvbY7PyXX0PzPzB98DqylONna98J8y0Fd14+pMCbnOD17lLPXjHTr9x+z06QAGgAjF58NXUNIZuu+12dD38zLLc49yB3Dt1t2tHDXXY4Lt+PWYHldbwMbpc1O+bat1wrNpzwvV3iVxAmMnGPr5+Qhdb0QmYrRareN0uPtpb1cK/60cfZRi/kIkCQAVi+uArLyeHrBJxEV2Wd9y1o4ag72Y7IR+CQex9I9Sgw0UdEt/FCt4mCTUo1xXW8u+7Y2IO3bz4zFZ049XFVtHnSekVUr5PrAienCHn+7CgAFCBmDL46uvPhN588+3Q0KEjQn37Dgx99NHw0MSJU0NXXXUVCwKPhvbvPxy6//7fhR577InQgAEfhR5++NHQCy+8FGppoXwzp+QcbGgtn9HMjqMMW4F6gFZi8j70/SPUoMNFXbQjHLrhoJTvgxIcov1hVlk9+jH2CzrYik5AuS0omQX5f5W1XddajYVtpfXcbq8bmSXlZgjTVrDjJd9JLIMPViFBMqoKYl3htHbtZhbQ9W79e9KkafznLbfcygNAbujbckLXXHMtfzQMfz/00COh9PQd6IZrKq8sKuaOAxaByHLUUJ4AnBs4OdMfSRCRwb6ow+IP0Q3Byar1aIxPtW5e/rDIH6sqdQDbVnQDij2LDjSyvvN0WP71kt3H0ffRKRQAKhBTAsBDh46GevW6NfTSS6+Eli9fE2pstCqc33JLr3YB4COPPNr6mTfffCe0dOkqdMM1kcM1n/HVYykD03kZF5mOWjySoHwqf4J9UReLP6Bmpczvhe43wm9VxdAJh9DfVnTjoRl53HZX5tdI/V74PlFQ2tQUBgoAFYhJg6+5+Vxo8+Z0FgS+HLrnnt/yvzsGgE8++XTr+995573Q4sUr0PU2kWEbD3KH8dayktbBJ8tWRIcFyC/E3k9CPtgX9fum5kpb/NGRP9r5WWNTD6MfZz+AbSs6UXbsDLctKODcILlUFqQw3Dh6h+uSSNi2gh0v+U5MGXybNqWHMjJ2tv593XXXhU6caGoXAGZmZoeeeOKp1vdQAOgMcD4/H7aNO4uCI82tg0+WrUAeCqxwg+8vquy8uTlhHpgXdbBXsYJSRb7TzjIrL/b6kVkxt+Yi9LQV3Ri15RC3rXdX7lfy/SKF4T1F368aCgAViCmDb9eugtDzz78YGjJkROjddz8ITZ06iy8Cufrqq3mgB0Fgnz5/CP361zeFli1bE9q8OSN05513h5555lm+QARbf5PYUGStePzd9Nx2g0+mrQxaV8a3MYBabPkOzIu6WPwxRNLij47A47O7Ju3i21hbWIt+rE2HAkALsCsojwV2Bf3TVWyjxK5nec2I7Y664mBDAaACocFHdET07p2aWdn6mmxHLepTXTlsW6jR4JVpxIVgXdTDF3847Z4QC5/utLravDCPelu7hQJAi6wD1kpdKJOlMkfvNxNyjF3JTgGgAqHBR4QDj7XE41nISRGvq3DU90+zcrVWK8jVIvDAuqgv3n1MyeKPjhw79Tlfyf7DwRnSc7WCBgWAFuKmW3Vu6cd2f2ATn7xQAKhAaPAR4cCdITiI2yfmtHtdhaOea8+kPPOJvJIHBD5YF/WXFhRxe1qQc1T5th6cbq3W3Lz3JPrxNhkKAK2Za+jU0YPZU3nNGaXbEjmysCDEtNXAFAAqkKAPPqI9g+3cPLhTDH9dhaOGoqfQrDxxQBr/HXvfCTlgXNRhwYe4iHpRogW6NJicUK8LFAC2tdt81GXP6lgIzzXMO9yEvu/xQAGgAgn64CPaAOdw05idEZ2DKkcNj+t4Qn0BPQb2CxgXddE/FQreerG9fdUtrd0VTJtJ0QkKAP8ces6ui7po1zFPtidu8odvLEff93igAFCBBH3wEW0UV7a0lrjoeFFT5ainZVbybf5pBc2k+AWMizrkNIEdjd5yyLNtir7Wps2k6ETQA0BYAAe5pJBTWlPnzVOQbLvF563js9H3Px4oAFQgQR58RHvGpR7mjuHD1aUX/J8qRy1KE9BMin/AuKjfMs77YGygHXSO8jDo9BtBDwDFzPUD03I92yaUgIH+7rBdqMaAfQxihQJABRLkwUe0R/SLTCs5dcH/qXTUIielsIKKQvsBry/qUPIF7OfaEds9vYnYVmotmLp78i70Y24qQQ8AB68/iHITIepljjOoow0FgAokyIOPaOPIic9a2xBF6qCg0lF/aDujiWlH0I8D4R6vL+oijQBKaXi5n00tX4Z+NjSTbxvGD/ZxN5GgB4B3TLTq8uWUN3q63fQSa+bxnsnmtOOkAFCBBHnwEW3MzqriDgF6nUb6f5WOelPxSb7tR2bmoR8Hwj1eX9QxFxKJ3sBzdlSjH3cTCXIAWGHfdMNNhNdtBcNvXsqPqy09I9NWsOMl30lQBx/RnifnWBfRVfk1Ef9fpaOGOlgpA9N5OZgT9VQOxnS8vKifbDgXShqYxssJwe9e7+sKNl54LctPqZalE4IcAEK9SrCdVxYWo2z/zaX7+PanhXV80hkKABVIUAcf0QYEXRB8dXYRVe2on/6kgLqC+AQvL+prCk540v0jGmLswA0M3MhgH3vTCHIACIGfV4XLI7He7vn++Gz19QdlQAGgAgnq4CPaWJZ3vMtZDNWOesY2nDwuQj5eXtTfWma10Jq+DW8WAy6g/BF0YS36sTeNoAaAzWGPYCuQ8kfhZh/Kz1w+KN2IfuwUACqQIA4+oj3iIgp5gNHeo9pRi5WcUJ6AysGYjVcXdbCTa0ZY5SzAfrD2V9y8wDjCPvamEdQAEBZ9RGq56TX3TbUqP2w/UI9+TLqCAkAFEsTBR7RHdP/orCaUF476JruwLvSrxD4mhHO8uqjnHrIuor3G4Ra0PXj8DNfjao/L0PiBoAaAUPYFbAbKwGDqMWTDQc8LqDuFAkAFEsTBR7Qhyr9cNXxbpxcvLxx1vzUHuC4TqByM0Xh1URcX0UHrytD3Wdy8mFRYVweCGgDePy2X2wuUY8HUY+u+U3YFBv3zACkAVCBBHHxEG0vtRuQvLeh8JZoXjnrLXqsczEMzqByMyXh1UX/AvohCNwXsfRZpFJ9QOZi4CGIAeLzu81DP/qmhKwbj596dajzXuoipoUnvPEAKABVI0AYf0Z53llsXrlmd5P8BXjjqeuaAICE5gcrBGI0XtlJnX7hg5boOF65Fu47xcfRqlDqaBJ6t6MZKu3TQ7zUpHSRupDJL8W+kOoMCQAUStMFHtEc0tC+q7DzvzitH/YxdDmYdrag0Fi9sRfRQfXC6dz1UO0PkAV4/MgtdF5MIYgAoZotnbu/8ptsrhm0s5/qM3Kx3HiAFgAokaIOPaKOi9iwf+FcO6zz/D/DKUY9PPaJFcjThHC9sZbSd/zd0gz52csOoLK5T2TEzOivoQNACQPCzUOkAe+V6OND73YTUGwoAFUiQBh/RHlH/r/f8oi7f65WjzjpQz3WCxxLYx4dwhhe2Itq/QRtB7P0ViLZwC3cdQ9fFFIIWAMLNAdjIjaP0mSmGdArRTadeg3SKaFAAqECCNPiI9ry7cj93RjNiKKLrlaOGfC5wREmaOyMiOqptBfqY/nBwBk+k1ylX9NOd1VQPME6CFgAuz7Py/15Gav8WjQen52mxKrkzKABUIEEafER7eo3PjrnunpeOWiQlZxlQnJS4ENW2Iur/3TlpF/q+hrOvuoXrBXU1sXUxhaAFgP3XWqWupmRUoOsSzsebrDzA4RvL0XWJBgWACiRIg49oo+qklf8H7YhaYihe66Wjhvw/0A3yAbGPExE/qm1laqbVeePD1aXo+xoO5HdBPU3M9l6mEbQA8HfT9by5FYuqfqfJoqpIUACoQII0+Ig2RCmC5+cVxvR+Lx21aFLeWW9iQl9U28qL84u4fYANY+9rR15aYOkGj/qwdTGBIAWAkLqQAmWu+qfyvDtsfcKpt1NvoLSSbrqF2wp2vOQ7CcrgI9rzwapSfqGC2ZRY3u+loz526nOu20+HxDY7SeiFSlsJn2WrrD2Lvq8dEX2B31+p1+ykrgQpAMw73KRl6oLgkZlWHiB0B8HWJRIUACqQoAw+oj232fl/+UeaYnq/145a5Cd2VZ+Q0A+VtqJ7nt2eI9ZF/jcTctB1MYEgBYBzdliLhN5dsR9dl0iM0rC0UjgUACqQoAw+oo2jDmbYvHbUokPJHGqtZRwqbWWuvdL2jaX70PczEjCefsLGFegIM9nY+uhOkALAN5nNgl3Myz6KrksktpVaJbju17QEFwWACiQog49oY9WeE3ygPzs3tvw/wGtHLVpr/ZFaaxmHSlt5bYneF1EAWnyBjmsLTqDrojtBCgDFU5fCCj2fakBf4hS7FaeOeYAUACqQoAw+og1YPRlvKQKvHTVUyecFU0fvQD9eRHyotJVfMnsAu9hfrUcXhUhMTLe62UDJD2xddCcoAWBtwxehHswmfvRRRqi5Rd+85gc1XaUMUACoQIIw+Ij2QBIyDHKopxbrZ7x21JDsf80Iq2XSESqpYRSqbAXsAOzhamYXXbUuxCTnYAPX8+7Jeib760RQAkBRZgUWWmDr0hkD1pZpWacQoABQgQRh8BFtwNQ+lCGAqf6mOO5EMRy1KKmxQsNyH0R0VNmKaF0IdoG9j53R1Hw+dMXgdN6pBGZ+sPXRmaAEgBPSzOhxvsIuD9ZHs04lAAWACiQIg49oI6us3lHBTwxHrWvBX6JzVNkKlFYBe5geQ+tCbB6fnc913bJXn17FOhKUAFDUrly9R++80IPHz2ibekMBoAIJwuAj2piSWWHlJ62JLz8Jw1Hvtlt+3aVp3SwiMqps5faJOdweoJ4a9j52BbTUAl1HbzmErovOBCUA/MXHVjrL4Rq901nC62xWn9SrziYFgAokCIOPaOOVhcV8cC/LPR7X5zAcNTyipkdp5qHCVk7Um5FEL1hXWBv3SvsgEoQAUOSuQhCIrUssiFXsG4pq0XUJhwJABeL3wUe059djrFWUsMo2ns9hOerHZuVrXZ2euBAVtpJWcorbATxaxd6/WKiotXptXzvCjIs+FkEIANcUnIir7SY2o+2C0DCLja1LOBQAKhC/Dz6iDdFi7WdDM+NeRYnlqD/eZD1Kg5/Yx4+IDRW2IpLoh2japSAS4rEfrWL31lZ0A2wW7GBc6mF0XWIBbrZB3ydm70HXJRwKABWI3wcf0QYkpMPAfnJO/AMby1FvKrZ0fvqTAvTjR8SGClsRK8JXaZ5EHw7M+FBBaO9tRTcetZ9ipJfUoesSCzV1X7R2itKp3BIFgArE74OPaENM7Y9wMJuG5aghERl0hsRknZwRER0VtnKjXQC6/PgZ9P2LlbGph7nOwzaaM2vpNX4PAKE1IOStQv4q5LFi6xMrN4/dyW23RKOC6xQAKhA/Dz6iPSK5d72D5F5MR339yCyu9yHNV9ARFrJtRfSuvnKYWTcBuj5K0wm/B4DFlS3cBm4dn42uSzxAC07Qe/HuY+i6CCgAVCB+HnxEG+HL+ytr41/ej+moX5hXRI/SDEK2rYjUhaccpC5gcrzOec5tUPB7ALgg5yi3gTeW7kPXJR5mbK+yarCu0qcGKwWACsTPg49oo7zGKvAJs2lOPo/pqMduFY/SytGPI9E1sm1FnH/dViXGgtNV90HB7wHguyv38/M/O6sKXZd4yCm3arDeO2U3ui4CCgAViJ8HH9EGJM/DgO4931kbLUxHvdnQGaCgIttWWhdTFOpVlywWWutu5sVXdzMo+D0AhH7QphQvD6ex+XwoaWAap6HpPLo+AAWACsTPg49oA3pQgiOamHbE0ecxHbWpOWBBRbatXGfngJpYTmVKhtV5Z8DaMnRddMTPASDvuz4gLZQyMJ33h8bWJ15g9g9sF2YDsXUBKABUIH4dfER7HpmZxwdzxn5npQiwHfUNo6wgAB5lYx9LonNk2kqlXVD5GkMLKm8/YPXefnB6HrouOoLtV1Syo6yBn/v7p8XXd10XoAc76A/5gNi6ABQAKhC/Dj6ijfBSBE5bqmE7arEQZA0tBNEembaysch6/A8r2LH3ywmnGs/xVobQ0tCEFnZeg+1XVDI1s9JR33VdgBXAoD+sCMbWBaAAUIH4dfARbcgoRYDtqKmmmjnItJWRm63alfATe7+cchsbd7APRZXN6LroBrZfUYnTvuu6ADUAQX+oCYitC0ABoALx6+Aj2li4y7qTe91FKQJsR+2miwnhLTJt5Rm7duXG4pPo++UUKAEC+wAlQbB10Q1sv6KSX9nFyw8cM3MFOORbQzcQ2AcoaYStDwWACsSvg49o4/2VVi7HLBelCLAdNS0EMQdZtgLn+eoRVj/dqpPx167UBRh3sA8wDrF10Q1sv6IK4a9+bri/giLmsB9wA46tCwWACsSPg49ozz2TrdVcu1ys5tLBUd8oFoIY1A4siMiylcM1n7mqXakLu+yaar/VqKaaLujgV1Sw0Sc9zCHlBvZjgsPqETKhAFCB+HHwEW1ADSdRz6nRRSkCHRz1i/OthSCr99BCEJ2RZSvQ+QXONywAwt4nN8gag35EB7+iAj/krgLL82r4fryqwUIQCgAViB8HH9FG7iFr9gFmAd18jw6OmhaCmIEsW4HOL3C+4bxj75NbREHg3Yf0qKmmCzr4FRVA0Xo435sMzl0F9lZZCwhvn5CDrgsFgArEj4OPaGO+3YvyrWUlrr5HB0e9dd8pvi+Ql4J9XInoyLKVJ+2LKJx37H1yi2gJNmeHHjXVdEEHvyIbyPmD/s9wviEXEFsfNzS1fMkLWScOwJ+9piH87CUAACAASURBVABQgfht8BHt6b/2AHdE07dVuvoeHRy1XxKr/Y4MW4HzC+cZzvcxwy+iwLxsOTdifkMHvyIb6PsM5xr6QGPrIgMxe11wBLeMEQWACsRvg49oz+Oz8111ABHo4qhvtEsrHKSFINoiw1bg/MJ5/uVof1xEoResjFQMv6GLX5HJ0tzj/Fy/sqgYXRcZiDJGUBgaUw8KABWI3wYf0Z6rhm+T8ihCF0fd214IsooWgmiLDFtZlW8ln7+0wB8X0fqm86GE/qmhywel88482Progi5+RSb91lhPXaZlunvqogtTMq1+1oPX4fazpgBQgfht8BFtQO00GLjXSuijqoujHmcvBBm6gRaC6IoMWxELQMan4pefkMUt43byfdpfbWZhYBXo4ldkAr1/4TzvLGtA10UGaSWntCjCTwGgAvHb4CPaSJU4cHVx1LQQRH9k2MpzcwutDiBFZq+iDOelBVTGqCO6+BVZNDWfb100AbO+2PrIoFriRIIbKABUIH4afER7xNT9IAlT97o46mO0EER7ZNjKL+1cz/Ia/+R6jtrij9pwMtHFr8hClN2ChRPYushEdOTBXNVMAaAC8dPgI9ojkncX7XKfvKuTo/7Fx5Yzqqw1tz2Yn3FrK6caz/Hz++MhGb4K8kVha8hjxdZFF3TyKzIQbf/eW7kfXReZiJZw6SXuFhO6gQJABeKnwUe0Ryzfzz/S5Pq7dHLUoj4cPOLG1oW4ELe2knOwgZ/fB6blou+LTER5kJvH7kTXRRd08isyeN2+6V4o4aZbJwauLUNf2EIBoALx0+Aj2mi2C3gmDEjjrajcfp9OjhoeaYMzgkfc2LoQF+LWVuburObn990V/ppFgdW/VwxOD/XsnxqqazyHro8O6ORXZHDnJLtmXgVuzTzZwFMk7DqWFABKlv/94YYfbjrQ4JvBR7Sxr9pq4XPr+Gwp36eTo16ogTMiouPWVkQZjZnb/dc1494pu/m+5VJLOI5OfsUtcNOdPDBNi64ZsoGnSNh1LCkAlCyX9du62bpbcf+IkNCLlXYdtVcWyqmjppOjFonWcDHF1oW4ELe28ugsq3h5ZilevpEq4KYF9m1BzlF0XXRAJ7/iFnHTfZukm26dgKdI8DQpZVA6D3QxdKAAULJc9uHWuXyRAHKFb0I+IzZZddTGph6W8n06OWp4fAaP0eBxGhXV1Q+3tiKKlx+vM78FXEcghwr2bcBa3KK6uqCTX3ELFKeHc/uypJtu3YDAFvYPAl2M7VMAKFm+33fru3BCh1BRXd/xvF1HbUNRrZTv081R3zTWKqp74BgV1dUNN7YiipfDSm/s/VABrKKkOpZybEU3oLwPnNsxW+XcdOsGtLaD/YOnSxjbpwBQsnT/YPPdcEKfZcECtnERcvmVqKMmqWeubo76hXlWUd11hXICXEIebmxFdB3wa4B01K5jeQ1yUV1d0M2vuEEU+oZyP9i6qEB0YRq+sRxl+4EIAJOSkvomJyc/zBjBfu8e7X0pKSk/Zz++eemll/5zYmJikpNtdeu79TI4oTdRWQJfcbJBfh013Rz1x+IRt0/vtk3Gja1MtR+RDvTxI1Idiurqgm5+xQ29xlmPSKHcD7YuKoCuPLB/zyFNGPk+AGQB340ssJsLv7Of32NB4Ppo72X/d4C95yxjY7du3S5xuMmLf/RRBs+n8kvbGuLPoWy7jtrvpsuro6abo5a9yIWQhxtbEYsk/FZHLZzHZ+ejF9XVBd38ilP4Igl2HYVFEn7NSz5U8xm32xtH70DZvu8DQBbMDWBBYB/xNwvy6jt573MytvnAjDx+UvdIKBZM6MEnO+w6ahKr0evmqPdWWSvufjMhB10Xoj1ubCUIZVL6rz2AXlRXF3TzK07ZY5dJ8VsLuHDgadJPh2Ty/axt+MLz7fs+AGQB3zTGU2F/18Ej3kjvZQHgmMTExHvYz/49evS4wuk2/7TackbL8o7zA0yYz4erS/k5nb2jStp3nj1rOWr4ib1/QPPptppbzS3n0fUh2nBqK6fPtBVKrm86h74fqoASMDA+315egq4LNrr5FacszT3Ozym038TWRSUP2RNGOw82eL5tsBGncY4RwoK5mUlJSY+H/d3UrVu3f4zy9ovhn0suueTbLFAsdLrNWbssw524vSpE4g95/JMCa7l+7efYqiiVe6bm8v2sbvkztiokEuTU53+xipdPzMFWRamUN5y3UjRm5mOrQiJJxtq5q5/m1mCrolSGbLYWgiwrOomyfadxjhFiPwLuHfZ3Y6T3JSYmPsj+b6L95zdYAPgXp9vMqrAepfVeUIR+d0G458yZL0M/G9o2TS/re3W8U3918V6+n8tp9lornNoKrOiG8/nifH/7IpjdFHUsYdYTWx9MdPQrTvj9p9ZN9+a9J9F1UYlo0/j+yv2ebzsIM4DXwSwg/J6QkMDiuuQt8DsLChPD38cCwNvY//8Cfu/Zs+fl7H3bnW7z5Nn/4Ce0lw+rlweRw3ai7g2jsqR+LwxAEPiJvY+C8alH+L4OQypLQETGqa1A/TQ4n1BPDXsfVHOzXcfSrytGY0VHv+KEG+2yW7BQAlsXleQoWGAYK2AjbuIrI4QFe6NYEPikneMH5V0uZgHecfb6dzq8rw/MFrL/G+5iFfBFf/vqa55LBW1emnzWvzCIbCq2lurDHanM79XRUWOXJSAi49RW+iy0Cs1CRwXsfVBN7/n+rhkXKzr6lXhRUXZLV041ngv1YPsK1UO83tdABIBeCwy+OybmcAMursRp8ULIY2KaNSs2VHJ3Fx0dNRS5hn39FVJZAiIyTm3lVuRWU14iukaM3uL/2c7O0NGvxIuYFXtgmvezYhj8eow123lQUpOBWKEAUIHA4BMtXlYhtXgh5CHy4mBVt8zv1dFRwx0o3InCHSncmWLrQ1g4sZXGZvxm816y2u4b+9KCYNex1NGvxMu8bGtV959WyCu7pTNYXZgoAFQgMPhGb6W7Ub9wuz2bW1TZLPV7dXXU90+zVgLnlPu3bpxpOLGVINRRC2d/9Wkr93pcsHOvdfUr8SDqOs7YFoy6jlg9jykAVCAw+FYXnKCuCj4AcjihLl7SwLRQk+RZFF0d9TvLrc4RcBeOrQth4cRWluy2ylG9vnQfuv5eAN0iLh+UzrtHNAS4C5OufiUeoG812G7G/mB0dsGavaYAUIHA4BNdFWD2CNu4COcUVjTz83iHgvOoq6Oevs2qvwV34di6EBZObOWj9Qf5eZyUXoGuv1fcM9nqepJ3OLhdmHT1K/Fwrd3bufrkWXRdvABWrsP+3jJup6fbpQBQgcDgg04KkH8Dq4GDkH/jV0Q1+teW7JX+3bo6arjrhn2G/qrYuhAWTmzlGbt4+Za9J9H194o3l+7j+7zIx32Pu0JXvxIrx059zs/hVcO3oeviFTB73daxx7vZawoAFYgYfL3sFXiQm4JtYIQzhmywZlEmph+R/t26Omq464Z9vobdhWPrQlg4sZXrR2bx81hxwt911MKZklnB93ng2jJ0XbDQ1a/EyrbSen4OH50VrBvQ+6Z637ObAkAFIgafqEvl9coeQh4qZ1F0dtRw9w37fZTdjWPrQsRvKyfqv+DnDzrY+L2OWjipJaf4fkMOGbYuWOjsV2JhVlYVP4d9VwcrBeVtO/d6fo53udcUACoQMfhGbCrnJxS6K2AbF+EMlbMoOjvqx9jdN+x3ZmkwkrB1J15bySqzZlGg0Ty27l5SZc9eXxvg2Wud/UosvLdyv9UDeGc1ui5eMkPkXq/xLvClAFCBiMG3TGH+GKGemjprFuXnw7YpmUXR2VH3W2OXYdheha4LEb+tzNlhzaJ8sKoUXXevEbPXxwI6e62zX4mFB6fn8fO3s6wBXRcvgZttrx99UwCoQMTgC1odLr+x/YA1i/LITDWzKDo7atGg/N2AFGLVnXhtBQI/OH8QCGLr7jWP2rPXQSkh0hGd/UpXwI02pC3A+YM0Bmx9vOR43edKJxyi2Qp2vOQ7EYMPVvPAqh5Y3ROkPBy/MHO72lwUnR01ZoNy4kLitRV49AvnDx4FY+vuNa2z1wEpItwRnf1KV0CqDZy7G0ZloeuCwXUi5ajWm/I3FAAqkPDBd9OYnfyElnvc449wD8x+wbmbqygXRWdHHaRm7CYQj60EeRYFEG3EoKA5ti4Y6OxXumLrPmsRDyy+w9YFA69LN1EAqEDCB9+zcwv5Cd1UHJxaXH5BdUs03R31jaOtBuWHaoJTRkRX4rEVMYsCC5iw9cZgFxuvsP/3TQ3m7LXufqUzpmRYZXwGrz+IrgsGKsuORYICQAUSPvhENf7JGcGpxu8HYBblRx9lhHqwc1fXeE7JNnR31HTzog/x2ArMHgR5FgXGK4xbGL9BnL3W3a90RtALeYuFo39c7M3CUQoAFUj44ANDhhP61rJgPo4wlbJjZ/h5g0f4qrahu6MeKu5G06iMETbx2Aq0foPz9lFAZ1EAkXoD4xhbF6/R3a90xm+nBLuVX1GlutajkaAAUIGED77dh6zHEfA4Edu4iNiB4t1w3l6YV6RsG7o7apVt8Ij4iMdWXrdnURbvDuYsCgDjNqhF+HX3K9HAaoemE03N50NJA9M48LsXtoIdL/lOwgffqUYrmf4nQ4JVkd90xmw9zM/bx5vKlW1Dd0ddUGHdjd41icoYYROPrUDZKThvUIYKW28sPraL8I9l4xhbF6/R3a9E48Cx0/yc3TxW3VMXE4DZPzgOhcz/qt4WBYAKpOPggyXtQevJaTp9Fhbzc7Zqzwll29DdUTeyO9CEAWmhlIHpoeYWunnBJFZbgfME5wvOW6MHMwi6siq/ho/fl9k4xtbFa3T3K9EQT11enK/uqYsJwBMXOA7wBEb1tigAVCAdB99Tc/bwEwp9KrGNi4iNXuOy+TkrqT6tbBsmOOpbx1vHYV91C7ouQSZWWwF7hfMF5w1bZ0zAXoN6HEzwK5EYm6r+qYsJeJnDSwGgAuk4+AasLeMndHpAC5OaBuSfJPRPDV0+SO3MlwmO+mUPZkKJronVVuA8wfnqE8CZr3D4TCgbvzCOGwKWT2aCX4nEK4ssX7MyvwZdF0xELcSnPVjFTwGgAuk4+ERh0ndXUlstE4AVaHC+7pm8W+l2THDUIhdy5OZD6LoEmVhtBc4TnK8xAcx964jIhcwPWC6kCX4lErdPsHLf9lYF+2lDZe1Zfhx+8fF25duiAFCBdBx80NQaTii0Z8I2LqJrFnpUuscER722wJpR6h3wvBxsYrUVyJ+C87U2gKtfO/J6QGvKmeBXOtJu9SvlG4euHLaN2y70B1a5HQoAFUjHwQftmOBkwknFNiyiawbaj+ynZqp9ZG+Coy49auWU3TIu2CvzsInVVmAFJZwvOG/YOmMzWXSVWFeGrouXmOBXOlJcaeVs3u5R/TvdEb28d5Q1KN0OBYAKJNLgu3bEdn5Cq0960+SZcM4Ts61FO+kldUq3Y4Kjhtpcl9u5VEGtzaUDsdgKdMCAGmpQS62FSk615lLBIjxsXbzEBL/SkRX2qu0/LKKao4DoQw/pYyq3QwGgAok0+B6blc9PaGap2qCCcA/kXngRrJviqCEXMsjV+XUgFlvJtYvO3ztFbe6qKVR4mEulE6b4lXBG2HUbx6VS7ioAT5/geAxSPHtNAaACiTT4Plxdyk/onB1V6MZFREc8rv/Z0Ezl2zLFUb8R0FwqnYjFVrzKXTUFKLzvVS6VTpjiV8IRnVvWF1HuKtDaz/tTtSuBKQBUIJEG3+ysKn5CIRDENi4iOjkHrQU7v5uuvnWfKY56isilCnBvWWxisRWvcldN4pGZ1pOXbaX16Lp4hSl+JZybxga3d3MkymusXvS/Gr1D6XYoAFQgkQYfPPqFEwqPgrGNi4iOmEV5e7n6WRRTHLWXdamIyMRiKyJ3NY0KzrcSxCcvpvgVgchd/eHgDMpdtTntUV9kCgAVSKTBd/TU59wRwWIQbOMiogPV1+E8wQpC1dsyxVFDC0M4JtePzELXJajEYisid7WKFpq1Mst+8tJ39QF0XbzCFL8iEHVXKXe1PaKOZcERdT2BKQBUINEGn8hHgTwzbOMiIvP83EJ+jjYWn1S+LVMcNdyNQk4k2S4eXdkK5LjB+blqOJWaCidjv/XkBWZHsXXxClP8imAR5a5G5NXFVk/g5XnqOqNQAKhAog0+Udtnp+LaPoRzRB21A8fU11EzyVF7VZeKiExXtpJVVs/Pz8NUbL4dYiXwDaOCM3ttkl8BoE4jnKMpmeqfupjEWA+6MFEAqECiDT6vavsQzmhstnoAQw9RL3JRTHLU768UuVTV6LoEka5sZe7Oamo3GQGYvf7xkAx+bE41nkPXxwtM8isA5BbD+YFcY2xddEL09X5ZYV9vCgAVSLTBN32bVdtnwNpgVaY3BVGN/g6PqtGb5KghiZ6vYl9Fq9gx6MpWxApg8DHYuurGfVODVcfSJL8CQG4xnB+YrcXWRSe86I5CAaACiTb4UkuCWZneFLy44wrHJEcNZTRoFTseXdkK1AujWZTIiJ7AS3YfR9fFC0zyK+F1V0/TCuB2QH/khAFpoZSB6aFmRf2RKQBUINEGn1hNeWOA8lFMwouci3BMctTQFSWIXRV0oStbgXphcH6gfhi2rroxIe0IPzbDN5aj6+IFJvkVyIeHc/MQ5a5GBHqwq8xJpwBQgUQbfHCH85MhmYHKRzEJL1ZdhWOSow5fCVzbQCuBvaYzW4E6YaIHMM2iXMjawlput73nF6Hr4gUm+ZVP7dzV9yh3NSKtVSmK1FSloABQgXQ2+O6bmstP6O5DjejGRbTHi7pL4ZjkqIH7p5HtYtGZrRRUNPPzAvaLraeOlFSf5sfntvHZ6Lp4gUl+ZYCduzqDclcjMmSDVZd2UrqaFdIUACqQzgYf1Dqivqr6ATMnUIledeX1cExy1ADZLh6d2cqK/Bp+Xv6waC+6njrS1PJlKGlgGqdJUS6VTpjkV8QK4FTqXhMR1TUSKQBUIJ0Nvsl2X9WPqK+qVnjVezEckxw1MDHdyqUatpFs12s6s5VRWw7x8zJm62F0PXXl1vHZ/Bjtr1Zf3xMbk/zKL+3c1cM1n6HroiO7yhv58Xlgmpre9BQAKpDOBt+m4pP8hD43txDduIg2RL9bWE3p1TZNctTA+iIrl+rFgORS6URntvLKomJ+Xlble5O7aiJgs3CM1hXWouuiGlP8Cjxp6dHP6gFMuauRgXxrlaukKQBUIJ0NvoPHrZmmm8bsRDcuoo1pmVaNxoEe1mg0xVEL9tu5VLcGJJdKJzqzlTsnWbmrhRXe5K6ayLCN5fwYTUw7gq6LakzxK5BrTbmrXaOyxzcFgAqks8EHHSZgtZ6XuWZE10AHBa+7tJjiqAXNdi5V4oBg5FLpRDRbAX9y+aB03sGmgfxJVBbvtnKp3li6D10X1ZjiV0TuKlRfwNZFZx6fnc+PU2ZpnfTvpgBQgXQ1+MRq0z1HglGZ3gQetnvdQk9Vr7ZpiqMO5zY7l6okALlUOhHNVsrpiUJM5B6ycqmgCgO2Lqoxxa9Q7mpsfLhatOGskv7dFAAqkK4G32tLrHpzy3KDUZneBK4avo2fk+N1n3u2TVMcdTi9A5RLpRPRbGXzXiun+Pce5q6ayMmGc/w4QR1Wv+ebmeJXXllo567uOYGui87MyrLacPZdfUD6d1MAqEC6GnzjU63VlCM2laMbF/FnHvTB+YAg0MvtmuKowwlSLpVORLOVqXbu6uB11F+8K66ze85W+rznrCl+ReSuFlVS7mpnZOyv48fpidnyW8hSAKhAuhp8QatMrzs7kNoRmeKow4F+qkHJpdKJaLbypxXe566aClxA4VjBBRVbF5WY4FcodzV24IYF7Pb6kfJbyFIAqEC6GnxiNWUvWk2pBXDxhPPx7gpv2xGZ4Kg7EqRcKp2IZisP2bmrcBODraPuiFyq2Vnyc6l0wgS/QrmrsRPeQhZSGWR+t5YBYFJS0t9j6+BGuhp8sJoyeWBaKAFWUzbT3Q82g9ZZ7YjgcZqX2zXBUXcEeljDsfppAHKpdCKarWDkrprKbIW5VDphgl/ZQrmrcaGqhayWAWBKSko2tg5uJJbBd/vEHH5Ciytb0I0r6EDxZzgX4JS83K4JjjoS19u5VCrqUhGRiWQrWLmrpqIyl0onTPArou7qIMpdjYk3l+5T0obT8wAwOTn5a8ZXncD/31OlJEssg49WQOnDr8dY7YjgsYSX2zXBUUciKLlUOhHJVkTu6sMe566aispcKp0wwa+8S7mrcaGqDSdGAFjYs2fPH0SjBxN4j6dKSZZYBp+ogTSa/cQ2riADxbihKDcU5/b6kaYJjjoSKutSEZGJZCtYuaumojKXSidM8CsPU+5qXIg2nC/Mk7tw1PMAMCkpKVHGe3SWWAbfKrsKOswEYhtXkCmowGtHZIKjjoSoS9Vvjb9zqXQikq1g5a6ajMilypWcS6UTJviVq0dY7c2OnaLc1VgoPWovHB0nd+Eoeg5gcnLyI4wtjLQePXr8Dxb8jfL7IhAAcv/ghEIuILZxBRnRjugPi7xvR2SCo46EyKV6co6/c6l0IpKt/B4pd9Vk3rBzqaA1HLYuqtDdr9TUfUG5q3EiFo4mSl44ihoAsqDvw5SUlH0s4OsHP+E19vvr7Pd5aEpJkFgGH5xEWAUMJ7WZ+qqigdmOSHdHHY0KO5fqhlH+zqXSiUi2AiU0MHJXTQYKmFu5VOXouqhCd7+SfdDKXX1wOuWuxsPtE6yFo3ur5C0cRQ0AWaCXx358C35nwWBO2Os70ZSSILEOPpjOhRMK07vYxhVUWhfj5Nd4vm3dHXU0IJfqx0My+HGra/RvLpVOdLSVBjt3FYrptlA5nphZZxfhf9HHRfh19ysLcqzc1XeWl6DrYhIvLbCuVWsK5C0cxQ4A88N+zw77fQ+ORnIk1sH3IvVVRecOuxwPRjsi3R11Z9w7ZTc/bnmHm9B1CQIdbaXQzl29a5L3uasmI4rw3+rjIvy6+5WP1h/k52BKRgW6Libx8SarDefYVHlPq7AfAc9mrEhMTLyN/SxiXG+/NgtNKQkS6+AbbvdVhd7A2MYVRGDmJMVuR9SIUJBbd0fdGa/buVTLco+j6xIEOtpK6yKyRbSILB6aWr4MJYlcKp+m3ujuV56bW8htd1Mx5a7Gw7I8qw3na0vk5aujBoDdu3f/BxbszWH81a7/99eUlJSZ8DqaUhIk1sEHF0/ZJ5SInbJjdjuisTjtiHR31J0BNy1w7Eawu1JsXYJAR1sZbeeujqIyUnEDs39w7Eqq/Zl6o7tfuXmslbsK/hdbF5PYc6SJH7d7Ju+W9p3oq4BtuTgxMfFf4Se2IjIk1sGn4oQSsQN3oHD84Y4UY/u6O+rOWFtwgh87yEvB1iUIdLQVWLUOx38lQu6q6fT2eeqNzn5FLH5MGUi5q/EC+dY9mN3+6KMMaTVr0QPAhISEnyYnJ3/MmA8/WSD4E1SFJEisgw+zCDHxZ56DAheCwevlVlePFZ0ddVfASjRexmgClTHygo62AnUr4fhDHUts3UxjmJ16MyHNn6k3OvuVVr9B5c8c8cvRVteqQzWfSfk+1AAwKSnpJfvx7zbGcsZ2xl8YL6IpJUHiGXxYbciIP4feXl7Cjz2sSsPYvs6OuivgTj7RvpOnMkbqCbcVmDmBm0a4eYTVwNi6mcaS3VbqDdQExNZFBTr7lTX2k4M+1ADBEc98YtX+3LrvlJTvw14Ecghav4W/lpKSksBeP4ykkhSJZ/A9SwmxaDw43eoKAHWpMLavs6OOBSpj5B3htlJeY+Wuws0jtl4mAl1A4PjdN9WfqTc6+5VxqYf5sf+YcocdMXCt1f1n+jY53X+wA8DtkV4PSh1AQCyJn0xL4j3n58O28WN/ov4LlO3r7Khj4fl51s3LxiK6eVFNuK1A5w847s98WoCul4mcajzHjx/0BfZj6o3OfgUWPPLqAXlUPcAJc3dWW/2/V8rp/439CLg3o09CQsJ/h7+hFRwLCl9lvImmlASJZ/At2nWMn9C3llFRTC85eupzftyvHbEdTQedHXUsDNlANy9eEW4r0zIr+XGH2QBsvUzl+pFZ/BhCVxtsXWSjs1/5rV0/NP8I1Q91QlZZPT9+j8yU00XF8wDQLvfylc3XHf4Wr33lqVKSJZ7Bt6vcehxx/7RcdOMKEtsPiIGUj6aDzo46FsTNy9tU0V854bYCd/9w3Odl4+Su+oEnZu/hxxD6WmPrIhtd/QrMtsIK1h7UQcgxx+yJi6slTVxgBICFPXv2/EE0ICcQ3uOpUpIlnsF3ssHfjyN05VN7Kv39laVoOujqqGMlx755+d10unlRTbitPDwjjx93mA3A1stU+q4+wI/hrKwqdF1ko6tfqTjxGT/mN1IPcVdcNdxKXaqpc5+65HkAmJSUlNjVexITE6/xQhdVEu/gu2GU/TjihJyl3UTX9F9rXQBmSEqmdYKujjpWIHcSjiHkUmLr4nfCbQXu/uG4w2wAtl6mMmdHFT+GH67GuwFUha5+Jb2kjh/zJ+fsQdfFZB6ybwB3lLlfvIheBxCkW7dulyQkJFwmSE5OLsDWyY3EO/iemmM9jkgtkbO0mzDjmOvqqOPhFx9bwchRCkaUImxFBN0wC4Ctk8nAo184jo/PxksBUYWufgVmW+GY91tzAF0Xk3l3hbwUEOxFIDekpKSc7JAPGKgcQECH2aigcaNdUPOwpIKaTtDVUcfDo7PyrceRB+hxpEqErUDJIjjeD06XkwQeVKpOnuXH8bqR/nscqatf+XBVKT/mc3ZUo+tiMmIR2KB17heBYZeBybFz/nLsl76VmJj4IPt7BJpSEiTewSd7aTfROSpa6jhBV0cdD5BDCbYLOZXYuvgZYStQtByO9zu08MYVMO5/OiSTH0vIw8bWRya6+hWYbYXjnVnqv4U3XiKzDBR2AJhl/9zd4fU0HI3kSLyDD57lHKnwcgAAIABJREFUwwmFZ/vYxhUE8u0ezFCSAFMPXR11PMCsNRzLAVSSRCnCVkTd0CmZVHrHLfdNtQrB7z7UiK6LTHT1K9fZpXdg9hVbF5MRheB/Ndp9IXjUABAKPiclJf09+5nOeJL9/p3ExMS72e8n0JSSIPEOPljNAyf0Skqm94RluVYrKChKiqmHro46HiCHkt+NfkJFiVUibIU6B8njzaX7+LGEckbYushER78iql38lKpduAaO3w8HZ/BWkPUuW0Fi5wD2ZsHey+znjcnJyefsXMD/Az2C0ZSSIE4G37UjKJneK0ZssprBQ1siTD10dNTxAjmUsu5GiegIW7lp7E5+vMuOUe9wt0xMO8KP5bCNB9F1kYmOfqWt/R6VjJLB3ZN38eNZcKTZ1fdosQoY5JJLLvl2QkLCtSz4uxRbF7fiZPCJZPptpZRMr5qXFhTzYw2NyTH10NFRx4vMu1EiOmAj//f/fRVKYMc5ZVB6qIVmUVyzvqiW+4EX5xeh6yITHf3Kkt3WU5c3lu5D18UPvLrYaqm3PK/G1fdoEwCGS3Jy8mxsHdyIk8HXtkLKf4VJdeM3E3L4sd5b1YKqh46O2gmy7kaJ6ICNHG35Mz/Od0zMQdfHD+yvPs2PZ6/x2ei6yERHvzJso/XUBWZdsXXxA2O3HubHc+TmQ66+x/MAMCUlJTsGvvBUKcniZPDNzvJvYVKdaG75MpQ8MC2UOCAt1NSMO2Olo6N2wh/tu9EV+e7uRonogI1kHLIWL72ysBhdHz8AviBJ+IIW/8yo6uhXes8v4ra7rrAWXRc/sHrPCX48X3bpCzACwErG89FITk5+Ad7jqVKSxcngg6XxcEIfm+W/wqQ6UXrUvusfh3/Xr6OjdoK4Gx21xd3dKBEdsJEZ2cek3PUTbdw2Ppsf033VuE8DZKKjXxHHuaT6NLoufgCeXsHxvN3l0wCMXsCPyHiPzuJk8FXbhUmhswK2cfkZkffzwjz8vB8dHbUTVtl3ozQzpQ6wkXdWHZCS90O08dICa2ZqrY9mpnTzK36dacUEnl7B8YSnWc0ujqmWOYCmi9PBBz1VwRlBuydsA/MrE9OtlX9DN+Cv/NPNUTulqLKZH9M7J+1C18WvgI3cPz2Pci0lM9zOTRuf6p/cNN38SutTF5/lWmJzqz2rut/FrCoFgArE6eB70HbwOyU0eSYi89ayEm1qf+nmqJ3SyO5GYXXq5bQ6VSFf8s410MGGVlvLY6ldE/R1H61O1c2vbNDoqYufEHmVbmavKQBUIE4Hn8wmz0RkHphmVf/fVY5f/V83R+0GUZ+u/DjVp1PB4RNWvcVfUr1FqeQdthbW3IvcFUgmuvkVnZ66+AlRz9bN7DVqAJiQkPAbL7aTlJTUNzk5+WHoMcx+7+72fV2J08E3ndpqKQVq1v1sqNX/s7YB/zG7bo7aDaJDxea91KFCBa0dVyT0/yTagL7gP9CgL7hMdPMrOj118RPL8tx3tMJuBdfIeK5bt27/qGob0GWEbWOuvb3vseBuvZv3xSJOB9/WfZaTf5raailBt4U2ujlqNwy2e9ROzaxE18WPiJvDgXRzKJ0bRlk9aitq/dGjVje/otNTFz8BucBwXKEOq9PvQA0AWZBVAD2AIdhiP+exIKyX7G2w7x3AvrdP2Dbr3bwvFnE6+I7Yj3luZA4J27j8CHRZ0anUjm6O2g3zc47yYwtpDNi6+JH3V1rpIXN3VqPr4jeemL2HH9v0kjp0XWSgm1/R6amLn2hoOs87MF0x2HnuNXYO4DfELzDrxuhvB4XDGAkyNsC+bxrjqbC/6y699NJ/dvq+WAQG39mz1sGNB0j0/vGQDD5Y6prOxf15onM+ZRdPOLYfrCpF1wUAG3FqK7qRfbCBH9uHZ+ah6+JHRKvIHQfr0XXxG/3WWOV1oBg/ti4y0MmvHDv1eetTF2xd/Ehr7nXNGUefBxtxFllJkKSkpDvh53e/+91/ggLQjN2M/2SsY3zC2JyQkPBrN9tggeRMtp3Hw/5uivTIOdb3xSIhF/KQ7ejLG867+RqSCDIi1UpGXlxQi62K7+T8X/+LH9trPs7CVsWX8ouR1mPKz//j/2Kr4jtZVnSSH9shWw5jq+I72VtrBYBPzy3EVsWX0mfJPn58c6pOO/4OZ5GVBIGOHyzoWsx+/gdjH+ON7t27/0/x/zADx4LAYpfbgEe7vcP+bnTzvlgEDqrTu6/WhNndx9DvLvwG5FbCsU0rOYWuC6DTnboMrh6xnR/fmvrP0XXxE/DoDI7rVez4+sVWdEJ0YYJHwdi6yEAnvyKeuryvyVMXvwErq+H4Ts6ocPR51BlAFtx9yRjPAq8fR/p/9vr98CjWzTZYIHcdzO7B7wkJCezrkrfY350Yy/ucCAw+OLhOnslPSq+w7kZpybx0oIQGHNvDNZ+h6wKAjbixFd14eIZVx3IH1bGUSo79eP2xOQW+sRWdqKy1FoddN9Ifudc6+ZX+a63H6zO2V6Hr4kdgZTUcX5g4cvJ5sBE38ZUrYUHY6539/2WXXfYvPXr0+DcJ2xkFi00YYxITE5PYSxezAO84e/07XbzPkbgZfBuLrccRz80tRDcuPwHlHnpoVu5BJ0ctA6pjqYYF9gKbfusP+sZWdAL8wU+HWAsVTjacQ9fHLTr5FfHUBcoYYeviR3IPNfLje9/UXEefRw0A/SpuBt/B42f4Cb1pzE504/ITe45YBV/vmaxPwVedHLUMpmVapUoGr6NSJTL5yC6xMze3xje2ohtwAYVjDBdUbF3copNf0e2pi984Zdex/Am7gXEysUEBoAJxM/hgOTcs64bl3dTySR7L82r4QPnjYudFM2Wjk6OWwZa91uz176lYsVSet4tsZ1ed9o2t6MYbS61k+iW7j6Pr4hZd/Apcv+Cpyw8H6/PUxY/cKOpYnog/yKYAUIG4HXxQ2BFOKMxaYRuXXxi5+RA/pmO3HkbXRaCLo5ZFOc1eK+Fmu9RD3ed/8Y2t6MaENKtCwLCN5ei6uEUXvyKeurgpVEx0jZvH7BQAKhC3gw9mqeCEQqsXbOPyC68sLObHdNWeE+i6CHRx1LIIn71uoNlrKTQ1nw8lDEgLpQxKD/3tq699Yyu6sa6wlvuH3vOL0HVxiy5+RbQq0+mpix+B7kBwnKFbULyfxQ4Av5GSkvJecnLyIfbz4Pe+973/xX5fEV4KxkRxO/jGpR7mJ3S4D+5GdeHOSdasalFlM7ouAl0ctUzuso9zYYU+x9lk9la18ON5x8Qc39mKTpRUn+bH+bbx2ei6uEUXv6LjUxc/AovunHZhwl4FPAGKPdvt4ArhNfbzXsZaNKUkiNvBt7bgBD+hLy0w/25UB2BmCmZQEvqnhhqb9ZmZ0sVRy+QPi6zZ65X5Nei6+IHVeyxf0Gdhse9sRSeaWr4MJQ5ICyUNTAs1t5idr6aLX+ljP3VZrdFTFz+ys8wqE/XQjLy4P4saAELnD/E7CwKzw37fgaORHHE7+PZVt/jmblQHWldWj9UrN00XRy2T0Vusu374ia2LHxhrPw2A2RS/2Ypu9GL+Fo71/urT6Lq4QRe/cvvEHH48YRYb+5j4mRP1VqH4K4dti/uz2AFgwUV2P+CwAPCbYjbQVHE7+MLvRpsMvxvVgc326tRnNautqIujlsmqfGu19SuLitF18QOvLbFmVJfnHfedrejGi/OL+LFeX1SLrosbdPArMIuaMjCd5682afTUxa9Ar2Ww3eqTZ+P6HPYj4JEs2MuFFmzsZ1liYuIT7OdWxnA0pSSIjMEn7kZLDL8b1YGpmtan08FRywZy/+BYQy4gti5+AOpWiooAfrMV3Ri20aq3ODH9CLoubtDBrxw4ZuVU3jJOr6cufuXx2fn8eENbw3g+h70I5Jss+OuXkpJSzYK+v9o/P4TXMZVyKzIGn7gbhdVp2MZlOrp2qNDBUcsGVv9CruXlg9J57iW2PiYDtdOgcw3UUqtvOuc7W9ENt221dEEHv7KxyHrq8rxmT138yoerS/nxnp0VX8s97ADQlyJj8EE9KjihUJ8K27hMR9cetTo4ahVAHUA43lAXEFsXkzly4jN+HG8cvcO3tqITu8qttlr3T3PWVksXdLAV6mnvLXN2VPHjDYFgPJ/TMgAMXxBiosgYfIt3W3ejry/dh25cpnPV8G38WB6v+xxdl3B0cNQqeNbuXAGdQbB1MRko7ArH8ak5e3xrKzoBfYDheP/UYVstXdDBVmAWFY4lzKpiH48gsK20nh/vx2blx/U51ACQBXq/TU5OPsL4P4yvbL6Gn2hKSRAZg6+tybM+vWtNBII+OI4QBGLr0hEdHLUKINcSjjnkXmLrYjIztlt39f3XHvCtreiG02R6ndDBVh6YZvVWzik3v7eyCRw9ZV3nrh2xPa7PYa8CPsp4JDExMalnz54/AHowCfoqYEA0ef7xEOqj6AY3NZJUo4OjVsH8HOeFSYk23l9p5fV8sqPat7aiGzCDAsccZlSwdXGKDrbys6GZ/DjWNnyBfjyCApSBgWMOZWFi/Qx2AJga6fWkpKTuXusiU2QNvhtcNHkmLEQw8icNgxEdHLUKdA66TeLRsGDEr7aiGx+ssoLuOSzoxtbFKdi2ArOncAxhNhX7WASJh+xc951x5Lpjl4G5iwWBryYmJv4kISHhMoFdH9BYkTX4npi9h5/QNAdNngmLweut0g5TMivQdekItqNWRU3dF9o+djcJ8TgSHu/41VZ0Y6Z47L7mALouTsG2FShF4iQfjXDHuyvjr3aBPQP4KuMvdt5fOIHPAQT6MScEJxScErZxmcpz9oKETcX6LUjAdtQquXrEdi0X3piCqO4Pj9Lgbz/bik6khS28wdbFKdi2ArOnfEXqqvhWpBLumLHNqnc7YG3s9W6xA8BjSUlJV1/Uoe5fSkpKOpJKUkTW4BMD6QMaSI65eaxVkqTsmH4lSbAdtUp0Lb1jCjl2SZIH7JIkfrYVnQgvvYOti1OwbYUmLnBwcvOCvQp4Y6TXExISkr3WRabIGnxiafejNJXuiMZmqyhxiqZFibEdtUqcPI4g2uhYlNjPtqIT4cW36xrPoevjBGxbeXKOlbqUXhJfVwrCHRX2zQusHYj1M9gzgO8zZjPuY9wcRimaUhJE1uCjZFp3FFe28ON3x8QcdF0ige2oVTLNbr83SLP2e6YABXTh+EFBXfjbz7aiG7+dYrXfyz/ShK6LE7BthRYv4gA3Lz8ZYq2+PhXjzQt2APifKSkptR2BtnBoSkkQmYNPLKePZ2k3YbF6zwl+7F5eWIyuSySwHbVKtu6zHkc882kBui4m8vw8K3d1Q5HVCtLPtqIbry3Zy4/9srzj6Lo4AdNW6qh8GSr32/UXdx+Krf4i9iPgTZFeZwHgSq91kSkyB9/vptsFNQ9SLlW8jE09zI/dyM2H0HWJhJ8v6uU1Z/ix//UYc3OpMOk1Lpsfv9Kjp/nffrYV3dDdb3QFpq3kHW6iBgaIxNuBRctWcKaLzMEnTuiCHMqlihfd7+T9fFGHu/8rBqeHevZPDdU3nUfXxySaIHd1QFooeWBaqLnlS9/bim6IJwd9NH1y0BWYtrJk93FqYYrIlAyrB/NH62PrwYwdAH4zOTl5cEpKyknGf9mPfwde1GFVsGkic/BNjvOEEm3onsvj94v63ZN38eNfUNGMrotJ7K2ycldvn9CWu+p3W9GJ1uOvae5wV2DayvCN5fzYTUg7gn4cggiUO4PjD/3YY3k/9iPgMSzgy0pKSnqG/byD/fw9+7kdXkdTSoLIHHwb7RP6XIwnlLAwYTWf3y/qry62ZmBX5Neg62ISawusGaiXFrTNQPndVnRCzMCmDNSzekBXYNpK7/lF3HbXFtaiH4cgUn7cSr25aczOmN6PHQDmX3ThbN832et7MPSRJTIHH9Sv4yd0bGwnlLAwoZ6X3y/qY7ZauVSjtpiZS4XFODsHbcSm8tbX/G4ruqFz/dCuwLSV28Zbuasl1afRj0MQgYmPHw7OiDn1RocAMObXTRGZgw/uQKGOHdSzg7p22AZmCiZU9Pf7RX2VnUv1iqG5VFi8tmSflbua25a76ndb0Q3RQWijhh2EugLLVppavgwlDUzjNLWYN3PqF+6ZbKU+7Ykh9Qm7DMwsxvKkpKRe0A+YcSsL/pYyZqIpJUFkDz6oYwcntKiScqlixYSenn6/qIO9wjm4c9IudF1M4l47dxVWVIrX/G4ruvGR6CGeoV8P8a7AshWY9YNjduv4bPRjEGRaFz/mdr34ETUA7N69+z+wAHAO1P2zewD/FYI/eB1NKQkie/DBDAqc0FWUSxUz0IcSjhm008PWJRp+v6jr3olFR6LlrvrdVnQDqi6A/3hneQm6LvGCZSvrCmv5MYM8QOxjEGTGpx65IIUkGtirgIVcnJiY+K/wE1sRGSJ78EE9KjihoymXKmYen53Pj1lmqb7tiIJwUb/JzqU6eNy8XCoMRDunGzu0cwqCrehE9sEGfh4enJ6Hrku8YNkKrPyFYzZsYzn6MQgy8QTiqAFgz549vwut39iv30hKSvp7xkcpKSnDLrnkkm+jKSVBZA8+WEUJJ/QPi/aiG5cpQPs8OGbQTg9bl2gE4aL+rJ1LtcnAXCoMoH8qHK8nO+SuBsFWdAI6L8F5uHLYNnRd4gXLVt5YauWuQi1A7GMQZKB4PJyHXjE8isfOAVzBmMx+/RYL/Eaz3wsZC9nvq9GUkiCyBx/UUYMTehflUsVEbYPlvKGNns7tiIJwUR8scqkyzculwkDkrvbrkLsaBFvRjWtGWDeRR099jq5LPGDZCnT/6Ji7SngPFI+HEkZQyqipi4Wj2KuAs+1fv8ECv/oePXr8m/06lYEJo6HpPF/WfTnlUsUE9EEERwR9EbF16YwgXNTnG5xLhUG03NUg2IpuPDIzj5+LrLJ6dF3iAcNW4Eb7J0OsvvWnNK27GiRutxeOFle2dPo+7BnAXPiZlJR0J/s9TbzOAsAdaEpJEBWDD3qqUi5VbCzefYwfqzc1b0cUhIu6yblUGETLXQ2CrejGuyv383MxL9usNpwYtlJRe5Yfqxs65K4SOLQuHN1zotP3YQeA01iwl8F+1iUkJPwGVv+yYPBP7O8taEpJEBWD7/efFvATunkv5VJ1xTC7HdFEzdsRBeGibnIuFQYid7WqQ+5qEGxFN6ZlVvJzMXBtGbou8YBhK9FyVwkcYMFoLAtHsVcBw+rfu1nAdz38wYK/77CA8HkWDKZgKuVWVAy+wevKKJcqRkQ7onWatyMKykXd1Fwqr+ksdzUotqITW/dZxeSfYTff2LrEA4atzMqKnLtK4BBrEX7sANCXomLwUS5V7NxqtyPar3k7oqBc1E3NpfKaznJXg2IrOlFeY7XhhPQbbF3iAcNWTKi7GiQg9w/OB+QCdvY+CgAViIrBt7OMcqliwaR2REG5qL9n51LN3UkXh85YtCt67mpQbEUnYMHdFYPT+QK8hhj6quoChq2YUHc1SMDqX1gFnMyug82dXAcpAFQgKgYf5VLFxn6D2hEF5aI+fZuZuVReM2yjVTJnYvqFuatBsRXdgNJbcE6gFBe2LrGCYSsm1F0NGr3sJ2FQFzDaeygAVCCqBh/lUnXN+iKrCvqLBrQjCspFvTWX6hOzcqm85oV5Vu4q2HDH/wuKregGFN+Hc7LSoDacXttKeO4q9r4TbcSSC08BoAJRNfhELtX2A5RLFQ2YPbHaER1E16UrgnJRP1RjtTf71Wizcqm8prM79qDYim7EuppSJ7y2lV3lVu7qA5rXXQ0a0AsYzgv0Bo72HgoAFYiqwSdyqT6lXKqovLWshB8jyKfC1qUrgnJRhxWtPxycwXOp6g3KpfISyFdNHGDlrkbK2QmKrejGSgPbcHptKyJ3FXwv9r4TbSzLPc7Py2tLotsuBYAKRNXgm2HnUvVfS0vtowF3oXCMYEUlti5dEaSL+t2T7VyqI+bkUnnJvmpr1d5tUXJXg2QrOiHacIL9YusSK17bytANVu7qpHQqUaYTe4408fNyz+TdUd9DAaACUTX4UkusXKqnqNhmRGCmCfJQ4BidbNC/HVGQLup/XGzlUi3PMyeXykvWFlq5qy8tiJy7GiRb0QnRhhNWA5vShtNrW3l+XiG33Y1F1KRAJ+rDbLdjXVEBBYAKRNXgO2znUt1IuVQRgRVocHxgRRq2LrEQpIv62K2H+bkZudmcXCovmZBm5a4O31ge8f+DZCu6IdpwQl1AbF1iwWtb6TXOyl09cEzvuqtB5KYxOy3bjdJClgJABaJq8EEU/6OPMkI92Amto4bbFwA1qMDYH5uVj65LLATpoi4q07/cRWX6oPL60n38+CzZfTzi/wfJVnTjGbsNJ6xmx9YlFry0FVFvLmVgeqf15ggcnp1rzc5uKo48O0sBoAJROfh+O2U3P6F5h5vQjUs3Zm43qx1RkC7qojL9HV1Upg8q903tfFwHyVZ0A+pXwrmBepbYusSCl7aytyq2jhMEDh+tt/IzJ2dEzs+kAFCBqBx8sKIHTujS3MgzBUHmXcM6TgTpot4IMwX9U0Mpg8zJpfIKmNn/yRArd/VUlJn9INmKbszLttpwgn/B1iUWvLSVNQXWzH4fmtnXkq5WaFMAqEBUDr5xqVYuFdT4wTYu3XhwurUCOPtgA7ousRC0i/rNY618lLJjZuRSeUVFrZW7ev3IrKjvCZqt6MQOuw3nQzPMaMPppa2MTaXcXp3prL84QAGgAlE5+Nbad1zRVgsGFZhF+ak9iwKV6bH1iYWgXdSfs/NRNkbJRwkqGfut3NUnZkdf3R80W9EJ0YYTKgxEW02pE17aingiRav79QSeKMD5gScMkWyXAkAFonLwdVUvLKgcOWGvkB4VfRZFN4J2URf5KFOi5KMEldlZVu5q39XRc1eDZiu6AbOzcI5gthZbl67w0lagxhwcF6g5h73fRGRuGGXbLrtGdvw/CgAViMrB11XHgKCyZe9Jq9/sp+b0mw3aRX1BjpVL9fZy6hgQzgerSvlxmbOjKup7gmYruvH0J+asBPbKVsKrUlCHH32BusFgu2klF9ouBYAKRPXgEz1D91dT3SUBrHKCYwKzTNi6xErQLuo5B61cKsjVxNZFJyC3DI5LVln0Ht9BsxXdGGzQ7LVXtiLq0v6S6tJqzQB7FfuMCKvYKQBUIKoH34vzi/gJXVdYi25cuvCGXUdt8W79ewALgnZRF7lUPx+2DV0XXQjvXgPHJ9r7gmYruiFWU77J/Ay2Ll3hla3AbCh/6vKJOU9dgkhnq9gpAFQgqgffsI3l/IRC9wBs49IFkYuSb1AuShAv6tClBc5TpQG5VF5QYeeudrYCGAiiregE1Gfsqq+qLnhlK6I3PdRJxN5nIjo7O1nFTgGgAlE9+GCWC07oGwbcjXoB1JW7fFA6rzNnUi5KEC/qT9r5KCbkUnlBa+5qF7MoQbQVnQC/Av7lcgPqWHplK+8ZVnc1qIgnL1dGePJCAaACUT34cu3aPtA9ANu4dKD06Gl+PG4ZtxNdl3gI4kV90LoyY3KpvGBSemy5q0G0Fd0A/wLnCvwNti6d4ZWtPDLTzl09ED13ldCDa0dYT16Onvq83esUACoQ1YNP1Pb58ZAMI+pSqWZtYS0/Hr3nm1UbMYgXdZFLRbPXFq/HmLsaRFvRjd527jXUYsXWpTO8sBW47kAuLxyPmjoz6q4Gmcdm5fNzta20fbBOAaAC8cJRt9alilDbJ2iM3WpmNfogXtQhRxPO1d2Td6HrogNwHGKpoxZEW9EN8C9wrsYwf4OtS2d4YSuxdK8h9OHD1ZFLTVEAqEC8cNQilyo1Qm2foPHKwmJ+LFblm1WNPogX9Yamtp7AQa9jCfufMjA9lDAgjfdKJlvRm1V7rC5ML2ve99YLW4k1d5XQA1FsHgLB8NcpAFQgXjjqgXZtnymZlEt1+4Qcfiz2VrWg6xIPQb2oizqWJQGvYym6+twaQ1efoNqKTpjShckLWxG5q0M2mFN3NchkllrtJuFRcPjrFAAqEC8cNeVSWTQ1n+ddUYAmw2aUgnpR7yNmbPfonUulGjGj1CeGGaWg2opOxDNji4kXtvLaEit3dWnucfT9JboGFn/A+YIyXOGvUwCoQLxw1JRLZVFcad2V3z4xB12XeAnqRX2MoTmbsoknpyyotqIbd02ycjYLKprRdYmGF7Zyp30cCjU+DkR7rrQX7YQXnKcAUIF44ah5LhW7E4U70iDnUq3Ir+FG/YdFe9F1iZegXtTFqu0XDVu1LRvR0WdtDB19gmoruvHakr38nC3TeOZLta3Ak5bkgWm8J32TxjOhRHtEy0koDC1eowBQgXjlqG+zc6lMy32TyYhNVleUcal6r8yLRFAv6geOWXUbbxprVt1G2dw8Nva6ckG1Fd2YmHaEn7OhGue+qbYVk5+6BJl3V1iFu6E1nHiNAkAF4pWjfmWRlUu1wrDVrzJ5YZ41i7K+yLy+yEG9qEMnhR8Ozgj17J8aqms8h64PBrDfsP9XDI6ts0RQbUU3NhVbq1+fnVuIrks0VNvK8jzrqcuri8176hJkpkdo3UcBoALxylGPT7XuRqE3MLZxYXGTPYtSduwMui7xEuSLOnSxgfO2+1Ajui4YiG4+906JrZtPkG1FJw7VWL2bfzl6B7ou0VBtK8M2HuTHYCL1ojcKKBkH5+3psNI9FAAqEK8c9UYD7kZVImZRYDZJ9/6ckQjyRf3t5SXcdufnHEXXBYOF9ir+t5aVxPT+INuKTkAHDOjABOfuZIOes9eqbQWuN7D/MBuKva9E7EDTCDhvN45qK95NAaAC8cpRH6658IQGibzDTXHNouhGkC/q4nFE/7UH0HXBQNTxnJpZGdP7g2wruvG76bn83OUcbEDXJRKqbQWuN7D/cP3B3lcidsJvXk7ZqTcUACoQrxw1nNCfDc28YGl3UFgU5yyKbgT5op6xP3Jh0qDwxGyrk09ajJ18gmz0oh7LAAAgAElEQVQruhEpmV4nVNoKXGdg3+G6Q33ozeO+qbntUm8oAFQgXjpqsbQ760C9J9vTicHrzO6GEuSLuihMetXwbei6YAAFWWH/q06ejen9QbYV3Zix3Wqr1W+NnrPXKm0lq6ye7ztcd7D3k4gfmCyB8weTJ/A3BYAKxEtH/eEqq8nzrKwqT7anE5DMCvu+dZ+Z/ZCDflG/ZoQVBFXHGAT5heN18Qe/QbcVnYjWVksXVNrKnB12T9lVpdK/m1DP5Iz2LfwoAFQgXjrqT3dW8xP67sr96MblNdePtHJRKmrNDCCCflGP9zGoXxABxKNxBBBBtxWdELPXV4/Yjq5LJFTaynsrrcffn+yoRt9PIn5EGaPn7IWjFAAqEC8dNSQiwwl9YFouunF5iR9yUYJ+UR8Q50IIvzDTfoTYd3XsjxCDbiu6IWavIRjE1qUjKm3lQXsBTLamC2CIzjl4/IxVhH+MVYSfAkAF4qWjhtU8PdgJ/dFHGcYGQk7YUdZgfC5K0C/qC3KOGr2IxyliEcHcnbHPogTdVnRDzF7DYiZsXTqiylZMKIFDdA6US4Pi81A+rb7pPAWAKsRrRw3RvKnFkJ0CjyBgn99faW4uStAv6qIY8m8NLePjFJitj7eMSNBtRTegfBGcwxnb9Ju9VmUr5TXW7NGvNC6CTXTN3ZN38fNYcKSZAkAV4rWjjqepvF/4cLW1+GW2wYtfgn5Rj7cdmh+IVIuLbMU8oAQMnMN3lus3e63KVjYU1fJ9fj6gjQf8wmtL9vLzuCzvOAWAKsRrRz1y8yF+QkdvOYRuXF7xyMx8vs/bDS5/Qxf1P4duGWfNXpcePY2uixeIWZR4W4mRrejFrnJr9vp+DXOvVdnKuNTDfJ9HbCpH30fCOaKFLJxHCgAViNeOek3BCX5CX1pQhG5cXgElNGCfoaQGti5OoYv6n7nNwnkEG8bWxQs2FrVfhRcrZCt6oXPutSpbeWVhMbfdlfk16PtIOAeeFMJ57D2/iAJAFeK1o4bZEzihN4/diW5cXgDFc2F/oZguti5uoIv6n0Ojtliz16MCMnst7r6HbSyP63NkK/oBuXBwLsuP65V7rcpWbhufzfd3b1UL+j4SztlfbcULt7LzSQGgAvHaUYev7KmLI6/IVNJLrDpqsBIPWxc30EU9eLPXry5uy7+J53NkK/oBuXBwLmFWF1uXcFTYSmPz+VDCgLRQysD0UHOLXjOeRHzA+UsemBZKZOezueU8BYCyBcNR3zd1N3dGkJuCbWCqmb6tku8r1JHD1sUNdFFvm72GXEBsXbzg9ok5fH+LKpvj+hzZin7ALC6cywlpR9B1CUeFrew50sT3FVaQYu8f4R7hh/ZVtfg/AExKSuqbnJz8MGME+717Z+9NSUn5OfvxzUsvvfSfExMTk5xsD8NRw2o0nRuUq9jX+Tlm7ytd1NtmrxPsulTY+qikqfl8KIndeQPwO9mK2cAsLvihPy7ei65LOCpsBXrHwr6+sXQf+v4R7nnZzudcXXDC3wEgC/huZEHdXPid/fweCwLXd/Z+9v8H2PvOMjZ269btEifbxHDUujcol8n9dh0102c76aJuAXUA4XzmHW5C10UlxZUtfD9vn5AT92fJVvQDZnHhfN4xMf7zqRIVtjJ4ndW1Z0pGBfr+Ee4Rudejtx7ydwDIArkBLAjsI/5mAV59F+9/zu02MRz1ttJ6fkKhPAq2cakEVtzByrsecdZR0xG6qFtAJxCw3YW7jqHropLleTV8P/+wKP4ZI7IV/YBZXMijgnyqJo3y4lTYypNzrM4nqQHr2+1XVuULX1Ts7wCQBXzTGE+F/V0Hj3ejvZ8FgGMSExPvYT/79+jR4won24TBd/asNRC9Irw37pkzX3q6bS85JKrRj9mBrotbwEYwbEU3ptk5nYPWlaHropLhm6ycsfFpR+L+LNmKnvxmgp1LVd2CrotAha1AxQXYz+pTZ9H3j3APrOSG83nnpBx/B4AskJuZlJT0eNjfTd26dfvHTj5yMfxzySWXfJsFi4VOthlCkl/aLeFOf/mfWCool+wqa9FAnyX7sFUhkSR7jn/Gz+mz84uxVVEqLzObhf3cWdmCrQqJJHlrpdWRKK28CVsVZXLuL/+X7+M1H2dhq0IiSf7rb1/x2euUQemhix5b800ncY42woK6myBYYxR0YD3M5LEAsHfYexujfU9iYuKD7P8n2n9+g33+L070gQOMcaf++08L+EDdsu8k+h2GKiamizpqB9F1cQvN6lgcPWXVdbz24+3ouqgEZq1hP2EWO97Pkq3oieiO8fHmcnRdBLJtJbPUKrv12Kx89H0j5NFrnFXX8fsfbEx0EucYISyguw5mAeH3hIQEFtMlbxH/xwLDdjvOAsDb2Ht+Ab/37Nnzcvbe7U62CYMPDrDXz/WHbjjIT+hEzcoSyKS1j2FufHXUdARsBMtWdEN0djl6ytzOLp3htnME2YqerLO7KkA/dmxdBLJtZYadotE/AAsMgwTYLJzXy/puvd9NjKW9sEBvFAsCn7Tz+0Rpl4tZgHec/d93Ory3D8wYsv8bbtIqYECUJXhVs7IEMrlr0i6+jwUV8dVR0xG6qLcBswtwXjP216HrooIcl71jyVb0pOyYlZN8k0ZdmGTbyts+KbtFtGe4XceSBYAfug6ySNoEy1GLsgROykyYAFQwh0r0UJG+Mc46ajpCF/U2YHYBbBeKfGProgKozwn796cV+x19nmxFT6CO5Q8HZ2jVhUm2rYgmA7sPmV12i2gPPEXjAWC/rYuwYyZfCZajhlIESXaLl3gLzZpASVgPQ2xdZEAX9TZEgASzDdi6qKCfHeBCvU4nnydb0Zd7NatjKdNWgtZmNEjk291dWAC4Fztm8pVgOuo7ffSItCOr91h9Y/ssLEbXRQZ0UW9jl/2IFGYbsHVRgXjEDQn1Tj5PtqIvutWxlGkrolXjzRo94ibkAAE9BPYsAPz3i+zqJyQSBNNRv2aXmliy2/xFEh1prV7OfmLrIgO6qLdRZy+SgMdpLQ4WSeiOWORyzOEiF7IVfZma2VbHElsXQKatrCmwbrpfWqDPIhdCHvA07bK+qV93e2VrZ6XxSOIRTEc9OaOCD9jB6w+iG5dsXlpg9y/ccwJdFxnQRb09N9l1LA8cO42ui0yqT9plbkZsd/wdZCv6At0x4Pw+NWcPui6ATFsRN92jfHLTTbSnsLI51L3vlnuwYyZfCaaj3rpPL2ckk17jrbpFkAuIrYsM6KLenhfmWWUJ1hbWousikzQ7QHhitvMxSbaiL1V2gA/dMrB1AWTaSm+7VMjaAn/cdBPtARvBjpd8J5iOWjdnJIuTDVa+AjwibNao76Yb6KLeno/tVmljth5G10Um0+xHhAPWOn9ESLaiN1cOsx7x19R9ga6LTFuB3D/YL8gFxN4vQj4UACoQbEftx6K6UB8O9unhGXnousiCLurtWeWzRT4CsUhggYs6amQrevPIzDx+jrMO1KPrIstWxCIBv+blEhQAKhFsR/34bP8V1YXuJn7LbaSLentEmZ9ePinzIxBlQnJd1FEjW9GbD1dbPYFnOizzIxNZtgJ1//y8Mp+gAFCJYDvq/mutmmPw6AnbwGQhclFW+WQBCEAX9fbwQt+D0kMJ/VNDDU3+qGMpq1Aw2YrewOwu+Kc3l+5D10WWrfi9NidBAaASwXbUwhnBoydsA5PFdSOz+D4dqvkMXRdZ0EX9Qu6ebNWxhCKl2LrIAFY0y2gVRraiN1B3lXdhmojfhUmWrYjuPDN82p2HoABQiWA7aqhIDwP3nsn+mLqvOPGZ6zIaOkIX9Qt5Y6lVx3KRJkV13bIqv8auo+Yur5FsRW+gC9Pl9uw1dscMWbbyqM/7cxMUACoRbEdd33SeOyJwSH5YMQtlQcARPT+3EF0XmdBF/UKmiDqWmhTVdQvkrML+TEw/4up7yFb05/5pufxcZx9sQNVDlq24LV5O6A8FgApEB0ftp5p5QzdYF9Gxqf4qD0IX9QsRRXVhIRO2LjKQNYtCtqI/H67SYyGIDFuprPVnOTGiPRQAKhAdHPXLC62uGfAICtvI3CL6qEJBXWxdZEIX9QuBOmpwrn86JDN02vDSE6D/j4dk8P05Ue+uPhzZiv5AL2A4128gLwSRYSt+bihAtEEBoALRwVHDbBkM4BGbytGNzA2wivJHH2XwPrFuL6K6QRf1yIiWcKYXn91vl7W52eUCEIBsRX8KxUKQCbgLQWTYyqR0f6ViEJGhAFCB6OCoNxT5I29ub1WLL2vDAXRRj8wri6zZ62W5x9F1cQPoD/vxh0V7XX8X2Yr+NGuyEESGrfSxnyAtzzP/CRIRHQoAFYgOjrq85gwfwDeO3oFuZG4Qj1Ve16C+lmzooh6ZKZnW7APUs8TWxQ3Q+g32A/bH7XeRrZjBA/ZCkJ1leAtBZNjKL9l1A/aj7NgZ9GNKqIMCQAWig6OG/KOfDc00fhXXeyv3832YlYVfYV82dFGPDLTTgnP+4PRcdF3c8NAMqz3YdgntwchWzEB0BJmBuBDEra1AC1HYB+hvbHoeLtE5FAAqEF0cNSTwwkDeVHwSXReniMLAbtpo6Qpd1CMjepBeMdjcMkbhHUBONrh/HEi2YgaLNFgI4tZWNrLrBezD058UoB9PQi0UACoQXRz1x5vK+UAeufkQui5OgHqGiQPSQskD00JNzf5oDRYOXdSj85sJOdx2ocMCti5OELmrt0rKXSVbMYOiSmshyG8QF4K4tRW4Xph83SBihwJABaKLozb9Tg7yaKxm5GY/CowGXdSj86bdEQT6kWLr4gQxE/TaEjkzQWQrZgAz1jBzjbkQxK2tPMOuF2C7Gw1+ckTEBgWACkQXRy1yOX5uaC7HtMxKrn+/NWYvBogGXdSjMzurip/7d1fuR9fFCX1Xy+2jSrZiDr+bbi0E2YG0EMSNrcB1QnQAOWpw7jgRGxQAKhCdHPWv7NVcJtZUE+VAlhpeDiQadFGPzu5DjUb3s5a9GpRsxRxkB//x4sZWDh73R/UIIjYoAFQgOjnqVxaaW1Pt12PMDV5jgS7q0WlsPh9KGpjGaTQs/7Op5ctQCtSDG5Am7TEg2Yo5LEIuXeXGVlbk13DdoQ4g9nEk1EMBoALRyVFPtR+j9jfsMeox+/E1lLIx8fF1LNBFvXN+O2U3t4Fd5WatAC84Yi0EuGOivIUAZCvmUFxpLQC6Dal4vRtbGbTOql0JnUCwjyOhHgoAFYhOjnqHvZDi/mlmLaTYZC9g8XMvSrqod877K0uNrAEJC1dA77eWlUj7TrIVcxALQXoiLQRxYyuiduW2Uve1Kwn9oQBQgejkqKGUCjyKShmYblQplSCUIqCLeucsyDmKXlPNCaJ4+Zwd8gJXshWzeBBxIYhTWwkPXE8htrIjvIMCQAWim6M2sZjy0wEoRUAX9c4prGhGfZTmFPHoerfE8Ua2YhZQuQBsYDrCQhCntiLGG2YNQ8JbKABUILo5ajEjMduQR2mQ8wela/xeioAu6p1j4owELFhJthevNDTJm3EnWzGLtjqQez3ftlNbUZG6QOgNBYAKRDdHLR6lYa1Ki5cDx05zfX/l81IEdFHvmgenm5WTlHe4iesLs+4yv5dsxSz2VVsLQW4au9PzbTu1lXdbUxeq0Y8f4Q0UACoQ3Ry1aEvVy5BHaVCyBvR9xeelCOii3jUD1lqrEqdkmLEq8RN28eQFrFfILWBNtmIW8BTjSvspRvXJs55u26mtiFQhuInBPn6EN1AAqEB0c9TQmP7HQzJCPdjgPlH/Bbo+XdHfzp+BEjbYuqiELupdsyzPrJuBNxS1sCNbMY/n5xZyW1hTcMLT7TqxFVMXCxLuoABQgejoqB+blc+dUVrJKXRdukJ0UcBqpeQVdFHvGigCDrYARcGxdYkFUbwcHgHK/F6yFfOAWnpgCzCL7eV2ndhK9kEzy4UR7qAAUIHo6KiHbjjIB/jY1MPounQG3H3CXajMLgq6Qhf1rglfEOT1o7R4qag9y/WEXqqyi5eTrZiHCKruneJtO0MntgKrlUFXaGOHfdwI76AAUIHo6KjXFtbyAQ6PJbB16QxVSfQ6Qhf12BCP0lbt8fZRWryINlovzi+S/t1kK+bRaN/MJnp8M+vEVl5dvJfb7pLd5rUMJZxDAaAC0dFRi9mJa0Zs17q1GpSq4Un0K+Um0esIXdRjAxaAmDA78eHqUmW5q2QrZiI6a2Tsr/Nsm05sBSougJ77q/3Zd52IDAWACkRXR339yCw+yA/VfIauSzREEv38HLlJ9DpCF/XYgILKYBN3TtJ7Vhj0U1VwnWzFTIZttFJvxmz1LvUmXluB64EJkwOEfCgAVCC6OuqXFhTxgQ4rK7F1icat47O5jtBQHVsX1dBFPTaaWr4M/egjvVexg15QsBr0hALWZCsEsNHuaf6khz3N47WVxbutotUvG7LSnpAHBYAKRFdHPWN7lZIaZbKAiyhc5OEi2hKAO1G6qMcOXEB5a8AiPVsDbrIv9E/MVnOhJ1sxk5o6y6dBGS4VNwaRiNdW3l5eIr13NWEGFAAqEF0dtej1eMs476vTx0J6SR3X79FZ+ei6eAFd1GMHVq+DbQxefxBdl0iIVfajtxxS8v1kK+Zy+4Qcbht7jnhTYDleW4FuJaAfNAzAPlaEt1AAqEB0ddSQ3wElKmCwV5zQLw9wnH2RH7JBz4u8bOiiHjtZB+q5bdw3Vc86ZQ9Oz1Wa7E+2Yi6iF/vM7d7MsMVjK3AdUFW6iNAfCgAViM6O+qUFxXzAL83VLw/w+f+/vTMBsqo68zhK6dSYmLEmMKYaVOhNpyaJE0dJmBHKuGYGq2JgNEZTatzGZUzpaEAE4oIiGsEVFcGAKCqLtNDSIluD7EsQm32TVTAGHasymqlMac/33XtOe33p5b3ue+65973fr+rffe+727mvvnfOd8/9znfG+8mc70s06vnrwMH05ofUslUNme003Qe2kl1papUkZ7MpxFbstJvaLvj+nlDywgF0QJoraptm5dbJa72XJVdn3D83tb2TLkSjXpj6m5QaaZvNxvZOupxFAVvJrhp2fhjYh2ZhSOJ6hdiKxoMn2TuJ0iUcQAekuaLWOA/9wfcZma44wI0mFYE6gb7LkpRo1AvT8NcbAhu5X/77LktUDycQn4itZFu9TAoudQZdX6sQW9F4cC3Xyi2HvH9HKHnhADogzRW1xnmcNjzsaduYonyAU5a9F5TpqvHxz6KQVtGoFybt+VMbGTBmifeyRHXZ2OVBuWas3O3sGthKtqWvf5MKvcnXVraYyQH+8V7i/0pVOIAOSHtFbSsjzf/kuyxWw6avD8r0yOxN3suSlGjUC5PG12kMoMYC6jRbvsuj0tQemuJDU33s3PcRtoKalU3BdXsCMxzlaysupy5E2RAOoAPSXlE/O39b8MP/5UvpiQO8wMyiMH/9Ae9lSUo06oVLRwGrncxbv997WVRLN4VzV5/zSL3T62Ar2Za1k3NHubUTVb62YkcnP/VW/FMXomwIB9ABaa+o1277ffDD1/kffZdFtXVP+CriO3fPCWZ98F2epESjXrg0zk5tRePufJdFpY1nEj072Eq2dSgym82Ove56ilX52oqddWn5JuL/SlU4gA5Ie0Wt8R52xG3DLvdByW1p4qIdJhVBab2KoFEvXDoTSNJTa7Wma004xUuOY7uwlezrinErEpmKMx9b2WYeur97z5ySmHUJNS8cQAdkoaL+j4mrgwpgwiL/cYC2LOMXbvdeliRFo164otMF+u4t/iCSWN31gCpsJfuyoTc3TVrj9Dr52MqrJv5Pc6/6/l6QP+EAOiALFfW4BWFl9J8vuq2M2pI2ojoKLW2jkpMQjXr7dL6JF13U8L7XctTL9bUcZ/9mofNrYSvZl75tsbNuuOx1y8dWBr66LijL43OI/ytl4QA6IAsV9brtYRxg7xHJJCdtSYs3JNeIpk006u3T4KnvBDbzkOc4wPtNXsJfJzA/MbZSHDrbxN1pvefqGvnYip2feMnGZOYnRukUDqADslBRaxygTU66foe/OMCHasMkukOmrff+nSQtGvX2yeYDvPDxxV7L8aNHw57Iue+4H5GMrRSHhpp0Vw/O2uDsGm3Zyva9HzUNuiP+r7SFA+iArFTUN00KY++er/cXe3fRk2Faj9o16ZreKwnRqLdPBw990pR7T5PZ+iiDTldog+iTiEXEVopDdWv3mYcXf9MGTjCD7q4m/1/JCwfQAVmpqNXxS3KS8lxpQH/54DcaTx5a17j/YDoS+yYpGvX26zoz+tbXwCG9bvDbmZjMbwdbKQ5pAnMdwNRT6r3tjtLBtGUrOvAjbRMBID/CAXRAVipq7T2xIyp9zKxgp3+7fOxy79+FD9Got1+TFu8MRzGO8zOK0TaiWo4kroetFI+s7biaFq41W9HZdPSBWx+8Xc5cg7IhHEAHZKmitq9ga1btSfzat05eG1z7yRLNRE+j3n5p4+Wr9/iAXO/vh4W9OK6T+mIrxafnTAaGG19Y7eT8rdnK9BW7g2v/+9NLvX8PyL9wAB2QpYr6sTmbvUwLp4NQfjAiHISiM5P4/h58iEa9Y+r/1JLw4WVlsg8vGq+q1/3xk+7iuHKFrRSPNuwK40c1/ZWLQRit2cotL65h+jfUJBxAB2Spon53Z5ib6lSpjA4lmFh39dYPwjQ0D84PnEHf34OvH1+WbCVteuzN8OHltpfdTsOWq0FTwjQ0v3ljU2LXxFaKSzYNS72DXJYt2YrW7zbnasNO/zNAIf/CAXRA1ipqm87izd/tS+yatufxvxzPoZpm0ah3TL8zc1qfPnxuYg8Reh2dQzuYQ3VzcnOoYivFJTun9QMz408H05KtaLoiveYFoxd5v3+UDuEAOiBrFbUm1NWKYeCUdYldU+dy1WtOW7Hb+/37Eo16x3XWw+4T60Zle66//8C8RHuusZXi0px1YTqYfo/Fn8uyJVu5a1qYg3CEwxyEKFvCAXRA1ipq26idcX8yPSkawF81ZHZjxV2zG3cf+Nj7/fv88WXNVtKmYSaxrs7KkcT1HjWvnW9PuOcaWykuHTTpYDQLQ9zpYJqzlWjP9bJNzP6BQuEAOiCLFfVZZooiFzEpuXp2/tbgWleNL+1EpDTqHdc881rr/IReaw0Y42fgCbZSfNJEzGpLmpg5zvM2ZysrNh8q+Zhr9JfCAXRAFivqe2vCeU2HJTCvqWbBL/XXvyoa9Y5LA9tPNYHtOrrS5bWCxOV3zW6sHloX5FPDVlBH9NLbYS7LAWPiTcnSnK2MNFNu6jzavu8bpUc4gA7IYkWtk4JrBXHmSLdPiGu2fdCUAuGgh+TTaRKNejy6aVKY2uKZeVudXmfs/DB/2xUekk9jK8UnzV/57bvnBDb1zo74UmE1Zyt2oJ/GHvq+b5Qe4QA6IIsVtTp9vU1ePpejG++tCUe/aSoN3/fsWzTq8ehVM6OM5gV0eR3biE730HONrRSn7nhlXWBT99U0xHbOXFuxeQeTmrcaZUc4gA7IakU9eNo7zlITqDTpqY6e1Gtoj6Pv+/UtGvV4pD0p2ripXa3a8oGTa7y94f2mgVI+GlFspThl37z0knoxrjysubbyxJwtwTVufnGN9/tF6RIOoAOyWlHbgPpzHql38hp49tq9Ts+fNdGoxyc7GvhXr7pJZaTJpvX8wxMabZwrbKV4dd6oMCn0zNXxDCyK2oo+dPd9aEFw/lkxnR8Vj3AAHZDVilori16mh06dwbjPf9Ok1cG5R9dt9n6vaRCNenzSGCpNqaGpNfYciHeAhp7Pzv3rawYFbKV4pXOha714zW9XxXK+qK28vmpPcG7Nl8lDN8oVDqADslxRj6rbFFQYV8Yc6K6N6CnD6hrLpRHdvPuw9/tMg2jU49XlY5c7GQzy3IJw8Iee39e9YSvFqx17P2qsHDI7UBw5AaO28tNnliUyQAplUziADshyRa2pLmyCUh2xG9d5NdeVVkSXeWxE0yYa9XhVY3o74g4xsIM/fKYtwlaKW9dOWBXYmMbrdfRc1lbWmAT/OtJ4b8Jpi1A2hAPogKxX1EPMlEEa9xTXOTXXlZ5z8pJd3u8vLaJRj1cawvDPZraDt9bFE8Lge/AHtlIa0vg8tbNzY3h4sbais9XoOYdOX+/9/lA6hQPogKxX1A27PgwT3g6pa9y6p+Ova9fv+DDoUdQnUR2x6fv+0iIa9fhlQxiumxBPPJXvwR9W2EpxS0cA2wwJHZ3XWm3kk8/+3Hjy0LogbvVdT3GrKP3CAXRAMVTUN7ywOrY5Vu25XI3QzKpo1OOXxlDpg4vOM93RWFM7+EMfXnwN/sBWSkf6kKH15K2T13boPGojYxeHs4z84vnSnm4TtS4cQAcUQ0Vt81PpNFsdmfZq4bsHgvNoXGEcvYnFJBp1N9J8Z2pzD87qWD5LO2d1GuJWsZXil/bU6YOLvn1Z0YFk/Ic0FGLkglhDIVBxCgfQAcVSUV/89NIOjSDTWJYLH18cnGPU7E3e7ydtolF3o/qGL+P22htyoA89eryep2al//xp2Epp6O4Z4UxJFz25pN2xgFOWhzPjXDB6EalfUKvCAXRAsVTUNjC5jzxNtidL/YtmsnMNzD9A7F+zP75isZW06cdPvh3Y3sjaje06Xo/T43/yVPsb4jiFrZSGdLSujQWcuGhHwcfrQKh+5qF7QjuOR6UlHEAHFEtFrQ2fptTQymTcgm0FHas9KDap9JRl73m/lzSKRt2ddPSuxu5VD60rOH5PYwc19i+OgHxsBRWqqaYH73v3vdW4a9/HBR1rwxb6PLyw8f1DPHSj1oUD6IBiqqhnrNzdFMOno4PzPW7ErA3Bcf1T0oOSRtGou5UdwXt1gYHwdsaaG19Y7f0erLCV0pHWl5eZpOYDCxg4t/m9PzT+w93hg8vb2z/EVlCbwgF0QLFV1Dao/pJnlublzG3c9YcgBYH2wOhgEt/lT2bJzBsAAAk7SURBVKto1N1KRwR/9545Bb1OG79we7seeLAVFKfWbf99MJpd07jkU4dqvXzV+JWB7WrWBWwF5aOScQCrq6uvLy8vP7Ot/SorKwdVVVX1Fw2X5e7tuVax/fh0dhAbEP/AzNZHVuqrX+31031/+VLH0hkUu2jU3eulJWEcqk6zNX/9gVb3XbrpYNDo6v76Gs532bGV0pbWtWqL/R5b3OZgpntrwsEj+sCzbe9hbAXlpVJwAI8WR+5mcQDXiFPXt7UdZb/est84XZb/3WT/19pzwWL88dWt3Rc0oq05gVpJaS+hHfhB2pe2f3zFaCtp0301DU0xVcs2Nd+boiOHTx8+N7UzJ2ArpSetT/uYdC4DxiwJHsSb2++xOZuDffThRdO+YCsoX5WCAxggztyEthxAcfruEifw2sgx+9tzrWL98Wk6DOsEXj9hVePqreFcwfr6YebqPY3njw7nTO09Yp73xLlZEBV1MtKRkRoHaHsCdbYQm9tSG9Wn5m5trDJ2/fPnljceTGHwPLZSmtJXwf9ipjc8d1R94+ur9gT2rNs0b6B97Vs++Mu5qrEVlK9wAL+6zxOin0XW93Xt2vXrhV5Lf3yHD4dfbrFJHb1ThoWvyTTGT0f6as+Krqv6PrQgqJh8lzMLUhspZltJkw5+8EnjPTPeDWzWNph9xFY16a61Xd2ujavvsmIrKKotew43njeqvslOTxs+N5DGB9rXvq8s3YWtoIKlNtIefypz5NkDOKaysvKSyPrBsrKyY9yXLlt865apXU8cVPvgiXfW/tFWSrK8Tz67rtP1Y4/yXT6AlhAbPfOkO2sXib1+amz3T/LZrJMGzeznu2wALVF2fe0xJwysveHEQW80NNW5g974n5MG1T7d7eYZ3/RdPgBviKPWR5y7FaLlEa2IxvAV8Ar46sj6+y7LnXkunnr0cbfWHNdl4MxjO3W650jfxQHIm4undj7hVzUVx98x6Wu+iwJQAEd0v622W1jndjrCd2EAMkFzDqA4exXRdXH4emkvoC6Xl5fL7lWzkiwjAAAAAMSEOHo3ijO3UTRRls8yHx8h6ztl/Rs5+44QJ/BS0ciKiorK5EsLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQklRXV19fXl5+ZvSzysrKQVVVVf1Fw2W5u6+yQToRmzlV/nXu2rXr15mCEHKh/oB8oS6Btsj1Uahf4uFo+fJuli93jXyRfe2H8llv+WycLsv/brLtNX9FhDQiNvGO2MZhUU1ZWVkX3+WB9ED9AYVAXQKt8Bc+CvVLzMgXOCHqAMqXepd8yddGtu/3UzJIK2IjV/guA6QT6g8oBOoSaIuoj0L9EjO5DqAsPyH6WWR9n3bP+ykdpBH5EY6sqKj4V/k/uEePHqf4Lg+kB+oPKATqEmiLqI9C/RIzzfQAjhEP+5LI+sGysrJj/JQOUsoR+qdLly7Hiu2s8F0YSA/UH1Ag1CXQKjk9gNQv+SJfTh/9UYmWR7Qi+t68hVfAV0fW30+63OCXFuxG9Zo8rV8k20ebXY+Uzz71WlhIFdQfkC+mLhllVqlLoFmaeQVM/RIXzTiAvdTL1uXy8nLZVDXLX+kgbUilfbbYxRm63LNnz5PFPub6LhOkB+oPyBfqEsiHHAeQ+iUuxJO+Ub7AjaKJsnxW5PMR8iVfauIzGJoPX0GDcPUpTOzmPkbuQS7UH5Av1CXQGs35KNQvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeVBVVTWgurp6i2hhW/tWVlZWmKkJvyj0Oh05FgAAAABiRpy/K/NxAJWePXueJE7c5+25TkeOBQAAAIAYwQEEAAAAKJwjxLF5QvS2OlLy/2Vxdo7XDd27d/9rWX9aPl9qNFI+7qzbZPl12fYn0R2yXCP/d4huqKysvED+vyHaLp//W+Q6nWXbA/L5ctFiWX5EPjsytzAVFRU/lO275Ng/yj6Xiy6R9Q9bcvJyHUCdE1bWF8gx80T1sv4Du804cV+YeWPnijbI8jV2u7nfZ8y9LpHlgTnH4gACAABA9hGH60fi7Lxp18XJeVTU1yw/K5psNnU2TtUwu68ct1sdJl0WR+o0Wf5UnUBz7ADRJruvbL9TncxOxumT5Zly/O0tlOkE2fZxeXn5mTpRu71Gc+Q6gLJ8nVzrr3S5hyDre+y2iAN4rd0u65/Jdb4Tud+Xze5HybFr9D4ix+IAAgAAQPYRp+b7on3iFJ3fKXTOjjL/tWfwM/n8LLuv9shFHSrjAF5oVtVB/EIctm/rinHc/jey7zbteYusX6o9cC2VSx052b5TNF0ctL9pZb/cHsDesl6nvYzaA6hOW1lZWRfdZp246Plk/S3R/fZ+pdxnR86lTuus6LEtf5MAAAAAGUIconPEuZkt2i/O04PagyaO0N9FHTpF1s+T7X+268YB7BvZ/oWc60RdznWY1LkSrVdnzbxqXiH/322tXLq/aEJr+0QdwC5duhwr+/+3Opf5lMlsnyx63t6vaKUpX73pAZzd0rEAAAAAmUScvW9o7Jsu9+jR41vqmMlnv+70ZY/YDyP7/lydPrteiAOoPYByrp9Gr92tW7dvtlIu7ckbJzos6tPSflEHUK59ul5T78lsPqq5Msl9Hhcp89xoD6D2iEbPb/fFAQQAAICiQR0ocZhus+va4yaf3Wu2jRG9aDZ1Ns7SkMixLTqAJr7ui8i2gaLaTmYQiSz3i8TbfQUzGGNGpzAO70odFHL88cd/rbl9ZdtV1gGU++iqr501rlHX5f9FzZXJxinKceUat2h7OfV+o/GGcr6bRSOaux8AAACAzCLOUbXGuYnzM1+0TDRFX6XqNnXEjBO41GxrGgUsx7xieszWyTmqTNzd5zrKV5ym7lVh4uTPI/F56kDeZ179zpf/0+T8f5tbHnXGZHuD9hiqgya6R/R/ZsTu96L7Vn2ZCPrjyGCUa2T9PfNKe7gtk5z3n2yZRLeYkcIbRb+w54uMetZ7XSAar6/DI4mgg/uxg0wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA8P84vNK7kDXEXAAAAABJRU5ErkJggg==\">"
],
"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": 13,
"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": 14,
"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+AAAgAElEQVR4nOy9B3xc1bUunnJz7//el5v37ntw857DBVsNEggkdJNAIKEGEhwIPYGEFmpCi8E2xg1X3HvvuOCGi2TZki3LRZK7LFmSZUsusoptDAbfm9wWMv+95BkYD1POnDnfXnufs9bv91mj8WjOLmvv/e29V/nSl0RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERESMkb/Jzc09kZOT09/NH6u/u1b9/VH18muJPpOXl/eUQp3CQdelPPOsy9V3bFPP26B+7ujYseNFmXxfKlHPWaJwSj33LS+/V33fbep7dymUUH2ysrJ+mKoNRUREREREREQ8k+zs7C5EAMME5MvJPqs+M0Nheuz755133v+O/l2RmkMKj8a891imBFD9/Xr1/B70WpGoWxVxysvk+2K+m8p3KPZ9ImleE0BqB/Wdj4S//2Fqv9g2FBERERERERGBiSIgixVuUfgrkaoUn41LAGMFSAAPxn6vV6Lq9Zt45UMQQGprhRu8/E4REREREREREUfSoUOHc+iak16rn2UK8xN9Vv1fP0WQ2hRa6SROYY4iRtnq/XIiNFlZWeeHP7dS4c8KteHPvUrvxyOA6u9fVp+rIJKlsEb9fnGCx38t/JnPvlc978rwd9yvft8Svk7drH6/L+Zv/l3hTfV/C9XPygQk7166oqbvD5d5/be+9a3/E/4/+o6RCtPC188VkbqG5W/o+jzcDlSGZer38+JVIjs7+1/C3/cpXQGHn3V9bBuG6/W4eq9aoZSerbAo3P5jw3X+7Eq9U6dO34z9DvV/4+jz6r13FUaHv+cv9P/nnnvu19Xr8eE+p+v02R07dvxfifpeRERERERExEeiiMRLCj8LvybC8WdFEP5nos/HOwFU5OMCIjTR5MXJCaB63vPq98MR4hEmYa3q9/8v0fNjv1cRqtvV330Sebb62470e/RJJv0NkZ8vhe3riPgk+O64J5RhUld13nnn/X3490IiVFH//47CVvXyb8Pf86r6fXeiOoT/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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": 19,
"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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9CXhUVfL/reM2Mo4z46Azg4pAwqKioiiCgCKCgqIiKoIKioILCCqKCLImQFgDhH3f9z0sYSdAgLDvOyQBkoCIy/h/5/c8//f5vdNvf8/tE5pLJ+nl3lvn3Fv1PB+F0Omue06dutX3nKq64QYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWG6VChQqflCtXrlZRr4mPj+9cvnz5Jn4S/X++zyndWFhYWFhYWFhYrJVb/cFcO38AuNsf2D1b2Iv8r6nhf80E/Nn//3v9r13knIosLCwsLCwsLCyWiz+gm1JUAOgP+rr6g8DWQa+/4IxmLCwsLCwsLCwstkhxAaD/31L8NA/6+/m77777Dme0Y2Exy9e33/Cv7rVvuLd70xtK9Wh1wz1d/0GtEQtLDPKHG+7r/rSfDjfc16PhDaW+KUmtEAtL9OL3z/f2eCXgn9+5oeR3pag1YilCwngCOCo+Pr5p0N/zS5UqVSKc9/7vf//rY2GxSpakHfPd99QQ3w339Szg1nIJvhZfLvKdyf6ZWj0WlrAFvnHElEzfvU8OvsaewTufz/f9+tv/UKvIwhK2/O///n++yXP3Xeefb4tL8H3Zc5Xv0uX/Q62iI2JFTOaohLkF/FHQ3/PCfW8MyJUrv/t++olhIgN2I+0nP/9XX+OPZhc4lSovjvY1bzff98bHs323lk0QP/t75f6+jRlnyPVm6Am2HWpdQpHnt+cWHRYW2HOl51J8rb9d6qvffJrvz5X6ip/d77+Rpm04Qa6r11DddlQkN+8XX92mUwrs+alXxvne+2KB79UPZ/luLtNb/Ozuxwb4duzOIdfVTmAzscZjjos5APQHe3HB/+4P+KrhKSD+XK5cOf9Ly6eG+95YSBiYy5cZJjJgN5DLl/8tnIkM8kZNyfT9+OO/C1539MQl32utZol//8uD/Xyr1p8g151Rw3ZU9D35+b/5nn/buFki2Ju75OA1/37oaL6v9huTxL//qUIf39bMbHKdvYTKtqMisOdXWs4U9oqn2bMWHbjGP+/ad95Xr9lU8e//fHyQb+fe8+Q62wVsxrrIzAHxB3uf+wO6I36m+v9cx/+jG/1/PuP/852m1/XzB4HN/PSPi4uLD/f9eSEx0SId8ff91grncWelfr4tO7JCvvbixd98zdvOF68r+Uh/3+mzl8n1Z+hQ+SbesXeasNP7/DfLwoI72HPLLxeJ15V7Zhjbs4OobDsq8n5740n2PVUG+jL3nAv5mty8X30vvTutwO5PnPqRXG870C4AtFt4ITHRArtZv/WscBq3lOntW7LqaJGvv3Tp3776zQwn8+l3y8j1Z+hQ9Sa+eOUR3433G/a8Lv10ka/N8980q786Xtgz7Br2Ta2/F1DVdlRkadrRgp2X9G1ni3zthdxfCp5sN/1sHrnudsABoEl4ITHRgnNSFZ9LEQ4jacTmsH4H30BxJhDnTjJ468yzqHgTP3Xmsu8fVQYKe04cuims3zly/KLvX08MEr+Dow/U1+AFVLQdFcE27+MvjRG22S8lPazfOXgkr+CM69ylh8ivwWo4ADQJLyQmWroNWFeQ8IEtsXB/r323FeL3cM4q+CwK4x1UvIm367pc2OUL70yNyC6nztsrfg+BYPa5n8mvw+2oaDsqMmHmbmGXZaoPFVu84f7e4DEZBUlOWTlXyK/DSjgANAkvJCYa9h3M9ZWITxTbZWvTT0X0u1nZV8R5FDiZmQv3k18L4zyq3cQPHM7z/TEu0XfTA71823flRPS7CBZrNp4o7LlT4mrya3E7qtmOiiDgQ+AHm0QgGMnv4iiDtOeuSevIr8VKOAA0CS8kJho+6rhEOIg23y2Lyn5SJu0Qv1+2xlBx9oT6ehhnUe0mLg/Kt/D/P5rf37D1jPgyhC9F2Eajvh43o5rtqAi2fGHP2AKOZpdl9caTBU+18yJ4eqg6HACahBcSEyl4gndHxb7ihpd17peo7AffMp9oYJxP6T5wPfk1Mc6i0k18285s3x9K9xJPAGMJ3mSWe4fuK8mvyc2oZDsqcubsT6IcF2wRSSDRvk/VhmPFe4ybsYv8mqyCA0CT8EJiImXAqC3CMbz47rSYHDHqAcpaaoePXSS/LsY5VLqJf/j1YmGHbbssj+l9Nm/PMsocPTogojNXTGSoZDsq8lWPVcIOUdYllvdB4If3qdpgLPk1WQUHgCbhhcREArYTHqwzQjiGOUsOxuyI3/pkrnivb3qnkV8b4xyq3MTPnf9Z1K/E0+y9B3Jjfj90WIA9T5qzh3yM3YoqtqMieIJ9e3yieKIda4FybP3KDPe0DSfJr80KOAA0CS8kJhKWpR0TDuGB6skiGIzVfpBAgvcr/XQyZwR7CFVu4mOm7RT29+ybkyx5P3m2tc5bk8nH2K2oYjsq8mX3lcL+0JnJivf7ob9R6aFJ6znk12YFHACahBcSEwmy32/PwRssccQI+irUHi7eM3X1MfLrY5xBlZt47SZG4dux03da8n4554wninjP3fsvkI+zG1HFdlQD56pRugW2h57rVrwnOoLgbCzqtrohuYkDQJPwQmLC5fDRfOEI4BDgGKxyxLKe4PtRZmAy+qHCTXzPgQsFXRKwFWzV+7b+dql4X5zFoh5nN6KC7ahI6hpjd6bScymW7qbIDHk32DMHgCbhhcSES+e+a4QjaPb5fPF3qxwxarDhDBYq0Ft5I2bURYWb+LcJq4U9t/p6saXvi5Zbsveqm0poqIIKtqMiH3y12JbafTK56a7KSdr7Zw4ATcILiQmH/PzfCg4Er9lkFH620hHjDJbbSg4whUN9E8d2GZrew+aK6/kbDU++bJTQmDJ3L/lYuw1q21ERZJ3/7eEkYXN4sm31+8ujEsnjMsivNRY4ADQJLyQmHCbP2VtQWFT+zEpHPHJyZkEbLuprZeyH+ia+YPlhYW8PPT/SluSjlInbxfvXbTqFfKzdBrXtqMiMBfuFvVVrNM7W96/8wkjya40FDgBNwguJCQf5DRA3NvkzKx0xeqiWKN9HlC/gmoDuh/omjqxG2HOfYem2vL9MBsHRBjueyHgZattREZmchxqtdrw/npjL9p279p0nv95o4QDQJLyQmOI4euJSyDN6Vjvidz43Oin0Tt5Ifs2MvVDexE+duey7rVyC75YyvX3HT16y7XNku8Sve+p/eF4lOAC8FnRmQu2/m2225xaBZJDEoZvIrzlaOAA0CS8kpjhkbbPXW8265udWO+JFK44UbMtRXzNjL5Q38f4jjU42r344y9bPQSkOfM69Tw7mGpcWwgHgtYyYbPjn+s1i6/xRHLMWHRCfU6vxRPJrjhYOAE3CC4kpDtwosfBHTcm85udWO2JsM9wbOJhvVR0rRk0ob+JVXhxd0MnG7s+KqzlMfBYyg6nH3C1wAHgtz789xdJaloWB3Z8S8Ym+mx7o5Tt5+kfy644GDgBNwguJKQpkl91Rsa84m2feXrDDEcs+lp99n0p+7Yx9UN3EUcwW9vX3yv19Fy/+ZvvnffrdMvF53QauJx9zt8AB4FWOHL8ofDPOT+Mctd2f93KLGcKeR0+1N9i0Cw4ATcILiSkKmS0ZKrvMDke8fVeO+DyUnOFtM/dCdRMfNn6bsK8328x15PPmpx4Sn1f91fHkY+4WOAC8St/h6cK+0FPdic+Tx4Fea2Xv8Qm74ADQJLyQmKJo02lpoU8w7HLEcttsy44s8utn7IHqJo4bl5NPMC7k/iKezmDbDMkn1OPuBjgAvErVBka9ybkOHGcA2AXCE8c/VegjbJv6+iOFA0CT8EJiCgNP4Eo/nVxoMGaXI/74GyN7MiFZ32wzpmgobuIoZo62b8hoP2ZjtqSZBu9PF/Y8YeZu8nF3AxwAGsCGZStD2LZTn4un2SLoXHqIfAwihQNAk/BCYgojIzNbLHQEgaG2Y+1yxDMXGkVHcbiZegwYe6C4ia9Yd1zYFZJAnLzWwWMyxOe+E2ihyMQGB4AG6JoEu2r0wUxHP7fn4A3icz+0uIWiE3AAaBJeSExhdB+4Xix0NLcP9e92OeKsnCuiRtsf4xJ95y/ot83AFA/FTbxjrzRhz/i/k9e6/1Cu+NySjw4Qme7UY687HAAavNtugbCrgaO3Ovq5mXvOaXtOmwNAk/BCYgpDPuqft+xQyH+30xE/8/oE8dlIQqEeB8Z6KG7isvzL8rXHHb/eB+uMuKaPNhM9HAAax3Nkyayde53vzFGh9nDb+mjbCQeAJvH6QmJCgzpPxR32tdMR/9B/nXAwbbssJx8Lxnqcvomjmw3FeSlJh+4rxed3SlxNPva6wwHg774du3MKjudQfH77bivE53/T29mn6bHCAaBJvL6QmNAgSxIL/JWWhZ8vsdMR45sldwVxL07fxKU9U5WvSF19THz+Ew3GkI+97nAAeLWbDdqzUXz+ynUnxOc/XFcv/8wBoEm8vpCY0LzxsdFcfPiE7YW+xk5HjLNSKNYLHQ4fzScfD8ZanL6Jo+4fbAl1ACmuF08d76xkZCDjaST1+OsMB4C/+xoGCjJPnEWTWY4i6jjTCh32HsglH49w4QDQJF5fSMz15OX9WlAuA5XmC3ud3Y64Ses5wsGg1yX1mDDW4uRNPPjLBDqBUF3z64EahCMnZ5Lp4Aa8HgAGf5k4cYquJZtMQhnkcBJKLHAAaBIvLyQmNEtWHRULG0VGi3qd3Y44ZeJ2R7s2MM7h5E18bfopJY4T4IsM9Gj80Wzy8dcZrweAq9Yb26+P1Xe2nJEZeayiSZs55GMSLhwAmsTLC4kJjSyXUdyBdbsdsezbWvKR/lw+w2U4eRP/vt9aYUdf/LCC9JqpE1HcgtcDwM591wg7QiIGpR6yvJFO5WA4ADSJlxcSExpZggVPAot6nROOWJbP2LBFr3IDTNE4eRN/6pVxwoYWrzxCft2PvzRG6JK65hi5Lrri9QCwxmuGf16oQIms0tWGCF12779Arks4cABoEi8vJOZ6UPIFBZhRiDnn3M9FvtYJR/zZ96mF9iJm9MWpmzj678pyRrl5v5Jf99c9Vwl77tJvLbkuuuLlAFC1IvlNP5sn7Dllkh7ntDkANIlXFxITGpneX7Vh0ef/gBOOGP0moU+txhPJx4axDqdu4pNm7xH2g3681NcM5i45KPSp25TbHEaLlwPA2YsPCPt57q3J5LqAoeO3CX2QEEKtSzhwAGgSry4kJjSy/Vu7rsUXYHbCEZ87/7PvtnIJ4ltvdjFPJBl9cOomjjaGsOe+w9PJrxmcOfuTyN5EFidKaVDroyNeDgA//W6ZsOcegzaQ6wJkW7iyNYaS6xIOHACaxKsLiQnNi82niQU9Y8H+Yl/rlCPGt13ohG+/1OPDWINTtoNMSdVaViEbGTptyjhLrouOeDkAVO1MNJI/7qkyUOh0SIN6rRwAmsSrC4m5HmTa/vWhJLGYw6kv5ZQj7ppktIX7qscq8jFirMEJ28ET45se6OUrEZ8oaltSX7Pkw68XC3seMGoLuS464tUAEAXxVayKIOtbjp+xi1yX4uAA0CReXEhMaDZvzxILudJzKWG93ilHjOxNPgfoLpywHVnPsqZidjNmmn7101TCqwGgrLunWh3JpBGbhV6t/F9sqHUpDg4ATeLFhcSEBk8ksJA/+Cq8heyUI0bmGzI5S5Tvw/XTXIITttMlUP8PmbfU1xsMWmdBr/ufGkKui454NQBs08k4z4qAi1qXYHCUAXphe5pal+LgANAkXlxITGjwRAILGd80w3m9k474kXqjjLMvW8+QjxMTO07YTr1mU5U8O4pzU6WqDhK6HThM15pOV7waAMp6lmkbTpLrEgy2o1HcPNyjQ5RwAGgSLy4kJjT3PjlYLOJ9B8Nr7u2kI27F56Zchd22E3ye9eRp9W5K2MbT5dyUangxAMTOx+3xib6by/QWlRGo9THz0rtG8uC0+fvIdSkKDgBN4rWFxIRGbkvd5w8Cw/0dJx3xqCmZQr+3PuG+wG7AbtvZmpkt7KXisynk1xqKpBTj3NTH3ywh10U3vBgApm8ztlkrv0Dbz7oweg7eIPT7vEsquS5FwQGgSby2kJjQRNPY20lHvHPveaFfmep61JtiisZu20kelyHs5f32C8mvNRQo4wH9cLSBWhfd8GIAOHzCdqXtefXGk0I/tDqk1qUoOAA0idcWEhOall8uEgt44OitYf+Ok44Y56ZQ/gA6Hj1xiXy8mNiw23aat50vbAU3TuprDQW29O6o2FckN2VlXyHXRye8GADKIzCDIvDPToIyS0jSQ9klle2ZA0CTeG0hMaFB6Rc4mC07ssL+HacdMdp5QcfpC9Q+Z8IUj922E1dzmLCVHbtzyK+1MGSB8/mph8h10QkvBoB4sqZaQXMz0p7nLTtErkthcABoEq8tJOZ6kLmFhYtD85EUGHXaEXcLtKlr320F+ZgxsWGn7Rw/eUnYyV2Vk8STY+prLYxOiauFnt/0TiPXRSe8FgDm5v3qu7VsguBC7i/k+hTG94qWXQqGA0CTeGkhMaHBEzUsXGRyRfJ7TjviZWnHhJ41XptAPmZMbNhpO2hjGI09O83C5YeFnrWbTCLXRSe8FgCu32ycF63y4mhyXYpC+ufqr44n16UwOAA0iZcWEhOadl2XR9Vg3GlHnHPuZ1EG4XbFWnsxkWOn7eAJMewZT4ypr7MoUOBctKrjAucR4bUAcPAYI6HpQ8U7baA8jWy9qKo9cwBoEi8tJCY0VRuOFQ5m5boTEf0ehSPGt2DVz8IwxWOn7eAJBGwkdfUx8ussjsfqsz1HitcCwBbtFwobGTZ+G7kuxfFw3ZFCV5StodYlFBwAmsRLC4m5nuDzJbkRPlWjcMStvw20Q0pRqx0SExl22Q5s+I9xib5bFC2Ya0a29+ozLJ1cF13wWgAouyCh5Rq1LsXxfiBYVTX7ngNAk3hpITHXI+uRRXO+hMIRj50eqFfYOvx6hYx62GU7aJMF+6jaYCz5NYbDxFm7hb6vtZpFrosueCkAPH/hF3HsBV9qVN1WDQZlamDPrRTdruYA0CReWUhMaGTB3A++inzBUjjiPQcuCH1LVxtCPnZM9NhlOwnJm4R9fNo5lfwaw+HgkTyhL3oDU+uiC14KAGWB5Sdf1uMLDY4yQN8nGqhZEJoDQJN4ZSExoZEFoBEIRvq7FI4YZT3uqTJQ6Hz42EXy8WOiwy7befXDWcI2Js3eQ36N4SLt+dhJLnAeDl4KAPuP3CJsA0dfqHUJB5SpwXGi28pFfqTICTgANIlXFhITGplUga3gSH+XyhG/0nKm0HnK3L3k48dEh122868nBgnbOHQ0n/waw6Ves6lC57lLD5HrogNeCgBlR5sRk3eQ6xIusdxT7IYDQJN4ZSEx1yMTQKL9tkbliGXj8bZdlpOPIRMddtjOkeMXhV3883G9tlM79k4TendNWkeuiw54KQB8sM4IYRtbM7PJdQkXHCeCzkPGRr6rZDccAJrEKwuJuR5ZYDTaBt5Ujnj52uNC72qNxpGPIRMddtjO3CUHhV282FztAtBmps7bK/TGk21qXXTAKwFg9rmfRa9o1Im8eFH9BBAJytXAnlG+hloXMxwAmsQLC4kJDb6hRZsAAqgccUHBUc0cI3MVO2wHT9Bgzx01a622/1AuJzZFgFcCQPlFV+XOGqFAuRrojfI11LqY4QDQJF5YSExoWnQwEkCGRllglNIRV3ouRei+fVcO+TgykWOH7TT6wDgbiidq1NcXCUhsKvlIf6E7+nJT66M6XgkAURtSp4x2CcrVoGwNytegjA21PsFwAGgSLywkJjSyC8GGrWei+n1KR/zWJ3OF7uNm7CIfRyZy7LCdB6onC5vYdzCX/Poi5fm3pwjdFyw/TK6L6nglAJQ+DrVPqXWJFJStge4oY0OtSzAcAJrECwuJuR6k66NbAhJAou2rS+mIeydvFA4GfYypx5KJHKtt59SZy8Ie7qqcJJ6oUV9fpHzVY5UW/YtVwCsBYPlaw4VNZO45R65LpMiOTShjQ61LMBwAmsQLC4m5HisKdlI64sUrjwj9n31zEvlYMpFjte1Ie3jurcnk1xYNk+bs4Y4gYeKFAPBs1k++G+/v6buzUj/fpUv6faFB2RrYM8rYUOsSDAeAJnH7QmJCM3iMkQDyYQwteygd8emzej/x8TpW206vIcYT4fbdVpBfWzTIDjdlqg8l10V1vBAALk07Kuyh9ht6fsHNyMwW+qOMDbUuwXAAaBK3LyQmNC0CTbuHRZkAAqgdcemnjTNfyKKkHk8mMqy2nSZt5ghbmDBzN/m1RQO+xPzt4SRxDfhyQ62PylD7HSeQX2i++EHPLzSozvCnCn1EGRuUs6HWR8IBoEncvpCY0Dxab5RwMBszoksAAdSOWHYEmb5gH/l4MpFhte3ofF5KguMMuIZFK46Q66Iy1H7HCd74eLawhYmz9PxCA2q8NkFcA8rZUOsi4QDQJG5fSMz1WJEAAqgd8ff91goH823CavIxZSLDStvJyrkizkv9uVJfLc9LSbB9DXtGpxtqXVSG2u84QdkaQ4Ut7N5/gVyXaPns+1RxDShnQ62LhANAk7h9ITHXszb9lFiYVRuMjel9qB3xrEUHxHU0eG86+ZgykWGl7ciCuXjiQH1dsYDta1wHnv5Q66Iy1H7HbmRGO44E6Hy+GeVrcB0oZ0Oti4QDQJO4eSExoRk0eqtYmK1iSAAB1I748NF8cR33PjmYfEyZyLDSdvqlBArmfreM/LpiYefe8+I64moOI9dFZaj9jt2gFiTsoI6mGe0SHMfAdeB4BrUuEg4ATeLmhcSExooEEKCCI777sQHiWo6fvEQ+rkz4WGk7KDUBGxg5OZP8umIBT3tQ9gPXgjIg1Pqoigp+x066DTBaGqI2JLUusSDtGcczVLFnDgBN4uaFxITmkUACCHo2xvI+Kjjiuk2NDgrzUw+RjysTPlbazsN1Rwob2LIji/y6YqVW44niWlAGhFoXVVHB79iJbGk4Za5eLQ1DUbuJkdi0ZJUa9swBoEncvJCY65EJIOjViJ6NsbyXCo74y+4rhYPpzh0UtMIq20GvUfQcvT0+dntWgbZdlgt7TkjeRK6Lqqjgd+zk/qeGCBs4cDiPXJdY+byLkQiCYxrUugAOAE3i5oXEXE9BAkjD2BJAgAqOGGUS+OC8flhlO1baswqgtzWu58026hycVw0V/I5dHDt5Scw/jrbonAAiSZm4XVxPiw6LyHUBHACaxK0LiQnNkLEZliSAABUcsTw4H1+LD87rhFW2IzvaWGHPKrBjd45yB+dVQwW/YxdzlxwU81+/2TRyXaxAfkF76pVx5LoADgBN4taFxISmTSejSffA0Vtjfi8VHDHqvqH+Gw4aox4c9fgy4WGV7bT8cpGw56ExJjSpAuz5jopsz0Whgt+xC7fVNkUXEFmjU4UnmhwAmsStC4kJjTyUm7r6WMzvpYojVrHiPFM0VtnO4y+NEXO/Yctp8muyCmnPqWtiX6NuRBW/YwcN3p8u5n7mwv3kulgF+lur0rKTA0CTuHUhMaGRZVNOnv4x5vdSxRF/0mmZuKaklM3k48uEhxW2gy426GaDpKbcGDraqIZ8Sj9g1BZyXVREFb9jB/96YpCYe9Q4pdbFKmRQO2fJQXJdOAA0iVsXEnM9xwMHjP/5+CBL3k8VR5wyaYe4rnfbLSAfYyY8rLAdlDHCvKOsEfX1WIk81/hRxyXkuqiIKn7HamRhewSB1LpYydc9V4nr6jGIvsUhB4AmceNCYkKD2mJYiM9ZVGFeFUecvs2dgYCbscJ2Rkx2Z+AvW9vVbDyRXBcVUcXvWM2MBfuN1pbvu6u1pcxsb/rZPHJdOAA0iRsXEhOapBGbjZZZnVMteT9VHLFbtwLdjBW288UPK4Q9Jw51V82802eNXrAlH+lProuKqOJ3rOab3mli3pEIQq2LlWzeniWu61EFvqBzAGgSNy4kJjQffr3Y0oxJlRxxlRdHuy4ZwM1YYTsoleHWLjA4poFrO3qCWxyaUcnvWEm9ZlPFnM9V4KycleBL+c2B5gMXL9IWa+cA0CRuXEhMaKq/Ol44mLQNJy15P5Uc8XtfLBDXhm1Bal2Y4rHCdkpXMzomHDyif8cEM3XemiyubfHKI+S6qIZKfscqUCKl5KPu7Wte6bkUcW2Ze86R6sEBoEnctpCY0MDB/O3hJLEIs7KtqS+mkiNG6yxcW/tuK8h1YYonVttBjTzMN5rNq1BfzGpwTIMz20Ojkt+xCpRIwXzjSw21LnbQ+KPZSvQ35gDQJG5bSExoZIYZ+kxa9Z4qOeJ5yw6J63uxuTsq6LudWG1nzSa1OgxYDY5p4Po++ModHU6sRCW/YxVT5+0V893og5nkutiBLHDdue8aUj04ADSJ2xYSExqck8ICxDkTq95TJUeMxum4vgeqJ5PrwhRPrLYjS/+0aL+Q/FrsYNX6E+L6cGyDWhfVUMnvWIUqAZJdyAD39VazSPXgADBYSnWrOGTcNt+lS7QHMxn7QaYkFiAyJ616T5UcMbYBZUu4nHM/k+vDFE2sttOu63Jhz32GpZNfix2czfpJXB+ObbhxizsWVPI7VtGk9Rwx35Pm7CHXxQ5w9g/XV/HZFFI9OAAMllI9xmNSZi0+QG4gjL3IJImRkzMte0/VHHHVhmPFNa7fzJnAqhOr7ciMSTdmAEvufXKw0RXi2EVyXVRCNb9jBQ/XHSnmOiMzm1wXO0D2L7KAbyYu1cUBYLDc2yPBqNC9ntxAGHuxIzhSzRHbEeQy9hCr7eAsK+b6kItaZpl54R0jyF2w/DC5Liqhmt+JFQRHqGOK4CjPxTamD4sAACAASURBVHVMUQcQ9oy6gFQ6cAAYLKW6v4sJad5uPrlxMPaBLaQ7Khrbo+fOW7c9qpoj7p28UTiYDt1XkuvCFE0stiMzgP/yoDszgCVtu7h7mztaVPM7saLK9qjdoBMIrhOdQah04AAwWEp1fUJk0r08ltw4GPvYd9AoMVC2xlBL31c1Rzx3qZHo0uA9d7VSciOx2I7MAK7WyJ0ZwJKUidtdnegSLar5nViZvmCfmOfXiBMk7Aa9gHGd6A1MpYN2AWB8fHzn8uXLN/GT6P/zfYW9rkKFCo/5/3fT3XfffUdcXFx8WG9+d9s7MCF/fYgPGruZ2YsPiIXXsMUMS99XNUcsa2mVqW5toMtYTyy2UxAYdVhEfh124vZSN9Gimt+JlR/6rxPz/G3CanJd7GTOkoPkvY61CgD9AV8Nf2A3AX/2//9efxC4qLDX+v9tv/81V/wsKVWqVMlwP+P+QDV9bjnkXroPXG/LNy/VHLFdW92M9cRiO17ZGnV7setoUc3vxMpbn8wV8zxh5m5yXexEhS/oWgWA/mCuqz8IbC3/7g/yLhTx2pbRfEb95kY/zWVpx8gNhLEHu85eqOiIqzYYyz2BNSAW2/FScoSb291Fi4p+JxZUSI5wguBSXdlEpbq0CgD9AV+Kn+ZBfz+PLd5Qr/UHgP3j4uIa+v/fpUyZMpXC/Yz23VcK4xs8JoPcQBh7kA4mfdtZS99XRUfcvO18ca2jp+4k14UpnFhs5z5ZHsXFGcCS+s2ML+g430qtiyqo6Hei5dKlf/tuj0/03fRAL9+F3F/I9bEbHGeAPa9NP0Xy+VoFgP5gblR8fHzToL/nlypVqkQhL78R/ylZsuSf/YHijnA/Y5T/RokJ+axzqhgcxl2gyDccjCgxkP+rpe995YrhiPF/6uuU9B5iZAJ/2WMluS5M4URrO9mBbVGcW758+d/k12E36G2N601I3kiuiyqo6HeiZc+BC2J+42sNI9fFCVp+uUhcb8qk7SSfD5uJMSxzTgJbwB8F/T0v1Ovi4uIa+/9tSOCvf/AHgP8J9zM2ZJwtSBBgcZ+czjJumA8+P4JaFUdk1Ubj4PzrH82mVoXFBtm5z7hh1nxjIrUqjsj0hUYC10ffLKVWhcUGWbH+pJjfN1rPoVbFEUmZnCmu95uE1WQ6xBiWOSf+oK4angLiz+XKlfPHdeVT8Wd/UBgX/Dp/AFjX/+9P4c9ly5at6H/d2nA/I+/iv40eqk8nk387YKxn+vyrJQasfm8Vv4nLg8YoeUOtC1M40drO8EAGMJ4kUF+DE6zfclpcLwq5U+uiCir6nWjpOThQGqXXKnJdnGDJqiPiep9vOoXk87V6AgjxB3v9/EFgs8AZP5R3udEf4J3x//xO0+ta42mh/98SIskC/u9//8uZky6mS6DJ+Hd9rG8yjgUFwf+pr1OCg8Z/qtDH94fSvdieFSZa2/m8S6qw577D3Z0BLEFfa/hm+GjOBDZQ0e9ES7PPjTPLY6d748zysZOXxPX+64lBJJ8Pm7E8SNNZsJAef2mMmJRNGdYmCTD02NlkXFVH/EQDw543Zpwh14UJTbS2IzOAF3ogA1iCshm4ZhR0p9ZFBVT1O9HgRV9V8tEB4ppPnbns+GdzAGgSLKSmn87zRB0iL/JgnRFibrfvyrH8vVV1xPJb9Zhp3vhWrSPR2k5BBvCxi+TX4BTobINrRkF3al1UQFW/Eyle3a2o/cYkYc+pa5wvPccBoEmwkLoGKpHbsU3I0IHG4reU6e27tWyCLz//N8vfX1VHXHCuhrDlEFM00dhOVvbVDGAvbYd+1WOVuG600qLWRQVU9TuRYleLTtVp02mpuO6Bo7c6/tkcAJoEC2nK3L1iQrBdSG0cjHVkZGaLeX247khb3l9VR2xX6zvGOqKxnbQNRsbk043Gk+vvJHiSjet+5/P55LqogKp+J1LmytZoHutdPmRshpHZ3nGJ45/NAaBJsJBkoFD5BXsCBYaGibN2G4F9G3sCe1UdsaytFVdzGLkuTGiisZ1h47cVZABT6+8kOB+G667y4mhyXVRAVb8TKb2TjZqlHbqvJNfFSVauOyGu+5nXJzj+2RwAmgQLCQWCUYkcBYNRmZzaQBhrQHNxLDQ0G7fj/VV1xLDhEuWNszXnL7i/ur6ORGM7MgO4X4o3MoAlsGHYcgn2zwJV/U6kvPfFAmHPIydnkuviJGezfhLXfVdl549ycABoErmQ8LQEk7L3AGeauYVGH8wUczp9wT5b3l9lR4ynJZzZri7R2E7dplPEnC5acYRcf6eR/nn3/gvkulCjst+JhCdfNvqWr9/svb7lVMlcHACaRC4kmWnGPSfdQ/law8Wc7tp33pb3V9kRv+Ox+lq6EY3t3OvBDGDJyy1miGufsWA/uS7UqOx3wgVPvu6s1E/UeEStR2p9nKZeM6Oc0wKHyzlxAGgSuZC++MHoOdlnmLe2V9wKto2wrW/ntpHKjrj7wPXCnjv2SiPXhbmeSG1Hbhv97WFvZQBLOvZOE9ffbYA9xzl0QmW/Ey6HjuaL+Sz9dDK5LhTIeCNx6CZHP5cDQJPIhTR8gtFi6YOvFpMbBxM7ThwcV9kRz1pkZAK/0nImuS7M9URqO6vWGwfHq7/qrQxgyfgZu8T1v/XJXHJdqFHZ74QLnnxhPus3m0auCwUjJu8Q149zkE5+LgeAJpELSWbm1Gw8kdw4mNiRpSOa2Vg6QmVHjLNSuP74WpwJrCKR2o7MAPbqF9TN27PE9T9SbxS5LtSo7HfCBa0MMZ/tui4n14UCnHsUPa4bjHX0czkANIlcSCdP/ygm5J4qA8mNg4mdL7uvFPOJosh2fYbKjlhkAscnim3wC7mcCawakdrOZ98bGcBJKZvJdacgN+9X381levv+GJfou3jR+qLuOqGy3wmXFh0WCXtOmbidXBcK0PkE5x/RCcXJzHYOAE0SvJBkj77TZ53v0cdYS0FSz5KDtn2G6o74sfpGJnD6Ns4EVo1Ibef5t72bASypUNtI6srcc45cF0pU9zvhgGLmmMvVG0+S60JFuWeMzHbUbXXqMzkANEnwQqrx2gQxIai4T20cTGw8UD1ZzOX+Q/aV9VHdETf9zOhxjfNT1Low1xKp7ZSqOkjM5ZHj3ssAlrz64SwxBtPm21PWSRdU9zvFgSQmtDPEXKK9IbU+VMjM9pkLncts5wDQJMELqeCx9KQd5MbBRE/2OePx+p8r9bU1Y1J1R9xNZgL35kxg1YjEds6cpSscqxKdEo3C7l36rSXXhRLV/U5x4EsM5hG18Kh1oYQis50DQJMEL6SE5E2ebE3jNtamnxLziEKjdn6O6o4Y3ywxDiiITa0Lcy2R2I7MAMYOBbXelEyavYd7tl9W3+8Ux+KVR8Q8orA5tS6UTJhptCp9s41zme0cAJokeCHNCTSnbthiBrlxMNGDg8WYxxbtF9r6Oao7YhTAxjigIDa1Lsy1RGI7Qz2eASyRPdsfet7bPdtV9zvFkTRis5hHJDZR60LJ1oA9P1zXOXvmANAkwQtJls7gG6betO2y3JGi3qo7YmSX3R7IBEYWJbU+zFUisZ1PO3s7A1iS57fhW8r09t1aNsGXn+/dTGDV/U5xtPp6sbBnfLGh1oUSCnvmANAkwQsJ5QVQZgDlBvL4hqktsmfqQpvb7OjgiB+tN0qMxZYdWeS6MFeJxHbqvDVZzCG2zqj1pubBOiPEWGzflUOuCxU6+J2iQK1dzCFq71LrQo205207sx35PA4ATWJeSNhe8LqD0R3ZM9XujEkdHDE6J2AscN6EWhfmKpHYzr+eMDKAj564RK43NY0/mi3GYvKcveS6UKGD3ykKLrd2FZxnxVjgfKsTn8cBoEnMC+n1VlxqQGeczJjUwREjwwzj8W3CanJdmKuEazvSnv9euT+5zirQue8aMR7f9VlDrgsVOvidwjh+8pKYv38+PohcFxXomuSsf+YA0CTmhfSNTM0euJ7cOJjIkS39nnnd/oxJHRzx9AX7xHighhq1LsxVwrUdac9ezwCWTJm7V4wHvqhT60KFDn6nMJalHRPz9+ybk8h1UQHpn52q1MABoEnMC2nsdPt7yDL2MWRshpg/HDS2+7N0cMQ79xqZwBWfTSHXhblKuLaTPM6w5w8dsGcd2LE7R4xHpedSyHWhQge/UxgDR28V8/dJp2XkuqiA05UaOAA0iXkhbdgSaNLc0NkmzYw1wLFg/gaM2mL7Z+ngiIMTmzgTWB3CtZ1PvzPsGaUzqHVWAdjzbeUSRPakVxP1dPA7hdH626XCngePySDXRQWCe7afv2B/z3YOAE1iXkjoIgED/cuD/TxddV9XajeZJOYPWw12f5YujviRQCYw6k5R68IYhGs7zwUygJesOkqusyqgbpqX7VkXvxMK6Z9T19jvn3Xh8ZfGiDHZsPWM7Z/FAaBJQi2k+xzKImWs5+7HjAyzE6d+tP2zdHHEqDSPMZk4izOBVSFc25EZwMdOcgawpEmbOZ62Z138Tij+UWWgY/5ZF2TPdhw/s/uzOAA0SaiFJOtuLU3jb906ITPM7vE7GSc+TxdH/EN/I9MMvVSpdWEMwrEdlMngDODrkZmT33i0x7UufsfMqTOGPeNLOrUuKuFkJjAHgCYJtZDadDLOKQwavZXcOJjwQcDuZIaZLo4YJY28njmpGuHYzop1xx3LaNcJpzMnVUMXv2NG2nOtxhPJdVGJSXOMHtdvfDzb9s/iANAkoRYSEggwITiATW0cTPgMCmSY4aCxE5+niyPO3HPO85mTqhGO7TiZ0a4TMrPdqy07dfE7ZmRG+0cdl5DrohKbt2eJccFZbbs/iwNAk4RaSGi5hAlBSzFq42DCp6BnqkMZk7o4Ys6cVI9wbEdmtPcfaX9Gu04E97i+kGt/5qRq6OJ3zEj/zPZ8Lcj+/UPpXr4S5fs40ryAOuZSSkItpMNH84Whlq42hNw4mPCp12yqmLcFNvcAlujkiGXmZIZHMydVIxzb4QzgwpE9rtO3nSXXxWl08jvB8Nn6wnmgerIYm4NH8mz9HA4ATRJqISEK/3Olvr4b7+/pyzn3M7lxMOFRpvpQsYj2H8p15PN0csQycxLnTah1YcKzHbTL4gzg0Mge117MBNbJ7wRTqirbc2G88I7x8GLRiiO2fg4HgCYpbCE90cCozbMxw/7aPEzsYCtIPEaPTxRbRE58pk6OuEu/tZ7voaoSxdmOzAAu+QhnAIfi+4A94//UujiNTn5HcjaLe1oXhSz4bncDAw4ATVLYQpK1ecbP2EVuHEzxoCgs5qvyCyMd+0ydHPHUeUYP1cYf2Z9pxhRPcbazfK2RMVmTMyZDMmHmbjE+eBJIrYvT6OR3JGkbTnJP6yJwqkUeB4AmKWwhce00vZBN4p0McHRyxLKH6oN1RpDrwhRvO0PHb+MewEWAnRmMD7ooUOviNDr5HcnwCdvFfH3wFdtzKJxKPOUA0CSFLSQZUDhRm4eJnW4D1zteHFYnR5yffzUTGH+m1sfrFGc77bouF/bcZ1g6ua4qkhNo2Ymz2l5r2amT35G07WLYc78UtudQHJKJp08n2/o5HACapLCFlEGwpchET/O288V8jZlmfzsdiW6O+KHnjUzgbTs5E5ia4mynwfvTxVzNXXKQXFdV8WrLTt38DpAVGhY6VKFBN/Al5k8V+ojEU5SFsetzOAA0SWELKTfvV1Fn6nYHkwqY6HnqlXHCwaxNP+XYZ+rmiLE9jjHCeUBqXbxOcbaDIseYq137zpPrqiro+IMxWpZ2jFwXJ9HN7wCUVMNcocQatS6q8lj90WKMUBjars/gANAkRS2kuJrDxITsPeBMWREmeu6qnCTmCtlmTn2mbo4Y2+MYo+4D15Pr4nWKsh1s0WOrHlv2KOJNrauqoKME7BkdU6h1cRLd/E52YLv+rw8leW67PhKcKNXFAaBJeBtGf06c+lHM0z+qDHT0c3VzxNgexzi9224BuS5epyjb4dZ94YHzZBinz7ukkuviJLr5nXXpp8U8VWs0jlwXlUGJLoxT16R1tn0GB4AmKWohte+2QkxI4tBN5MbBFI5sMu50yQzdHDG2xzFOTzcaT66L1ynKdmYtOiDm6eUWM8j1VJl5yw6JcXrp3WnkujiJbn5n1JRMMU/vfcFfPIsCJecwTihBZ9dncABokqIWUspEI3W95ZeLyI2DKRxZYsDpedLNEctirFxcmJ6ibCcheZOYpw7dV5LrqTJ7DlwQ44SjOtS6OIlufqdj4OhJj0EbyHVRmQ1bjdJGVRuMte0zOAA0SVELadX6E2JCnnmdi1eqDG6UmCfcOJ38XN0cMbinykAxVqfOXCbXxcsUZTv4IoM5whdQaj1VBsl5f4xL9N1cprcvL+9Xcn2cQje/83qrWcKepy/YR66Lysizkn95sJ9tZyU5ADRJUQsJN0lMyN2PDSA3DqZwsFWGeZq9+ICjn6ubIwb4MoOxQmV+al28TFG2g6MMmCMcbaDWU3VQ2BxjtX1XDrkuTqGb30EpNS4/FR73BkobHT1hT79kDgBNUtxCQvDHT0zUpuKzKWKOdu51tmSGbo4YtGi/UIzViMk7yHXxMkXZzj8fHyTmCMlN1HqqzqsfGk+XZizYT66LU+jkd/CUFv3ZUVIt10NPaaNFljZKXW1PaSMOAE1S3EKST0ywHUxtHMz1oEzGrWVpOlzo5IglvYZsFPb8dc9V5Lp4mcJsJyv7ipgflDWi1lEHvuqxSoxXz8HeOV+mk985cDhPzE/ZGkPJddEBWdooeZw9pY04ADRJcQuJz+OoDZ76YX4q1B7u+Gfr5IgleFKC8cKTE2pdvExhtiNLZjz5sn0Hwd0EnmRjvN5vv5BcF6fQye+g8wfmp34zb2VqR4ssbYTWeXa8PweAJiluIaEEDCYEJWGojYO5Hpz7w/w0JCiZoZMjluzYnSPGC23hqHXxMoXZztjpRq3GZp/PJ9dRB3CWFeNV/VXvlDbSye8MGLVFzM+nnVPJddEBu0sbcQBokuIWEopAY0JQFJraOJjrkSUzKAJ0nRyxBNmSyJrkFoe0FGY73yasFvbcbYB9xWDdhBcT9XTyO590WibmZ9DoreS66AC6jtlZ2ogDQJMUt5Bkran4Wt6qNaULcosetQCd/mydHHEw3OKQnsJs542PjX7Nk+dwv+ZwQV1LjNmZs861gaREJ7/zwjtTxdwsXnmEXBcdwJdyfDm3q7QRB4AmKW4hebXWlC7UIiyZoZMjDgbbCxiz+amHyHXxKoXZzqP1Rom52bLDvobwbgOdbTBmqzd6o7SRTn7ngerJYm4OHc0n10UXcDzHrtJGHACaJJyF9HBdrmOkKpQlM3RyxMGgdyrGLCllM7kuXiWU7aD4658q9PHdeH9P34XcX8h11AW0GIM9j5ycSa6LE+jid2DDfyjdS9i0XYWN3chrNhbO5gDQJOEspMYfGdsyU+fxtoxKUJfM0MURmxkyNkOMW+tvl5Lr4lVC2c7BI0bJjNJPJ5PrpxNoMeal0ka6+J2tmdliXvBUm1oXnejYy77WeRwAmiSchcQHs9WEumSGLo7YzNK0o2Lc6rw1mVwXrxLKdnBOCvNSt+kUcv10Ytr8fWLc8OSEWhcn0MXv4IEJ5gXnWql10YlRUzLFuOHJttXvzQGgScJZSONm7BIT8g6XZlCKMdNoS2bo4ojNHD520XjSVG0IuS5eJZTtDBy9VcxLm078ZDYScDTHS6WNdPE73QauF/OCByjUuujEmk2nxLjhbKvV780BoEnCWUgbtp4RE1K1ARdnVYlveqeRPpnVxRGbwXmcOyr2FWfNzp3/mVwfLxLKdj79ziiZ0X/kFnL9dAItxtBqzCuljXTxO++2M85m4os6tS46cTbrJzFuyG63+r05ADRJOAsp59zPYkLurNSPD7MqhDybOWUuzdlMXRxxKKq8OFqM3ebtnG1KQSjbqdfMKJmB7gnU+ulGuWe8U9pIF79TrdE4MSdr00+R66Ib91QZKMYOdS6tfF8OAE0S7kK6/6khYkKwfUZtHIzBI4GSGThsTPH5ujjiULzZZq4Yu0lz9pDr4kVC2U6Z6kPFnOw/5P4gxmpebO6d0ka6+B1ZnxFPtKh10Y1nXp8gxm7V+hOWvi8HgCYJdyE9//YUMSFLVh0lNw7G2MYsUb6PKDNAVTJDF0cciu/6rBH23DWJE5soMNuOLJlRwiPbmFbz2ffeKW2kg9+RHVrwJItaFx1p0cFocJAyaYel78sBoEnCXUiypc1AbmmjBAcOGyUz8NSESgcdHHFhjOfEJlLMtpMRKJlR+QVvJDJYzeAxRmmjj79ZQq6L3ejgd2SPZjzJotZFR3onbxTj92X3lZa+LweAJgl3IckMPQSC1MbB/C7OSWE+cG6KSgcdHHFhbNhilNCp2pATmygw244smfG6R0qZWI0sbfScB0ob6eB3RkzeIeajRfuF5LroyKxFB8T4vdJypqXvywGgScJdSNj6xYRgK5jaOJjfRaYk5gOZk1Q66OCICyMrxyii/beHaYpoex2z7ciSGR17p5HrpiOytBHOalPrYjc6+B0U5cZ89BqykVwXHcncc06MX6XnUix9Xw4ATRLuQvKSg9EB1Eqj3pLXwREXxb+eMNroHT95iVwXr2G2HVkyY/RULpkRDV4qbaSD33n1Q6Od2YwF+8l10ZH8/N98t5Tp7butXILv4sXfLHtfDgBNEu5CgoNBGRgYNcrCUBuI15FJOeieQKWDDo64KGq/MUmM4Yp1x8l18Rpm25ElM1AEllo3XZGljTZlnCXXxU508Dsoyo252LE7h1wXXalQe7gYw137zlv2nhwAmiSShYRC0JgQFIamNg6vgy4WmItDR/PJdNDBERfFh18vFmM4fMJ2cl28htl2/l6ZS2bEiixtNHHWbnJd7ER1v4MsdhTlvrlMb19e3q/k+uhKwxYzhD3PWXLQsvfkANAkkSwkZExiQtAajto4vMz5C7+IrZ4/VehDWphbdUdcHIlDNwl7bt9tBbkuXiPYdk6e/pFLZlhA575GaaMu/daS62InqvudfQdzxTzE1RxGrovOwC9jHOGnrXpPDgBNEslCQssx7m1ID7pXYB4eqz+aVA/VHXFx4JslxvFl/zdNal28RrDtoNgr5qHGa1wyIxZkaaO3P51HroudqO53FgQqNKA4N7UuOoOdGYzjB18ttuw9OQA0SSQLSZZqQAsyauPwMuhegXlo0mYOqR6qO+Li2Ln3vBjHis+mkOviNYJtB8VeuWRG7Mie7U80GEOui52o7neSRmwW8/B5l1RyXXQGZ7MxjrUaT7TsPTkANEkkC2nbTqNY68N1uVgrJehegXlANwtKPVR3xMWB7DJkmt1a1tpMM6Z4gm3nqx5cMsMKsj3Ss111vyMrNKA4N7UuOnPilHE05J+PD7LsPTkANEkkCwkHWnGw9Y9x3K6JkqafzVPiLKbqjjgc7Mg0Y4on2HYafTCTS2ZYxL1PDhZjeeS4e3u2q+53ZIUGFOem1kV37qqcJMYyK/uKJe/HAaBJIl1I8bWGiQnZc+ACuXF4lYJs7C2nSfVQ3RGHg8w0m2thphlTPMG282CdEVwywyJqNzFKG6WuPkaui12o7ndKP50s5uAwYYUGt/DUK0Z5qHXp1tzrOAA0SaQLqcH70/mGSQi2dv7yoFGPMZu4HqPqjjgcvvjByDTrMyydXBcvIW0H9oxir1wywxpaBUobJY9z7/ajyn5HVmhAUW43b8M7RfO2RuWRMdOsKRDPAaBJIl1IHbqvtDw1mwmfYycvifEvVdW6cxHRorIjDpdh47eJ8URNQGpdvIS0nb0HL3DJDAvpOzxdjGfbLsvJdbELlf3Olh1qVGhwC7JF5DcWtYjkANAkkS6kgoy9DovIjcOLpK45JsYfWz3UuqjsiMNl+drjyoynl5C2M2/ZITH+L73LJTOsYO5S94+nyn5n8hyjUkaT1rQVGtyC1ZVHOAA0SaQLKW3DSa7ZRcjQwBOrVgo8sVLZEYeLSk9UvYS0nX4p7n9i5SS79xtPVHFWm1oXu1DZ78hauZ0SuVauFWRkGpVHKr9gTeURDgBNEulCOn32spiQko8OIDcOL9Ku63Ix/tjqodZFZUccLjin89eHkpQ4U+klpO189M0SMfZDxrr3zJqToJyR289Uqux3mgW6ZY2dbs2ZNa+T67fhmx7o5SsRb03lEQ4ATRLNQkLLJhg5WjhRG4jXaPBeIAln6SFyXVR2xJHAPa6dR9rOc28aWavL0tybteo0bs+qVtnvyKzV9ZtpKzS4ibI1hoox3X8oN+b34gDQJNEspJqNJ4oJWbnuBLlxeA1ZhgdbPdS6qOyII0HWVZwwcze5Ll5B2s59Hqhb5zRur6uost+xum4d87uvfrNpYkzRYi/W9+IA0CTRLCT05sOEoFcftXF4CVmIG1s8KnSuUNkRR0KXfmuFPXfuS9tZxUvAZv7zP/9XjPufK3HJDCtxe2cVVf2OHZ0rmN99n32fKsYVLfZifS8OAE0SzUJCzTRMCGqoURuHl8CWDsYdWzzUugBVHXGkTJpt9FZ+65O55Lp4BdjMgaMXxbg//pK7e9c6jdt7K6vqd7AjhnGvaWHvWuZ30VIP49r626UxvxcHgCaJZiHJUgM4j0ZtHF5i5sL9YtyxxUOtC1DVEUfKpoyzHIg4DGxm/vIjYtzfbMOBt5WsWn/C1ZUaVPU7MvBu+SWXSLMStNTDuNZ5a3LM78UBoEmiWUh7D+Ry8VYCsKWDcccWD7UuQFVHHCnnzv8sqvfzVqRzwGYSAzsJvPVuLafOGJUa7n7MnZUaVPU7XwaaJPROdufWOxWHjxk7Bfc/NSTm9+IA0CTRLCSkY98enyjSs3NdWmpARbClg4UwYvIOcl2Aqo44GuBcOBnBOWAz73dYxMk3NlHykf5ibM+c/YlcF6tR1e/I5JtZiw6Q6+Im8KUcX87xJR1f1mN5Lw4ATRLtQkJhVgsFugAAIABJREFURhg7CjVSG4hXwJYOxhzFuKl1Aao64mh47q3JXI7EQWAz1RqN5/I7NlGtkVGOZM2mU+S6WI2qfkeW38ncc45cF7eB4zkY240ZsfkKDgBNEu1CeuPj2WJCpszdS24cXgFbOhhzbPFQ6wJUdcTR8HGgIHHyOC5I7Az/9v3loX5cgNsm3m23QIztqCmZ5LpYjYp+B7tisgB3fj59hQa38fan1pTq4gDQJNEuJLS6wYT80H8duXF4AWzliA4sj/Qn10WioiOOFm5J5ixHTxjneu59cjC5Lm6k+8D1Ynw79koj18VqVPQ7ew64vwUfJV2TjBZ73/WJ7bwwB4AmiXYhjZ+xS0wIiuhSG4cXWL3R6MH8dKPx5LpIVHTE0TJvGWe2O0nqmmNivJ9tMolcFzcybf4+Mb6vtZpFrovVqOh32H/Yy+Q5e8X4Nmk9J6b34QDQJNEuJOzFY0KeaMClM5wAWzkY7/e+WECui0RFRxwt/A3eWbDVjvFu1XExuS5uBGezMb4P1x1JrovVqOh3eAfBXrYG7PmReqNieh/tAsD4+PjO5cuXb+In0f/n+2J9nVmiXUg557h0hpN07J0mFkCPQRvIdZGo6IijJfgMTx5ntttOu67LhT33HZ5OrosbQXUGVGlAtQbYNrU+VqKi3+EzxPZyIfcXYc8lYrRnrQJAfyBXo0KFChPwZ///7/UHd4tieV0oiWUhla5mlM44fDSf3EDczuutZomxxtYOtS4SFR1xLHAWn3NgqwxjPXfpQXJd3ErZGkPFGO87mEuui5Wo6He4ioD9lHtmWMz2rFUA6A/muvqDu9by7/7A7kIsrwslsSykuk2niAlZvPIIuXG4HVl2Z9tOdcruqOiIY0HW8ULHFWpd3A622jHW2Hqn1sWt1G82TYzxguWHyXWxEhX9jqwjiqLF1Lq4lZfeNewZ5y2jfQ+tAkB/IJfip3nQ38/ffffdd0T7ulASy0L69LtlYkIGjNpCbhxuBo+8SyhYeFtFRxwL6LDClfztB2UysNV+W1yC37a5ZIZdfNo5Vdhz0ojN5LpYiWp+hzsJOYMVx0a0CgArVKgwKj4+vmnQ3/NLlSpVItrXhRIspCtXjIGJlMFjtooJadNpaVS/z4THwSN5YpyxpUOtSzCwm1jsRzVGBPXypNbFzWCLXSYouMV2VET659bfuss/q+Z3Nm83eolXeXE0uS5uZtiEbUbi2NeLo34P2Iw10ZkDEtja/Sjo73mxvC6U+GKQ9O1GZs6L706P5W1YipH1Ww0H83LLmdSquFp27D1vNB1/ewq1Kq6W5etOGCUd2sylVsXVsnFblhjnl95j/2ynLFx51KjQ0H4htSqulm27jS+OzzedEtP7xBaVOSj+QK4anu7hz+XKlSvvl1T82R/sxYXzunAEAxLtNylZzPW+JweTfztwMwNHbRHj/FnnVHJdglHtm3isnDrzoxjnf1QZSK6Lm0lI3ijGuUvSOtfYjoogOQ/jjGQ9al2sRDW/07W/UaS4c5815Lq4mZOnY/fPWj0BhPiDvX7+4K6Zn/5xcXHx/h/d6A/wzvh/fmcxrwtLsJAwMNHsp+O8w18e5HZOdvNJJ+Os5cDRW8l1CQZ2E4v9qMjfK/cXY52VfYVcF7fSosMio43kvH2ush3VgH/+U4U+4nza+Qu/kOtjFar5nXc+ny/sGc0RqHVxO+iEhbFGZ6xofh82Y3mQprPEupCqNhxrNHTfcprcONzKC+9MVTLbWjVHbAVPvTJOjPW6dLZnu3jm9QlijLfvOe8q21GRR+uNEmO9eXsWuS5WoZrf4Xugc1R/dbwYa3TGiub3OQA0SawLqVng28/Y6TvJjcOtPFA9WYwxkkGodQlGNUdsBc3bGvY8Zhrbs11gCwdj/PMv/3GV7agIWmdhrNFKi1oXq1DN7/zt4SRj1yCHdw3spkX7hWKsR0zeEdXvcwBoklgXUrdA0/Fveruv6bgKoAL6H0r38pUo30e5EgOqOWIrYHu2l7NZP4nxvatykutsR0W+TVgtxvuH/uvIdbEKlfzO8ZOXxPj+64lB5Lp4gd6B88Nfdl8Z1e9zAGiSWBeSbDr+ugubjquAVT0Q7UAlR2wVU+YaTcff+Hg2uS5uZG36KTG+2Gp3m+2oCHZmMN7YqaHWxSpU8jvL1x4X41ur8URyXbzA7MUHjIoYLWZE9fscAJok1oW0fVeOmJCHnndf03EVmDrPCEgaf6ReQKKSI7YKlQNuN4CtdYxv83bzXWc7KoKzrBjvJ18eS66LVajkd4ZP2C7G94OvFpPr4gV27TNKdVWoPTyq3+cA0CSxLqS8vF9FVf8/xiX6Ll7kqv5Wo/KWpEqO2CpU3nJ3A7Bj2HO3AetcZzsqgmx2jDfOqVHrYhUq+Z323VaI8U0cuolcFy+AGOO2cgm+W/wxR14UXbE4ADSJFQupfK3hYhEgOqc2ELfxbrsFYmxHT1UvKUElR2wlZaoPFWN+4LBaSTduAE+yMbZ4su1G21ERmXRz4tSP5LpYgUp+p2GLGWJs5yw5SK6LV3iwzggx5jt250T8uxwAmsSKhcSLwD6qNTLKkuDsFLUuZlRyxFYiy+4sWqFW2R038EigLElGZrYrbUdFajaeKMZ8xbrj5LpYgUp+B1uR/PDDWZBvgDGfvmBfxL/LAaBJrFhI/BjcPmThS2RPUutiRiVHbCWffmcU3h4wagu5Lm4CW+rYWscWe27eL660HRVBb2vYc8rE7eS6WIEqfic//zexFYktST7+5BzyGEn3gesj/l0OAE1ixULig7D2cOrMZTGu91QZSK5LKFRxxFaDjisYd3RgodbFTWBLHeOKupZutR0VkaUzOkRZOkM1VLGdzD1Gb9pKz6WQj4mXiCWznQNAk1ixkLC1wKnw1pO24aQY1xqvTSDXJRSqOGKrQccVjHvdplPIdXET2FLHuGKL3a22oyKzFhmlM15pOZNcFytQxXbkuEZbkoSJDnRcwbijA0ukv8sBoEmsWEg4XIwJ+efjXAzTSkZOzhTjiurn1LqEQhVHbDXouIJxL/10MrkubgJb6vLJqlttR0Xc9qRKFdtx25NVXcg+97MY97882C/iSg0cAJrEqoVU0A4nm9vhWMXXPVeJMe05eAO5LqFQxRFbDZzKnyr08d14f09RFoZaH7eAwE+erXSr7agIzqrd7KKzaqrYjtvOVurEfU8OFmN/5PjFiH6PA0CTWLWQUGgUE4LCo9TG4RZeC2Q7zViwn1yXUKjiiO3g0UC26pYdWeS6uIXg7Go3246KxNcaJsZ+9/4L5LrEiiq2I7OrV647QT4mXqPOW5PF2C9NOxrR73EAaBKrFhIOZGJCUOmf2jjcArqrYEzRbYVal1Co4ojtoEnrOWLsJ8/ZS66LW0Dyh6yv6GbbUZEG700XYz/XBaW6VLEdWV/x5Gl31FfUiTadloqxHzR6a0S/xwGgSaxaSKjsr2rHCh25dOnfvtvjE303PdArqornTqCKI7aDbxNWC3v+of86cl3cQEGHFb9NY4vdzbajIu26Lhf23Hd4OrkusaKC7aAsF8bz75X7k4+HF5HniVGyK5Lf4wDQJFYtpClz1e1ZqyP7DuaK8Sz3zDByXQpDBUdsF7GUGmCuR/ZYrvyC0TPczbajIsnjMsT4t/pa/1JdKtgOCvNjPFGon3o8vEi0lRo4ADSJVQvJ7OCZ2Fiw/LAYzxebTyPXpTBUcMR2sX6zUWoAZ1updXED5i+IbrYdFUldfUyM/7NvTiLXJVZUsB205sR4olUn9Xh4kcNH841KDdWGRPR7HACaxKqFFLzFg+1LagPRnaQRm4WBf/Z9KrkuhaGCI7aLrJwrYvyR3U6tixvoNnD9NUdE3Gw7KoJsSYz/vU8OJtclVlSwnY6BbhTdouhGwcQOjpH8uVJfUakh59zPYf8eB4AmsXIhlak+VCyK/YdyyQ1Ed+Qh18FjMsh1KQwVHLGdoK4l5uD4yUvkuuhO87ZGkhienODvbrcd1cAN885K/cQcRHLDVBEVbEf2o506j5PEqHiiwRgxBxszzoT9OxwAmsTKhVSvmVHmAduX1MahO8+/PUWM5ZJVkaW5O4kKjthOagXKPKDTDbUuuvPUK+PEWOLsFP7udttRkcdfivyGqSIq2A6OOmEsMzKzycfDqzT9bJ6Yg/EzdoX9OxwAmsTKhfRp51QxIdi+pDYO3UEXCowlzjpQ61IYKjhiO0Fva8wBel1T66I7yJbEWCJ7En93u+2oyFufzBVzMHHWbnJdYoHadnDEqUSgQkOuohUavAAqNMCeOyWuDvt3OAA0iZULCTV5MCGtv11Kbhw6c/7CL+JsA7pRRNrqxkmoHbHdJA7dJOy5fbcV5LroDOqkYRzvqTKw4Gdutx0V+b7fWjEP+D+1LrFAbTs44oRxLFtjKPlYeBmZWPbGx+FXHuEA0CRWLiRsV2JCUKWb2jh0Bt0nMI6P1R9NrktRUDtiu5m92Gj23pCbvccEOiVgHJ95fULBz9xuOyoyYeZuMQ94EkitSyxQ246s0FC/mboVGrxARhSVRzgANImVC0mmZt//VGSp2cy1oPsExhHdKKh1KQpqR2w3O/eeF/NQ8dkUcl10JmXSDjGOLTosKviZ221HRXD2D/OAw/PUusQCte3oUKHBC2D7Hdvwt0dQeYQDQJNYuZCwXXlHRSM1+9x5vTPNKJFdVSI520ABtSO2m4sXf/PdWjZBgD9T66MrX3ZfKey515CNBT9zu+2oSPa5n8U8IBtY5aMlxUFtOzjiFE0bMsZ64moaPa73Hgiv8ggHgCaxeiFVeXG0mJBNGWfJjUNXZMkMdKOg1qUoqB2xE+DpH+YCTwOpddGVV1rOFGM4c+H+gp95wXZUBHUAMRdHT+hb2ojadnDESfUKDV6hoMf10kNhvZ4DQJNYvZDebOOOTDNKZMkMdKOg1qUoqB2xE+D8H+YC5wGpddGVB+uMEGOYuedcwc+8YDsqUrvJJDEX6AxCrUu0UNsOjjipXqHBK3zxwwoxF32GhdfjmgNAk1i9kDr3XeOKTDNKZMmMrOwr5LoUBbUjdgJkAGMukBFMrYuOYOv8tnIJvpvL9PblBZXM8ILtqAh6AcOeh47fRq5LtFDaDo424YgTjjrpvI3uFlCiC/aMkl3hvJ4DQJNYvZDckmlGhSyZgS4U1LoUhxdu4pE6GOZadu+/IMYvvtawa37uBdtRETwpwXy067qcXJdoobSd9G1nxfjhqBP1ODBXKwzUbDwxrNdzAGgSqxeSzDRD1Xlq49CRVesjM2hKvHATRxcQzEctDeZDRXA2B+OHszrBP/eC7ajI3CUHjfl4fzq5LtFCaTuTZu8R44ejTtTjwISuMVoUHACaxOqFlBPINEOjZn5EHjmhSmaoihdu4ugDrMsTWRXpO9x44tS2y7VPnLxgOyoin8iWrzWcXJdoobSdLoFi2jjqRD0OjEHJRweIOTl99nKxr+UA0CR2LKT7Aplmh49dJDcO3fiqxyoxdr2TN5LrUhxeuYn/7eEk40xmjtpnMlVEnjlLHpdxzc+9YjuqIc9k3lKmty8/X8/SRpS28/ankfefZeylxmsTxJykbThZ7Gs5ADSJHQvpuUCa/NI0TpOPlEYfXF8yQ1W8chN/8uWxWmRlq8izb4bOOvWK7ahIpedSrsvK1glK20ERbYzdhq1nyMeBMcBuGeYEu2fFvZYDQJPYsZA+/maJmJDBYzIsfV8vEKpkhqp45Sbe7HM96jKqiKw7d+T4tbsBXrEdFXk5UNpo1iI9SxtR2Q6ONKGINsYORbWpx4ExSEg2erZ36L6y2NdyAGgSOxZSUgq3yokGtLP5Y1zidSUzVMUrN/Ef+hudWb5NULszi2oU1XnCK7ajIh0CnVlw46TWJRqobAdfYjBu+FJDPQbMVeYEEpvC6dnOAaBJ7FhI81MPcbPsKEA7m1AlM1TFKzdxXXozq0ZRvWe9YjsqIksbtfxS/USzUFDZzrK0Y2LccKyBegyYq0SS2MQBoEnsWEj7DhqBTNkaQ8mNQyfmLTMC55fe1SNw9spNfMuOLDEvj9YbRa6LThRVE9QrtqMiupc2orIdJDJh3D7quIR8DJirILEp3J0zDgBNYsdCwlbm7fGJvpse6OXL1WArUxXk1rm5ZIaqeOUmfiH3F1H9/08V+nBpowgoqiuQV2xHRU6c0qfYfCiobAd+GePWLyW8tmOMczz0/EgxN9t35RT5Og4ATWLXQnq4rjEhGZnZ5MahCzJ5ZshYPZJnvHQTL/10spibg0fyyHXRBTz5K6wvuJdsR0V0Lm1EZTvYmcGYYaeGegyYa3m91SwxN9Pm7yvydRwAmsSuhSQnZOq8veTGoQt1AuVzcNaEWpdw8NJNvG7TKWJuFq04Qq6LLqAbEMYMZwHN/+Yl21ERnUsbUdlOXM1hYsz2HLhAPgbMtXzTO03MTbeB64t8HQeAJrFrIXUMc0KYq9z/1BCtCmh76Sb+SadlYm4Gjt5KrosOBJfMyAlRMsNLtqMi7wRKG43TsKAxhe3gbBnOmOGsGY44UY8Bcy2wY9gzSnYV9ToOAE1i10IaPXWnmJDmbYueEMbg3PmfxTkznVroeekmPmDUFmHPn363jFwXHZAlM+4rpGSGl2xHRWRpo06J+pU2orAdnC3DeKFOK/X1M9eDwtyYn6oNxhb5Og4ATWLXQlqbfkpMyFOvjCM3Dh3YvN3INK3y4mhyXcLFSzfxhcsPi/l54Z2p5LroQHElM7xkOyoyac4ebUsbUdjO9AX7xHi9+uEs8utnrieniJqjwXAAaBK7FtLZrJ/EhNxVOYncOHRAOuQ321xfMkNVvHQTP3A4T8zPA9WTyXXRgeJKZnjJdlREfuF8rL4+XzglFLbTY9AGMV5f91xFfv1MaMI5QsUBoEnsXEj/qDJQTAjKDlAbh+rILZnv+qwh1yVcvHQTx7fKEuX7+P5QupcoC0Otj+oUVzLDS7ajIvLIiY6ljShs5/32C4U9j5ycSX79TGief9tI1Fuy6mihr+EA0CR2LqSajSeKCUHhUWrjUB15KHu8RoeyvXYTf6TeKDFHW7m0UbHIkhlzlx4K+e9esx0VKV0t8MTkaD65LpFAYTvVXx0vxmr1xpPk18+EJpxEPQ4ATWLnQkKrIUwIWg9RG4fqyLIMG7boU5bBazfxxh/NFnM0ZS6XNioOtDMsqmSG12xHRcJ5YqIiFLZT8tEBYqxOn71Mfv1MaBD4YY4QCBb2Gg4ATWLnQkKzcUxI+24ryI1DdXQszOq1m3hBrakB68h1URlZMuO2cgmFlszwmu2oSOtvlwp7HjxGj8LzEqdtB0EfxglBIPW1M4WDLzKYJ3yxKew1HACaxM6FNHvxATEhDVvMIDcOlZGtmf71hF6tmbx2Ex8zjUsbhcOO3cWXzPCa7ahI0gij9eRn36eS6xIJTttO2oaTYpywDUx97UzhIPkD84RkkMJewwGgSexcSDv3nhcTUqH2cHLjUJnla/Vszu61m/i69NNc2igMZi7cL8ap0QczC32N12xHReanHhLz9GLzaeS6RILTtjNi8g4xTkgEob52pnCKKz4POAA0iZ0L6eLF33y3lk3w3VKmty8//zdyA1GV4kpmqIrXbuJc2ig8eg3ZKMbpqx6Fl8zwmu2oyL6DuWKeyj0zjFyXSHDadmDHGKeegzeQXztTNCgELc7Sb72+/STgANAkdi+kis+miAnJ3HOO3DhUBd0lMEboNkGtSyR48SbOpY2Kp0WgZEbKpB2FvsaLtqMaOJ95e3yi76YHevly834l1ydcnLYdPMmGPc9YsJ/82pmiKa7FIQeAJrF7Ib3cYoaYkFmLDpAbh6rUeWuyGKOlaZyNpzqytNHKdSfIdVGVZ16fIMZo1frCx8iLtqMiDz0/UsxVhkaljZy2HZxlxRjhbCv1tTNFgwQ9zNW3CaFbHHIAaBK7F1KH7ivFhPRO3khuHKpSquogMUbHTl4i1yUSvHgTl6WNUiZyaaPCuCfwlPTk6cKfknrRdlTkjY+N0kaT5+hT2shJ28FT0j/GJYqs9jyNnpJ6lanz9gp7RsmuUP/OAaBJ7F5IuFFiQlp0WERuHCoiz5X9vXJ/cl0ixYs3cXyRwXzhiw21LioSrj170XZUpHPfNWK+vu+3llyXcHHSdlDHEuMTV1Ovc5JeZdvObDFfD9cdGfLfOQA0id0LCVtlmBBsC1Ebh4rIEgM1XtNvfLx4E8dRBszXy1zaKCRrNp0S41OtUdGZ0l60HRXBkz/MF54EUusSLk7aDjrZYHzQ2Yb6upnikTVI8dQ2VA1SDgBNYvdCwjYQFhC2haiNQ0XQJQXj88FXi8l1iRQv3sSRzIT5qvRcCrkuKoLED/HEv5iSGV60HRWRT0xwFpBal3Bx0nb6Dk8X44Pe1tTXzYRHUV2IOAA0iRMLCdtBmBBsD1Ebh2rAsWBs+qWkk+sSKV68iaOc0S2BLhcoc0Stj2q062rYc+LQTUW+zou2oyLSnlGuS5dSXU7aTquvFwt7Rqku6utmwqPB+9ONPuRLDl73bxwAmsSJhYTtIEwItoeojUM16jWbKsZm4fLD5LpEildv4uVrDRdzhkLn1LqohrRnFBku6nVetR0V0S3L1Unbqd1kkhib1NXHyK+bCQ+0ni3sSygHgCZxYiG9226BmJBRUzLJjUM10LYGY3P4aD65LpHi1Zv4Ky25LlhhSHs+VIw9e9V2VOT1VrPEnE2Zq0cmsJO2Iys0HD2hV4UGLyMTT1GxwfxvHACaxImF1H3gejEhHXulkRuHSmTlXBHj8teHkkQbG2p9IsWrN/GOvdPEvKHmFLUuKiHt+S8P9ivWnr1qOyryXR8jE7iLJpnATtlO9rmfw7ZnRh1Qf7SwxFMOAE3ixEKaNn+fmJDX/N80qY1DJdamh5cxqSpevYlPmLlbzNubbeaS66IS4WYAA6/ajopMmr1HzFuTNnPIdQkHp2xnwxaj9/cTDcaQXzMTPqfOXBbzdvdjA677Nw4ATeLEQtIx08wJZJPx4jImVcWrN/EtO7LEvFV+ge05mIKan2HYs1dtR0XQBaSo2mmq4ZTt4MgSxqV52/nk18xEBoI/zB2CweCfcwBoEicWEvpMot8k+k6Gqs3jVYo6rKoDXr2J5wbVmuJM4KvIjPY+w4rPaPeq7agIaqfplNnulO3ILla9hnAXK90orB0lB4AmccoJl3um8No8XgXFRTEm85YdItclGrx8E6/4bIqYO9QFpNZFFV54x8gAXhBGRruXbUdFUNdSF3t2ynZebG74ZxSDpr5mJjIKa9nJAaBJnHLCDVvMEBOCTgrUxqEKZaoPFWNy4HAeuS7R4OWb+GuBzEn0nqTWRRUiyWj3su2oiLRnnNem1qU4nLKd0k8na+2fvQx21TB32GUL/jkHgCZxygkjA1hkTg5cT24cKnDu/M++G+/v6bujYl9tM8y8fBPvlLhaq8xJu4kkAxh42XZURNpz1yT1M9udsB1pz3dW4gxgHUERaMwfikIH/5wDQJM45YTHz9glJuStTzhzEsgMs6oNxpLrEi1evolPmrNHux6qdrJ648mIMtq9bDsqMnGWPpntTthOpPbMqAWOmmH+0BYu+OccAJrEKSfMmZPXMnrqTu0zzLx8E5eZ7eiiQK2LCsie1i06XF98NRReth0V0ck/O2E7kdozoxZINkWSHpL1kOQkf84BoEmccsK5QZlmuvSctJOveqzSPsPMyzdx2DD6p+rUQ9VOPu+SKuy57/Dwelp72XZURKfMdids57PvU7Xt0c4YoKwR5hBf1uXPOAA0iZNOWPac3L5Lj56TdiKTYuaEaFitC16/iUt7DnYwXkVmAIfb09rrtqMiFWrr0ePaCdt5/u0pYiwWrThCfr1MdDT+aPZ1iXocAJrESSeM81KYEJyfojYOauJqGmVx9h7IJdclWrx+E2d7vsp9Tw6OqKe1121HRV790MgEnr5A7UxgJ2znX09wD2Dd+TZh9XUtOzkANImTThgZk5gQZJxRGwclF3J/8f2hdC9fifJ9tC6M7fWb+PcBe0YvVWpdKMnKjryntddtR0W+0aTHtd22c/qs0Urs75X7k18rEz3jAomn73x+9Zw9B4AmcdIJy57A+KZJbRyUpG87K8ahyoujyXWJBa/fxLG1gHl83eM9rtM2GBmTTzcaH/bveN12VET2uFa9UoPdtrN87XExDjUbTyS/ViZ6Nmw9c12lDQ4ATeKkE8bZEkxI+VrDyY2DElkSp+ln88h1iQWv38TRNQHziK4g1LpQMmz8NjEOqL4f7u943XZUZPN2IxP40XqjyHUpCrttZ/CYDDEOH3+zhPxamejJOWfU2v1zpau1djkANImTThjbnegHjL7A2AalNhAqOvZ2R1Fsr9/EkS0pSw3kBpUa8BoyAziSjEmv246K6NKz3W7baf3tUmHPA0dvJb9WJjZKV7u2OxEHgCZx2glj2xMTsinjLLlxUNHog5liDGYs2E+uSyzwTfx3UTcNc4k6atS6UFG36ZSIMoAB246aYHcGc7lrn7qZwHbbTu03JokxSF1zjPxamdiQvmnxSiObmwNAkzjthJt9Pl9MyJhpO8mNgwpdyi0UB9/EfxedEzCXOD9FrQsV98oM4GMXw/4dth01eaWl+l9O7badko8OEGNw6sxl8mtlYuPT75aJuRwwaov4OweAJnHaCaPwMSbky+4ryY2DAllwFdssqhdcLQ6+if/u+6H/OmHPyKCk1oWCs1k/iev/28PhZwADth010eF4ip22c+zkJXH9/3x8EPl1MrEzaPRWMZ9tOi0Vf+cA0CROO+G5Sw+JCXnp3WnkxkHB1kyjhdgjih+0Dge+if8uaqZhPrGtT60LBavWnxDXX/3V8DOAAduOmozTIEHNTttZsuqouP7n3ppMfp1M7CxNM+azTmA+OQA0idNO+OCRPDEhpZ9OJjcOCibN3qNN0/Xi4Jv47+KMXdCiAAAgAElEQVSsVKim415BZgB/8NXiiH6PbUdNZImqx+qrW6LKTttJStksrv/Tzqnk18nEzpHjF8V8olA9/s4BoEmcdsLYJvrLg/3EpGTlXCE3EKdB0WBce9cktYuthgPfxI3M9hIezmyPtmcq246awIZhyyUUzgS203bwRQb2jC821NfJxE5wvJF97mcOAM1C4YRRMBYTsnrjSXIDcZpQ/Ql1hW/iBnha4tXM9mh7prLtqAueZmNOd++/QK5LKOy0HXlvQnFz6utkrKFqw7FiTjdsOc0BoFkonLCXv2U9WGeEuPYdu3PIdYkVvokb4LwU5nTsdO9ltpeqavRMxVZLJL/HtqMuL7eYIeZ01qID5LqEwi7bwdMitDMUu1PZ3tudciuy8gj8MweAJqFwwkkjvHnOIj//N98tZXr7bi2bIP5MrU+s8E3coPvA9cKev+65ilwXJzlz1sgAvqtyZBnAgG1HXTr2MjKBuyuaCWyX7Rw6mi+u+/6nhpBfI2Md3QL+GZUaOAA0CYUTlpk5Xsu02r4rR1w3ngJS62IFfBM3wJMSzGvDFjPIdXESmQFc47UJEf8u24664EkJ5vWdz+eT6xIKu2xnfqpRoaJ+M29WqHAr0+bvK+jZzgGgSSic8PFAraV/VBlIbhxOMmXuXnHdOAdIrYsV8E3cYO+BXDGvZWsMJdfFSYZGmQEM2HbUZWPGGTGv6NpErUso7LKdhORN4rq/+GEF+TUy1iEfvDz0/EgOAM1C5YTv8Qd/mJQTp34kNxCn6NJvrbjmzn3XkOtiBXwTN8D2558q9BGNx8+d/5lcH6fAEQ7YM0pnRPq7bDvqcv7CL74/lO7lK1G+j5KZwHbZzntfLBD2PHJyJvk1MtaRF2i+gL7tly79xgFgsFA54WffNPotLkvzTr/FJm3miGueNGcPuS5WwDfxqzzRYExBphm1Lk6B4qrBfTYjgW1Hbco9Y2QC4+k2tS5m7LKdqg3Gem4NewXZ43rPgQtqB4Dx8fGdy5cv38RPov/P9xX12goVKjzm/99Nd9999x1xcXHx0XwelROWPfr6j9xCbhxOUfmFkeKaMzKzyXWxAr6JX6V5WyPTbNQU7zw9kBnAR09civh32XbUpmEgE3j2YvUyge2wHfkUH08+vfQU3ytIe56z5KC6AaA/4KvhD+om4M/+/9/rDwIXFfV6/7/v97/uip8lpUqVKhnNZ1I5YXl+6MOvIz8/pCPo+4tH0HgUjUfS1PpYAd/EryJ7XHfwSI9rmQH898r9o/p9th21+arHKjG/PQdvINfFjB22I8/x4skn9fUx1gO/jPlNHLpJ3QDQH8h19QeBreXf/QHehWJe3zLWz6Rywii0GU0PUV3J3HNOXG/FZ1PIdbEKvolfZS6+WXqox/XKddFnAAO2HbUZM83IBG6mYCawHbbj1Ux+r5AyaYeY35ZfLlI3APQHfCl+mgf9/Ty2dwt7vT8A7B8XF9fQ//8uZcqUqRTNZ2IhXbliLConyc65IiYEhTcvX/6345/vNDMWGKnor344i1wXq4DdUNmPasge1w88nUyuixMkj8sQ19vq68VR/T7bjtrITGCcbaXWxYwdttNjkFErDjUQqa+PsR50HRNfWF+foG4A6A/kRsXHxzcN+nt+qVKlShTxKzfiPyVLlvyzP1jcEc1n+gilTI2hYlLyLv6bUg1HJGnkFnGtPQZvpFaFxQb573//67sz0HPy//nP/6VWx3b5qqdRLHjklJ3UqrDYIP/zP/+vOA93R8W+wrbdLi3wZAhnxJYeolaFxQb59bf/EfMrqo9Qij+oq41gzc92E4vwJM8fAH4U9Nq8wt4nLi6usf/fhwT++gf/7/8nGn0wOFTfwus3nyYmBQU4qb8h2E3TT412YeNn7iLXxSr4Kc61PPWykUW4Lv0UuS52U+dtIwMYRd2j+X22HfUpG/iCvv9QLrkuwdhhO4/WHyWudcuOLPLrY+xBlp674c6v74omVrJd/AFdNTwFxJ/LlSvnj+nKp8p/8weGccGv9QeAdf2veQp/Llu2bEX/a9dG85lYSBgcin359t1WiAnpnbyR/IyA3TxWf7S41vRtZ8l1sQrYDaX9qMb77ReKOcZ5E2pd7OZfTxgZwMdORp4BDNh21KfBe9PFHON8K7UuwVhtO8EJerkuSdBjrqdm44lGAHhv9xqxxGm2ij/Q6+cPApsFzvfJ0i43+gO8M/5/u9P02tZ4Yuj/twTdsoABSmZgQlBCg9o47ATFVEvEJ/pueqCX70LuL+T6WAXfxK9FZJj57bld1+XkutjJ6bOXY8oABmw76vNlIHMSGe7UugRjte24MUGPuR50LBIBYKkerWIO1NwilE54w9arB42pjcNORPFJ/3XG13JXiQG+iV+L7CVar9lUcl3sZMW64+I6n3k9ugxgwLajPvIL+rvtFpDrEozVtjN13t6CXrHU18bYR59h6UYAeF/PAdRxlzJC6YRVbzlkFbLEwMsuKzHAN/FrOXQ0X8zz/U8NIdfFToaMvZoBHO17sO2oDzpiYJ7RIYNal2Cstp3vAy06v+vjjhadTGjmLj0U2ALuuYw67lJGqJ0wnophUnbvv0BuIHbRY9AGcY1f91xFrouV8E38WtBNAGWNMNdZ2VfI9bELK7r4sO2oT865n0V/a2QCw7ap9ZFYbTtvfDxb2PPkOXvJr42xD1ns2x8AnqSOu5QRaifc6IOZYlJmLNhPbiB2gWKquEYUV6XWxUr4Jn49TzcaL+Yahc6pdbGL5wI9gJesOhr1e7Dt6EGZ6lczgal1kVhtOw/WGSGucfuuHPJrY+wDu4y3xyf6A8Ae/3vDDW/fSh17KSHUTvjbhNVi8f3Qfx25gdgFzjiKJuNbz5DrYiV8E7+eloF6YsPGbyPXxS7++XhsGcCAbUcP0NlGZAIvPUSui8RK20FbzlvK9PbdVi7Bl5//G/m1MfZSt+kUvz33+IUDwIBQO+FJs/cIB9OkzRxy47AD2WQcWyluazLON/Hr6ZdiHDT+7PtUcl3sQGYAl3wk+gxgwLajB7KHqkqluqy0na2Z2eL6Kr8wkvy6GPvJy//Vd8Nfv/orddyljFA74W07jQX40PPuXID7DhrnDrCVQq2L1fBN/HoWrTgi5vv5t6eQ62IHy9caGcCoqRXL+7Dt6MHIyUYm8HtfqJMJbKXtTJy1W1zfm23mkl8XYz+wGeqYSymhdsJ47H5r2QRBnguLcE6bv8+VGcCAb+LXc+T4RTHfpaoOItfFDmQG8Ecdl8T0Pmw7erAu3cgEfvJldTKBrbSdb3obLQ27DXDvESTmKhwAmkQFJ/xw3ZFiEWZkZpMbiNWgubhbzzjyTfx6sOWPAsmYc2yXUutjNZ90ij0DGLDt6IHMBP5zJXUyga20HS8kITJX4QDQJCo4YTx+xyLE43hqA7Ea49Cp0e+YWher4Zt4aFAgGXOOgsnUuljNs29OKugBHMv7sO3owwPVk5XKBLbSdrxQhoy5CgeAJlHBCePxOxYhHsdTG4iVBD8NOnn6R3J9rIZv4qFBgWTMObZLqXWxmn8EGqofjyEDGLDt6AOOr2DOpy/YR64LsMp20IgA7TnRptPNjQiYq3AAaBIVnPDMhfuFg3ml5UxyA7ES2QIO36CpdbEDvomHBtujmHdsl1LrYiWnzgQygB8dEPN7se3oQ+e+a8S8d0pcTa4LsMp2NmYYrUgff8ndrUiZq3AAaBIVnLAMlOJquqtXrixx49Yek3wTDw22RzHv2C6l1sWO66r9RuzXxbajD7KVZYP3p5PrAqyyndFTd4rrat52Pvk1Mc7AAaBJVHDCePyOWnnoC+ymWnntu60QDgat4Kh1sQO+iYcG26OYd2yXUutiJQnJm8R1te2yPOb3YtvRB9nj+r4nB5PrAqyynS8DNQ57DVGnxiFjLxwAmkQVJ4yG46JbxpbT5LpYRe0mxoH5xSuPkOtiB3wTL5y7Hxsg5v7EKfec/XzrEyNZa+z02Fsasu3oA84yY9tfFXu2ynZU7HLC2AsHgCZRxQmj0CgWIwqPUutiBXCad1bqJ67pbNZP5PrYAd/EC6dOoF/uguWHyXWxikrPpVjWM5VtRy9Q2FwVe7bKdmR284HDeeTXxDgDB4AmUcUJJw41tpe++GEFuS5WkLnnnLgelBmg1sUu+CZeOHJ7qfvA9eS6WAHqweGIBo5qWJExybajF7IlnArHWaywnWy/PeN68CVdlfqGjP1wAGgSVZwwvlliQdZrNpVcFysYN2OX61sM8U28cCbNcVcC0Kr1J8T1PN1ovCXvx7ajF7JlWpPW9D3brbAdac/VGo0jvx7GOTgANIkqTvjwsYtKHTSOlc+7pIrrwZNNal3sgm/ihYPCsm7qAS1L27TptNSS92Pb0Qu5o1G+1nByXaywnaQRmy21Z0YPOAA0iSpOGI/h76qcJBblmbP6n5mT3SBS1xwj18Uu+CZeOLDnvz6U5JqWcPKMbsqkHZa8H9uOXmDb/46KfUVbuKycK6S6WGE7KP3ipjPnTHhwAGgSlZywzJpdsiq2NlPUBJe1oXaWdsI38aKRbdPckAX+SL1R4lrSt5215P3YdvSj+qvjlWhxaIXtPFhnhLiWrS7sP88UDgeAJlHJCcu6eT0H0x80joVtO7PFdSBrkloXO+GbeNEgockN9nwh9xffLWV6+/4Yl+jLz//Nkvdk29EPbJfCnrF9SqlHrLaDWrOiBVz5Pr6LF62xZ0YPOAA0iUpOWB6cb/zRbHJdYmHUlExxHe987u4K83wTL5oJM9U5OB8L6zeftrxlFtuOfmD7H3aA4wCUesRqO1YnNDH6wAGgSVRywnsP5Lqidy56wIpvyim035Tthm/iRbNz73lXtDhMHpchrqPll4sse0+2Hf3YlHFW2MGj9UaR6hGr7cAvu7FXN1M8HACaRCUnjIPzf6/cXyzOk6fpK85HC0oL4BrwTZNaFzvhm3jRuKUYeKuvF4trGDwmw7L3ZNvRj7y8X323lUsQxwFy/X+m0iNW22n2OSeAeBUOAE2imhOu29SoOD8/9RC5LtGAM1Il4hN9N/udpJv6GoeCb+LFU6vxRGHPy9L0zQav2tBo07g2/ZRl78m2oyeP1R9ttOzceoZMh1htRyaAZHACiOfgANAkqjnhjr3SxOL8of86cl2iAVmS0L/yCyPJdbEbvokXT9suy4U9JCTrWQ8SX2huD3yhOX/hF8vel21HT1q0XyjsefiE7WQ6xGI7sqMNJ4B4Ew4ATaKaE542f59wMK+0nEmuSzTAMUL/9/2OkloXu+GbePGMnb5T2MNbn+jZEWbLjiyh/8N1rf1Cw7ajJwNGGQXBW39LV0A5FttZuY4TQLwMB4AmUc0JHzqar3VHEHleatDoreS62A3fxItnx+4cYQ8VatN3UIgGnJOC/iica+X7su3oiQoZtLHYTr+UdKH/p99xAogX4QDQJCo64X9UGSgW6dETl8h1iZQnGowRuq9LP02ui93wTbx4gjsooAE9tT6RghulHRntbDt6IrdQUegetk2hQyy2804gAQSluqjHknEeDgBNoqITfundaWKRzl58gFyXSMgNZMndWjZBFM+l1sdu+CYeHjVeM9oCLl9L20EhFt2t7v7AtqMveJoNm8DTbYrPj8V2OAHE23AA+P+3d+7hVVVnGg+1Yy2D7XQErQEFcwG8X6oULaBSi7ZSRKgUrIgoFymDpbWIUAQk3CHhDnIHJYRbAoT7LQQIBOQWQriTBIFwEabOzDPz38xzZn3rZKXHbUj2Ptlrf3vt8/6e5zUJnrPX2vt5z7fW2Xut77PgxyD80cgt8kNKP7n74kQ7docT5j7RZiZ7X7wQBnF76j0wW/pi1JRc9r44kc67l/COuerYc5n085wvvmRpP1rvlEbcvcQGkNgUJoAW/BiE6c4fBRi6E8jdFydK/SycMLdb/yz2vnghDOL2NHPRASMrw+w/9JXsd3IL99cvwjvmanhqjvQFlTrkaD9a79BdbOo31TTmvoYQjzABtODHIFx06qr8oNJaQO6+OFHXDzJlvyfN2cveFy+EQdye6HET+YIeP3H3xYkqStn1dL+UHbxjriinJfmClgdwtB+tdyo2gAzMZr+GEI8wAbTg1yBc/+mJ8sNKu4K5+2JXVCKJ+pyTx5ck1UthELcnetxEecfo8dMFgzaC9BuyXvqZ7vi4fWx4x1yRhykvJOWHLGOoCBKtdzq9v1z6me7Ic19DiEeYAFrwaxCmPID0YaW8gNx9sSNKkkslku5I5AmKHMIgbl+UNsO08oC/KK9ismbTCdePDe+YLVrnzJXtIFrvNH1+quzz3gPYABKrwgTQgl+DMFUCoQ8rVQbh7osdbdl5VvaXymZx98UrYRC3r54D1oTTqUxzN52KLtGXGLrDc1tDPXct4R2zRYmgdaQHsqNovFPqg/Q1EL8wAbTg1yBMtYApwFBtYO6+2JEfMuR7LQzi9qUSKtNjKO6+2BHV/dW5ox3eMVuqwo2O9aHVKRrvUAomznWLkD+ECaAFvwbhM+euyw/sXY+MDV2/7v9vbG/2XSn7O21BPntfvBIGcfs6cPii9Eej5pPY+2JHlLKG+ttrgJ6KCfCO2TpUcEn64/5mqZ63HY13lJ+xASS2hQmgBT8H4YbN0+SH9nDBZfa+VKeHXpwu+7onhhKMYhC3L/oSc3d5hZvjJ6+y96c6vdY9XfaVdgLrOD68Y7Y4/RyNd1TuQmwAiW1hAmjBz0FYDULzMw6x96Uq0RopWitFOz1jKcEoBnFnatttiRF+JsX/bILsa8HxMi3Hh3fMl9qot3DZYU/bjcY79z2TKvtKdy65rxvEJ0wALfg5CA+dsIM14ahdxWqCUQzizjQibacRj6GOFl6W/Wzw9ERtbcA75mvYxHB87jt4naftOvWO8jN9qTFhORGkT5gAWvBzEFYLd595dTZ7X6pSrK4vwSDuTGqn+JMvz2LvS1Wa/cWXsp+vv7dUWxvwjvlS8blZW2/js1PvqA0rOv0MmSFMAC34OQhfuvx3mVeP8uv5OYHuG73DCUZnLY6t9SUYxJ2JUqvUTkqRSXTdrq3rplSKD6qcoKsNeMd8qdynP0gYEbrsYe5Tp955589Z0s9jp+9mv2YQrzABtOD3IKyS0WZtKGLvy63UuOUU2cf8gxfY++KlMIg7VwsD/Kwq2mzfpS/JL7wTDD31yizplc05Zzxr06l3qAQj9TF3bzH79YJ4hQmgBb8H4Q8/3SQ/vANSNrP3pTKVlN4M1bpvWOjOpqNiLsEoBnHnosTm5OePR29l70tlKrlwM7yhKSkldOWKvg1N8E4w1PujtdLPIyfru1tslRPvnD3/tYzPP35wdMzFZ+i7wgTQgt+D8Kp1x2WAafn6fPa+VCZVGJ3u7HD3xWthEHeuZWvCCc5ffMOfCc7pzqQXfoZ3giFKE0R+oYwNXrXpxDtLVh2V/ftV58Xs1wriFyaAFvwehEsjCo97uc7Erj5Ny2HZCecHYRB3rvPFNyruGPsxZRDdmSQ//3nYRq3twDvBkNphW1/jjnGrnHin35D1sn9Dxm9nv1YQvzABtGBCEKb6uvQh3rDtNHtfrOrQI0P2bV66noS5fhYG8ej0cOtw0vCdef5bk/TL3y+SfctYfUxrO/BOcHTvU+GckceK9OSMtMqJdyiDBPWNdixzXyeIX5gAWjAhCFMeQL9+i0t4brLs28GjsZdgFIN4dOru012JtEaK1kpR32jtlM624J3gqJ1K2L/UmwTndr3z1cV/r9ilTBkluK8TxC9MAC2YEITTMwtkgHmp8yL2vkSKBknq108eHhOTCUYxiEcnShdEvunQM4O9L5HanV8i+9Wk1VTtbcE7wZFKcP7+x9metGfXO2p99rPt5rJfI8gfwgTQgglB+Fzx175cN0UlkCjAtOkSmwuMMYhHpyPH9FfaiEapn+XJfnXtt0p7W/BOcLRx+2npG1qq40V7dr0zqHw9a/+hetezQuYIE0ALpgThR34ZXje1Y7e+3GROpR7lUSUQ7r5wCIN49FK1dmkRPXdflDr3WSH7NHXePu1twTvBET1evf2BEVL02FV3e3a9Qzvtyc/LNK9nhcwRJoAWTAnCPQes8TzfVHVS6//27C9l7wuHMIhHLypLRd6hsmvcfVFSfvYioTm8Eyw999pc6Z0V2YXa27LjHXpSVKfJqND37h8eKi65wX59IH8IE0ALpgTh+RmHZIB59e0l7H0hHS4IP8b76ZOxW2Acg3j0GjN1l/TPex+uZu8LqejUVdmfux4Z64mf4Z1g6W9jt0n//HGQ/nRYdrxDT4qoP/TkiPvaQP4RJoAWTAnCJ05f83SAqk6T5uyV/fl9nxXsfeESBvHotWPPeemfR1+awd4X0oyF+2V/2nmU0BfeCZa25YYnXFR2TXdbdrxDy3KoP1TXmvvaQP4RJoAWTArCyS3CNXfzfPDItf274Ud4NHBy94VLGMSjV+QjKt0pV+yoY89l0s+TxRcbL9qDd4IlSiFEX87JQ8dPXNHalh3vqNQ0VKmE+9pA/hEmgBZMCsJdP8iUH+oJM/ew9uNbwe7kVfbrwiUM4jXTK2997otBKtLPhZoHbyV4J3hSSfGnLcjX2k513qEnRHc/Md6TyShkljABtGBSEJ65yB/509T6Ei8ed/hZGMRrpomz8nyxjGDLzrOyHw+96N16KXgneKLd417E5+q8Q0+IqB+Nmk9ivyaQv4QJoAWTgrCqO0mlhzjXAX4yfrvsR++B2ezXhFMYxGumguNl0kd1Hxsn78Jx9WPgqC2yH1Rxx6s24Z3giUrBST8/Olarn6vzztAJO3y1wQryjzABtGBaEG7YPI099crzv1vgSb1UvwuDeM1Fd93IS3QXjqsPql5q1oYiz9qEd4IpeiqiO19rdd6hyh/Uh+VrC9mvB+QvYQJowbQgrPIBDhm3jaX9i5f+HrojMUXWmCz9Sn/SUz8Lg3jN9cEnG6SfB6RsZmmfNqDQRpR/bjwydLnsG8/ahXeCKSoHp7tue1XeOXPueui2hsNDtZNHov4v9B1hAmjBtCCcub7I07JDVq1cd1y2T4lPua8FtzCI11zZm8P1Sp96ZRZL+/PSD8r2aUOKl+3CO8HUsjWF0k8t2s/T1kZV3lF1tn/T9Qv2awH5T5gAWjAtCJeVfRP68YOjZW1gjh24/YaslwHm49Fb2a8FtzCI11xXrvxHhZ8p16XX7b/Zd6X083iPd9bDO8EUlYL7QcIIrU9IqvKO2ok8Za7+coaQecIE0IKJQZh2mdGHPG12nudtP/bSDNn2ph1n2K8DtzCIuyOVU1J3+gyraCMVVbKhtg8eveRp2/BOcKXWSC/NKtBy/Ft5R90coLapsg33dYD8J0wALZgYhClvGn3I23RZ7Gm7p85ck3dqftR0tLxzw30duIVB3B3RxI/8TBNBL9vdmVcs201qMdnzc4Z3gqvhqTnSV7ReW8fxb+WdNZtOsC6ngPwvTAAtmBiEqbg3PWKgzRhebsRQE0+sLwkLg7g7UmUO6e6Fl18sVDqjXgPWen7O8E5wlbs3/MWCKjfpOP6tvEN1iLE8B6pKmABaMDUIv1D+mGHR8sOetdnp/eWyzbHTd7Ofvx+EQdw9PfnyLOkt2hTiVZu0UJ/apIX7Xp8vvBNc0dKCe8orcRw5dtn149/KO3QnW6ag2XOe/RpA/hQmgBZMDcJjpu2SH/bOHlVRoMXNVLuVHgF7VS7L78Ig7p7+OmKz9DOlhfGivZLSmxV30cnbXp8vvBNsUXUb8nPqZ+6v067MO/sPfSXbi/8Zb5EAyN/CBNCCqUFYVQWhGqZXr+p/bKYe/7bsMJ/93P0iDOLuaXPOGU/LsX2+8ohsr3WnhSznC+8EWypeturofryszDspk3bK9rr1z2I/d8i/wgTQgslB+NHyHbnZW/Q/NqM8aUgv8G1hEHdPVDqLSmiRx6hEnO72VPqXkZNzWc4X3gm26K7ynU3DT0zc9nNl3mn5+nzp5/RMPTuPoWAIE0ALJgdhqp5AH/q+g9dpbYeyy9PjMspvdb74Bvt5+0UYxN2VWmM6QXNOvpILN2XlD6oAQvVbOc4V3gm+3uq3SktVEKt3KCZ/X8TnHybxLGeAzBEmgBZMDsK02JcCTOIv9KaxmDgrT7bz23fS2c/ZT8Ig7q4WLjssfUa1eXW2M3XePtnOS50XsZ0rvBN8qSo3jVtOcXVdntU76nHzy296mxYMMk+YAFowOQhTUGnw9ET54d97oFRbO6q4uJc7jk0QBnF3RYls6z0+Tnpt174Sbe00/+0c2cb8jENs5wrvBF+0rOH+n6dJr23NPevaca3eobRc1AZ9Uec+Z8jfwgTQgulB+L0PV2vN/URpDFSONhQX/7YwiLsv2gWsM4lu/sELFZunLosJJ9d5wjuxIbW7vcdf3fNzpHdofSEtZaidlBI6V/w1+/lC/hYmgBZMD8Ibt5+u2P5fpmFAG1KeLLdrv1Xs5+o3YRB3XwcOX6z4wqFjPdOfyieYvT/yPvlzpOCd2JDy878+Msa1LxyR3vnL8E2Iz5BtYQJoIQhBmEr/UBCgtSBuH/vBF6bJY6/eeIL9PP0mDOJ6RKkzyHPTF+x39bhUZUTV/qVqDZznCO/Ejpq1nS09t3jFEVeOp7xTduUfSyaQ/BmyI0wALQQhCM9afEAGgad/85mrx1UljejuIq1n4T5PvwmDuB7NSw8vav952zmuHndpVoE87hNtZrKfI7wTO1Kb6F59e4krx1PembPkS082TUHBESaAFoIQhOnRgrqzsWWne4uN1Xos3WlmTBUGcT0iP9d9LHxnY89+9zY3te22RB5z3Az+UobwTuyI1uZRCi1KpXX67PUaH095R21mohsA3OcImSFMAC0EJQgPGr1VBoOOPZe5cjyqLqJ2GOfk4fFCZcIgrk/9hqx3da3eyTPXKkq/+WGxPLwTW3qte7prddTJM4Unr8njUeVbLGYAAAf1SURBVPJ0bM6D7AoTQAtBCcI0wKlvmW7U6lW50h5uPR21JW8hDOL6pGqb/stDY1zZDKJKZXXomcF+biR4J7ZEFTrIf0++PKvGxyLPvP/xOnm8/kM3sp8bZI4wAbQQpCD8h38Ll7einWE1OQ4NuPc+NQGlhaoRBnG9orrT5MEZC2u2GYS+wKjNTKvWHWc/LxK8E1uiDUj3PDFeepDWotbkWCWlNyoq2VCaLu5zg8wRJoAWghSE1aYNeixw8VL0jwWGjNsmj/Pca3Nx968KYRDXK1XhoKabQZasOiqPQ0l5/bKZCd6JPU2es7eiclNNUsKMmbZLHufXb33Ofk6QWcIE0ELQgnCL9vNkcJgyd19U7z915posYk7H2Jxzhv18/CwM4np1OaIyyMoo79zRWlZ194+WNXCfkxK8E3uiLx+P/2qm9OLw1Jyoj0Gl5egYK7IL2c8JMkuYAFoIWhCmXFMUHGjQo8HP6ftp0T29v/27S9nPxe/CIK5ftGO3Jn6etiBfvr9Jq6lRvV+X4J3Y1Pptp6Qf6Ut20amrjt+fNjucUqbJ81PxdAZyLEwALQQtCNMgl9wi/A1x5ORcR+/98shFuYmERBnsuc/F78Igrl+0dqqpGOyiqXVKuyPveybV1SS8bgneiV1RpgbyJK3ZdvI+SiFDFUXovZtyzsI7kGNhAmghiEF47aaTMkhQfchDBZdsv69Djwz5vl4DeMtkmSIM4t5o+drC8NrWx8aFzp63n8Klz6DsigTpfrtbAu/Erqh+L8XmWvcNC23LPWf7fV0/yKxIKA3vQNEIE0ALQf0gdeufJYPF879bYGvwo/V+6tEErQPk7r8JwiDundp0WSz92brTQluPcjNWH5Ovp7x/u/aVsPffKngntqXytlIVDzvxmdb70YSRJo5HCy/DO1BUMmIC2Lhx414JCQktqntdUlLSwOTk5A5CKeL3BtG0FdQPUnHJDVnCTSbTHZhdZZA5ePRSRSUR2gHM3XdThEHcO504fa3Cz3/6ZEOVrz1WVCZ3wkfz2NgrwTuxLUq1dX+zVFsbQnbmFYfqNBlVsawH3oGild8ngLeLiVxfMQE8KCZ1rap6oXjds+J1c+l38bO+eH1mNA0G+YNEC47pGyMFDirrVtkkkJJGN2yeJl/zyh8+D5XVID1BrAmB2FttzT0rk52TV4dO2FFpShe626cG1nbd03336FcJ3oEoHyDl8pNfvMdvr/Q1lBBd5WSlpzrkZ3gHilZ+nwBKxGRuYXUTQDHpGywmgT0i3nMpmraC/kHKXF8kH4NRAHnxjYUVqV0oT+CItJ2hnzwcXlTc8vX5NcodGItCIPZelBRaDZr0OJjKFNJGEbpDSDuG1Z2SVh3ny7vg3P2Fd6CqNC/9YOj7jT4NV6npkRHavuucnOSdL74hn8ao2E1LIMjn8A5UEwVmAij+/1ShLhF/X6xXr14dp23RB+nmzfCFCapWriuseCRGUgOo0qtvfxEqvXCTvZ+miXwTC/7xm9ZuPllxV4T0w6SUb3n6nf5ZYrD8hr2fVQnegZTSswqkh5V/1aSPROv+uv8lSz4yVq+Hd6BoRZ6JZk7mKTbvAM5ISkrqFPH3lfj4+Nr6e2co9f5YJ67B0IEiqJTF1R/63+Lnf4q/c+Pu/aQld9cAcEz9QXfFxQ+bEld/2FHh5/8V+i/xe0Zc/JB24v/W4u4eAI64e/A9wsOfiJh8Rfj4/8p/7oj76d+acXcNANcQE7WWYnKXL7QvQvmRa/gcPAJ+N+LvMp39BgD4lXfuiIvr9U/cvQDABcSXlzdu4+4EAGxUNgEUk73EyL/FhK8Z3QWk3xMSEsTLk7O97CMAAAAAAHAJMdHrIyZzRUKLxO8vlP9zLfH3efH3jyyvHS0mgZ2FxiYmJiZ531sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8JCUlDQwOTm5g1CK+L0Bd3+AOTRu3Phx8eO2evXq1UEFLGAX4ZteCQkJLdTfiEFx370oBC4McAICMnCCiCnPCs/Mpd/Fz/oizmRy9wmYg/DLUeGbm0Kr4+Pj63L3B/ie20XM6Sv8clB4pxX9A2JQJReFwIUBTkFABk4QPhks4kwP9bfwzyXO/gCzEP55m7sPwDxEnFmo5jqIQeVEXhQCFwY4BQEZOEHElKlCXSL+vkh3jzn7BMxBxJuxiYmJvxY/BzVq1Kgpd3+AGUTOdRCDyrFOAHFhgFMQkIEThE9miC+ZnSL+vhIfH1+bs0/AKGrRf+rWrXunGJ/yuTsDzMByBxAxiKjkDiAuDHAKAjKwTflThncj/i7j7A8wB/FFs73wS2r5n98T8eZ/WDsEjKGSR8DBjkHipFrSgCy0L0L5kev6bvEIONgXBjjiFj4iZZYH5LTylyIgg2oRfmlGXzTp94SEBGGZ5GzuPgEzEPGmtfDMM/T7Aw880ER4Zyt3n4AZWCaAiEFEJRNAXBhgGwRkEA3iS+ZoEWc6ly8fwM5xYBtao043KUSsGYFNZ8AOwi99hF+KhBaJ318o/7fYjkGVXZTyf4/tCwMcgYAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQK/w/OfiDaWnbB70AAAAASUVORK5CYII=\">"
],
"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))\n",
" \n",
"# or using one of the predefined palettes: colorbrewerq10 (default one), colorbrewerq9 and tableau10\n",
"with replot.Figure(palette=\"tableau10\") as figure:\n",
" figure.plot(np.sin, (-10, 10))\n",
" figure.plot(np.cos, (-10, 10))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"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": 21,
"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": 22,
"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": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 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": 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nO2daXRd5X3uQ7pWP2Sl+YS/KKzU1gSBhIQQoG5CSmiShpbcUpIyNAlpgdKmtKFJGsATBhsPzNgMBgwYgs0Yx3iQJUvybEvyPMuSLdmyZE22jO2u1fvhrnt57/tu2bJQZPtIOjrP3vv/+631xOdYO2if5y897+N9zt77U58CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiCXFxcX35Ofnf/Nc2xQWFj5QVFR0s9dk//iiXO0bAAAAAGSXP/Zl7l5fADf5Yvets23ktxntt5kdHvs/P++3nZ+7XQQAAACArOML3ZxzFUBf+sb6Enh3r+1bcrNnAAAAADAsnK8A+q/N9Lq91/PmESNGfDY3ewcAAAAAWSeDI4AvFBYW3tLreVteXt5nMvlvf/zxxw4AAOySjXUKAIaBDN8CvrPX89ZM/9vhl7+r67/d0aNIoeA9M8B/q8J/vYL3Q12jAGCY6FsAfdkr6P11X/iuDkcBw+P8/Hy/adGiTP/bIXxDCBw5ghQK3jMD/Lcq/NcreJ+91QoAsoYvez/3hW631xv+8XX+ry7wjxv848/12W6qL4G3eU0vKCgozPS/T/jqw5cZ4L9V4b9eFEAAoxC++vBlBvhvVfivFwUQwCiErz58mQH+WxX+60UBBDAK4asPX2aA/1aF/3pRAAGMQvjqw5cZ4L9V4b9eFEAAoxC++vBlBvhvVfivFwUQwCiErz58mQH+WxX+60UBBDAK4asPX2aA/1aF/3pRAAGMQvjqw5cZ4L9V4b9eFEAAoxC++vBlBvhvVfivFwUQwCiErz58mQH+WxX+60UBBDAK4asPX2aA/1aF/3pRAAGMQvjqw5cZ4L9V4b9eFEAAoxC++vBlBvhvVfivFwUQwCiErz58mQH+WxX+60UBBDAK4asPX2aA/1aF/3pRAAGMQvjqw5cZ4L9V4b9eFEAAoxC++vBlBvhvVfivFwUQwCiErz58mQH+WxX+60UBBDAK4asPX2aA/1aF/3pRAAGMQvjqw5cZ4L9V4b9eFEAAoxC++vBlBvhvVfivFwUQwCiErz58mQH+WxX+60UBBDAK4asPX2aA/1aF/3pRAAGMQvjqw5cZ4L9V4b9eFEAAoxC++vBlBvhvVfivFwUQwCiErz58mQH+WxX+60UBBDAK4asPX2aA/1aF/zp1dp5076xrdH/97Gr3hQcW369eiwAgxxC+WrEA4r9l4b9GldsPuxtnrHF/+uCSSF94cPEM9VoEADmG8NWKBRD/LQv/c6st9Z3uztdqeorf6KkVbu7aBvepTz38afVaBAA5hvDVigUQ/y0L/3OjhuZj7sH3t7mCsSVR8fvSxDL39NJad7jtBJ8BBLAK4asVCyD+Wxb+D6/aO066WRV17vKHy6LiFwrgGF8E9x069okZqNchABBA+GrFAoj/loX/w6fSLc3uO0+u7Hm792ezq93WfZ39zkC9DgGAAMJXKxZA/Lcs/M++tu8/8onP+X37iRVu8aZD55yBeh0CAAGEr1YsgPhvWfifPbW0nXBTF+1yxeOWRsXvyxPL3PPlda6t4+R5Z6BehwBAAOGrFQsg/lsW/mdHCzY0uW9Mq4yK36gxS9yv39nyic/5nW8G6nUIAAQQvlqxAOK/ZeH/0LSz4Yj72avVPW/33jhjtVu7u23AM1CvQwAggPDVigUQ/y0L/wen1vYT7rElu13x+O63e8NZvrOX17uOznO/3Xu2GajXIQAQQPhqxQKI/5aF/wNXxbaW6MSOUPxGev3y7S1uf4Zv955tBup1CAAEEL5asQDiv2Xhf+ZqbP4oKnun3+797lMr3codh7MyA/U6BAACCF+tWADx37Lw//zq7Dzp5q1tdF+bXB4Vv4vHL43u4nG+s3sHMgP1OgQAAghfrVgA8d+y8P/c2tl4xP345aqeo37/4B+H6/xlewbqdQgABBC+WrEA4r9l4X//Ckf9wkkdlz5UGhW/KyYti44Cdg7iJI9MZqBehwBAAOGrFQsg/lsW/v+hwqVdbp21vueo371vbXINzYM/ySOTGajXIQAQQPhqxQKI/5aF/2cUju690uuo31WPlrsFNU05mYF6HQIAAYSvViyA+G9Z+N+tcNTvllnreo76/cdbm6KzfnM1A/U6BAACCF+tWADx37Ks+x+O+r1U+cmjfh9uGP6jfn1noF6HAECA5fCNg6wvgGrhP/6rtKPhiPv7F88c9fvF3M3uQEtujvr1nYF6HQIAAVbDNy6yvADGQfiP/7lWOOo3q6LOfXHCmaN+Czfm9qhf3xmo1yEAEGAtfOMmiwtgnIT/+J9Lhc/6/SgGR/36zkC9DgGAAEvhG0dZWwDjJvzH/1xp7toGd9nE7qN+V0+pcIuER/36zkC9DgGAACvhG1dZWgDjKPzH/+FWOML3b7/d2HPULzxWH/XrOwP1OgQAAtIevnGXhQUwzsJ//B9OVW4/7EZPq4yKXzj6F44Cqvepvxmo1yEAEJDm8E2C0r4Axl34j//DobaOk+7RD3e6/DHdR/1uem5t9Pk/9X6dbQbqdQgABKQxfJOktC6ASRH+43+2tXVfp7txxpqo+OWPLXGPL9nt2juyfw/fbM5AvQ4BgIC0hW/SlMYFMEnCf/zPlsLlXeas2t9zUedrpy93q3a2yvcrkxmo1yEAEJCW8E2q0rQAJlH4j//ZUEPzMXf3nA09J3rcN2+zO9R6XL5fmc5AvQ4BgIA0hG+SlZYFMKnCf/wfqkq3NEeXdQnF7/KHy9z7VQfk+zTQGajXIQAQkPTwTbrSsAAmWfiP/4NV+Fzf5A93upGnjvrdMmud23PgqHy/BjMD9ToEAAKSGr5pUZIXwDQI//F/MKo92OV++MLaqPgVjC1xz5TWuo7O+J7ocb4ZqNchABCQxPBNk5K6AKZF+I//A1XJ5kPuiknLovI3emqFW5mAEz3ONwP1OgQAApIWvmlTEhfANAn/8T9Thbd8pyzc1fOW789mV0cnf6j3KxszUK9DACAgKeGbViVpAUyj8B//M9Heg13uRy+u63nLd0bZ3uiyL+r9ytYM1OsQAAhIQvimWUlZANMq/Mf/8ymc5fu1yeVR+fuz8JbvjsPyfcr2DNTrEAAIiHv4pl1JWADTLPzH/7MpnNQxbdEuN+rU7dx+Orva7T+U/Ld8+5uBeh0CAAFxDV8rivMCaEH4j//9qa6pK7qsy+nbuYWzfNPylm9/M1CvQwAgII7ha0lxXQCtCP/xv6/Ktja7r596y/eaKRVu+fZ0veXb3wzU6xAACIhb+FpTHBdAS8J//D+tcITvqZI9PW/5/viVqlS+5dvfDNTrEAAIiEv4WlWcFkCLwn/8D2o6fNzd9XpN91u+vgCGIpjUCzsPZgbqdQgABMQhfC0rLgugVeE//m+u73TffmJFVP6++siy6KxftS+5noF6HQIAAerwta44LICWhf+2/Z9fc9BdNrE0Kn83PLPa7Ww8IvdEMQP1OgQAAlj89OHLDPDfqlT+h7d3w109/vTUXT1+MXeza2k7IfdDNQP1OgQAAlj89OHLDPDfqhT+NzZ/FJ3gcfquHi9V1qX2Ei+ZzkC9DgGAABY/ffgyA/y3qlz7X13b7q6dvjwqf+FSL5Upv8RLpjNQr0MAIIDFTx++zAD/rSqX/r+9rtFdMmFpVP5uem6Nqz3YJX/9cRAFEMAoLH768GUG+G9VufC/reOkm/C77T2f97v/3a2urd3m5/3ONgP1OgQAAlj89OHLDPDfqobb/32Hjrm/f7H7lm7F45a6N1btl7/muIkCCGAUFj99+DID/Leq4fS/Zm+7+/NplVH5+7OpFW7Nrlb5642jKIAARmHx04cvM8B/qxou/xfUNLlLH+q+vt/Nz6+NjgSqX2tcRQEEMAqLnz58mQH+W1W2/Q+Xc3l6aa0beerzfr98ewuf98tgBup1CAAEsPjpw5cZ4L9VZdP/w20n3L1vbeq5n+/z5bav7zeQGajXIQAQwOKnD19mgP9WlS3/65q63A9mronK35cmlrnFmw7JX1tSRAEEMAqLnz58mQH+W1U2/F+3p81dM6UiKn/femy521TfIX9dSRIFEMAoLH768GUG+G9VQ/X//aoDPRd3vnXW+ug2b+rXlDRRAAGMwuKnD19mgP9WNVj/w2f7Hlu8u+fizg+8ty264LP69SRRFEAAo7D46cOXGeC/VQ3G/+bW4+6eORu6T/YYW+JerqyXv44kiwIIYBQWP334MgP8t6qB+l974Kj762dXR+Xv8ofLXOmWZvlrSLoogABGYfHThy8zwH+rGoj/VXva3dWnTvb49hMr3Lb9nfL9T4MogABGYfHThy8zwH+rytT/RRvP3NnjtpfWuwMtnOyRzRmo1yEA6IfCwsIHioqKbvaa7B9fdLbtiouLv+L/+KMRI0Z8tqCgoDDT/z6Lnz58mQH+W1Um/ofP+IULO4fy96twZw9O9sj6DLKyWAFA9vCFb7QvdrPDY//n530JnH+2bf3XtvlturwW5OXlXZjp92Dx04cvM8B/qzqX/x2dJ92E+Tui4hdu7RZu8cadPYZnBtlYrwAgi/gyN9aXwLtPP/clr+Uc294xmO/B4qcPX2aA/1Z1Nv/Dmb53vV4Tlb/icUvdu+sa5fuaVlEAAWKIL3wzvW7v9bw5vMXb37a+AE4vKCi4wf85ZuTIkZdk+j1Y/PThywzw36r687++qcvdOKP7tm5XTFrmVuw4LN/PNIsCCBBDfJl7obCw8JZez9vy8vI+c5bNLwj/c+GFF/6JL4rVmX6PEL5dXd0hgHKv4D0zwH+r6uv/proO9+fTKqPyd93jK9z2hk75PqZdwfshLlUAkG1OvQV8Z6/nrf1tV1BQcJP/2lOnnn7aF8D/yfR7OACAGFDd2OUuf2RZ95m+r1S7E//7/6h3yQxDXKoAINv4Und1OAoYHufn5/teV7QoPPalsKD3dr4AXu+/flV4PGrUqIv9duWZfo/wy8/RD+2/vpkB/lvVaf/fXL3fFYwticrfv7+1ybV1nJDvmxVxBBAgpviyN9WXwNtOfcYvXN7lAl/wGvzff67PdneHo4X+a5M4Czg5Ct4zA/y3q5Pu6Yr6nnv6Tlu0izN9c6zws5/1hQsA4g+Lnz58mQH+W1Rb+4noaF8ofoXjStxvVzfI98miKIAARmHx04cvM8B/a2o6fNzdOmt99z19H1nmyre1yPfJqiiAAEZh8dOHLzPAf0vae7DLff+ZVVH5u2ZKhdvf+d/4LxQFEMAoLH768GUG+G9Fm+s7ey7z8p0nV7rag0fxXywKIIBRCF99+DID/LeglTsOu6+cuszLD19Y6w60fIT/MRAFEMAohK8+fJkB/qddv6856C4evzQqf/fM2eAOt53A/5iIAghgFMJXH77MAP/TrFeW17v8Md2XeRn7wXbX0esyL/ivFwUQwCiErz58mQH+p1Hhen5TFu7qucbfM6W1+B9DUQABjEL46sOXGeB/2tTWcdLdN29zzzX+5q7p/xp/+K8XBRDAKISvPnyZAf6nSc2tx91PXqmKyt+lD5W6pZub8T/GogACGIXw1YcvM8D/tGjfoWPub55dHZW/r08ud+v3tOF/zEUBBDAK4asPX2aA/2nQzoYj7luPLY/K33WPr4ie43/8RQEEMArhqw9fZoD/SdeGvR3uqkfLo/L3g5lr3P5Dx/A/IaIAAhiF8NWHLzPA/yQrXOD58ofLovJ3+0vro88A4n9yRAEEMArhqw9fZoD/SdXiTYfcJRO6L/D8L29sdG3tJ/A/YaIAAhiF8NWHLzPA/yRq3tpGVzC2JCp/D7y37RMXeMb/5IgCCGAUwlcfvswA/5OmFyvq3MhTF3ievnh3dNFn/E+mKIAARiF89eHLDPA/Kep9d49QAF+qrMP/hIsCCGAUwlcfvswA/5Og8Bbvb97dGpW/8Nbv2+sa8T8FogACGIXw1YcvM8D/uKu1/YS7Z86GqPyFkz7CyR/4nw5RAAGMQvjqw5cZ4H+cdaj1uLvtpfVR+fvKI8vcyp2t+J8iUQABjEL46sOXGeB/XBUu6HzjjDVR+bt6SoXbWNeB/ykTBRDAKISvPnyZAf7HUbUHjrrrn1hx5tZujee/tRv+J08UQACjEL768GUG+B83bd9/xH1jWmVU/m54ZrXbl+Gt3fA/eaIAAhiF8NWHLzPA/zgpvM17+r6+f/f8Wnfw8Ef4n2JRAAGMQvjqw5cZ4H9ctGZXa3SiRyh/P365akD39cX/ZIoCCGAUwlcfvswA/+Og8m0t7tKHSqPy989zNgz4vr74n0xRAAGMQvjqw5cZ4L9aCzc2ueLxS6Pyd9+8za69Y3C3dsP/5IkCCGAUwlcfvswA/5V6d11jdGePUP7GfbB90Pf1xf9kigIIYBTCVx++zAD/VXp95T43asySqPxNW7Qrp+UP/+MhCiCAUQhfffgyA/xX6Plle6PiFzSzbC/+GxUFEMAohK8+fJkB/udS4Sjf9MW7o+IXjv69tnIf/hsWBRDAKISvPnyZAf7nSqH8jf/d9qj8hc/9hc//4b9tUQABjEL46sOXGeB/LtThy98v394Slb9wxm8481e9T5b8j6sogABGIXz14csM8H+41dZx0v38zY1R+QvX+gvX/FPvkyX/4ywKIIBRCF99+DID/B9OtbafcHe9XhOVv8sfLnOrdrbK98mS/3EXBRDAKISvPnyZAf4Pl1raTrifvFIVlb8rJi1z6/e0yffJkv9JEAUQwCiErz58mQH+D4fCfXxvmbUuKn9fn1zuNtZ1yPfJkv9JEQUQwCiErz58mQH+Z1sHD3/kbnpuTVT+Rk+tcFv3dcr3yZL/SRIFEMAohK8+fJkB/mdTDc3H3F8/uzoqf9dOX+52Nh6R75Ml/5MmCiCAUQhfffgyA/zPluqbutx3n1oZlb9vP7HC1R7sku+TJf+TKAoggFEIX334MgP8z4ZqDxx11/nSF8rf955e5fYdOibfJ0v+J1UUQACjEL768GUG+D9U7Ww44r45vTIqfzfOWO0amz+S75Ml/5MsCiCAUQhfffgyA/wfisIJHtdMqYjK3989vzY6AUS9T5b8T7oogABGIXz14csM8H+w2rC3w105uTwqf7fOWh9d+kW9T5b8T4MogABGIXz14csM8H8wqtrT7r76yLKo/N0xu9odbjsh3ydL/qdFFEAAoxC++vBlBvg/UK3d3Rbd1i2Uv3Cbt7b25JW/JPufJlEAAYxC+OrDlxng/0AU7uX75Ynd5e9f3tjo2jpOyvfJkv9pEwUQwCiErz58mQH+Z6rK7YfdpQ+VRuXv3rc2ufYEl78k+p9GUQABjEL46sOXGeB/Jirf1uK+OKG7/N03b7Pr6Ex2+Uua/2kVBRDAKISvPnyZAf6fT6Vbmt3F45dG5e+/3tmaivKXJP/TLAoggFEIX334MgP8P5cWbzrkik+VvzHvb3OdKSl/SfE/7aIAAhiF8NWHLzPA/7NpQU2TKxpXEpW/CfN3pKr8JcF/C6IAAhiF8NWHLzPA//70QdUBVzC2u/xNWrAzdeUv7v5bEQUQwCiErz58mQH+99W76xpd/qnyN3XRLvn+WPPfkiiAAEYhfPXhywzwv7fmrmlw+WOWROXvyZI98v2x5r81UQABjEL46sOXGeD/ab2xar8bdar8PVtWK98fa/5bFAUQwCiErz58mQH+B726Yp8b+WB3+Xu+vE6+P9b8tyoKIIBRCF99+DID/J+9vL6n/L1UaaP8xcl/y6IAAhiF8NWHLzOw7f9LlfVR8QsFMBRBtSfW/LcuCiCAUQhfffgyA7v+v1hR11P+Xlu5T+6HNf8RBRDALISvPnyZgU3/w+f8Tpe/Oav2y72w5j86MwP1OgQAAghfffgyA3v+zyjbG5W/cMbvm6ttlj+l/+iTM1CvQwAggPDVhy8zsOX/M6W1PeXvrTUNcg+s+Y/+cAbqdQgABBC++vBlBnb8f6pkT1T+woWe561tlL9+tfj514sCCGAUwlcfvszAhv+PL9ndXf7GlkS3elO/9jiIn3+9KIAARiF89eHLDNLv//TFZ8rfe+sPyF93XMTPv14UQACjEL768GUG6fZ/ysJdUfkr8OXvg+qD8tccJ/HzrxcFEMAohK8+fJlBOv3v7DzpJn+4Myp/heNK3Pwayl8u/UeZz0C9DgGAAMJXH77MIH3+h/I3aUF3+Svy5W9BTZP8tcZR/PzrRQEEMArhqw9fZpAu//uWvw83UP5y6T8a+AzU6xAACCB89eHLDNLjfyh/j/Qqfws3Uv5y6T8a3AzU6xAACCB89eHLDNLhf3f520H5E/mPBj8D9ToEAAIIX334MoPk+9+3/C2i/OXUfzS0GajXIQAQQPjqw5cZJNv/UP4e/n13+Sset5Tyl2P/0dBnoF6HAEAA4asPX2aQXP9D+ZvYq/wt3nRI/pqSJH7+9aIAAhiF8NWHLzNIpv+UP63/KHszUK9DACCA8NWHLzNInv+h/D00n/Kn8h9ldwbqdQgABBC++vBlBsnyP5S/CZQ/mf8o+zNQr0MAIIDw1YcvM0iO/1H5+932nvK3ZDPlL5f+o+GZgXodAgABhK8+fJlBMvz/RPkbT/nLtf9o+GagXocAQADhqw9fZhB//0P5G9+r/JVQ/nLqPxreGajXIQAQQPjqw5cZxNv/UP7GfUD5U/mPhn8G6nUIAAQQvvrwZQbx9Z/yp/Uf5WYG6nUIAAQQvvrwZQbx9D+Uv7G9yt/Szc3y/U2b+PnXiwIIYBTCVx++zCB+/ofyN+aDbT3lr3QL5S+X/qPczkC9DgGAAMJXH77MIF7+R+Xv/e7ydzHlL+f+o9zPQL0OAYAAwlcfvswgPv5T/rT+I80M1OsQAPRDYWHhA0VFRTd7TfaPLxrqdn0hfPXhywzi4X8ofw9S/mT+q/fFqiiAADHEF7nRxcXFs8Nj/+fnfbmbP5Tt+oPw1YcvM9D7f+TISffAe5Q/lf/8/GtnkJ0VCwCyhi9zY325u/v0c1/sWoayXX8QvvrwZQZa/z/++OOeI3+XTFjqyrZS/nLpPz//+hkMbaUCgKzji9xMr9t7PW8eMWLEZwe7XX8QvvrwZQZKnXQPL9pN+ROJn3+9KIAAMaS4uPiFwsLCW3o9b8vLy/vMYLfrjxC+XV3dIYByr+A9M9Aoetv3/a095a98W4t8n6yJn3+9gvfZWbEAIGucemv3zl7PW4eyXX84AIOEt30nLuw+8vfFh0rdhgPH1LsEIGNoKxUAZB1f5K4OR/fC4/z8/CLPovDYl72CTLbLhPDLz7++tf/6Zga5VTjyd/97Z478hfKH/xrx868XRwABYoove1N9ubvNa3pBQUGh/6sLfMFr8H//ufNslxEhfEMIqD+HYlXBe2aQO4VLvfzm3e7y98UJpa5iWwv+C8XPv17B+6wvXAAQfwhfffgyg9wolL//eueT5Q//tcJ/vSiAAEYhfPXhywyGX/2VP/zXC//1ogACGIXw1YcvMxhehfL363e2/EH5w3+98F8vCiCAUQhfffgyg+FTKH+/OlX+Ln3Il7/tLZ/4Ov5rhf96UQABjEL46sOXGQyPOs5T/vBfL/zXiwIIYBTCVx++zCD7isrf22fKX+X2w/gfQ+G/XhRAAKMQvvrwZQbZVablD//1wn+9KIAARiF89eHLDLKnUP5+2av8LT9H+cN/vfBfLwoggFEIX334MoPsKJS//5y3OePyh/964b9eFEAAoxC++vBlBkNX3/K3Ysf5yx/+64X/elEAAYxC+OrDlxkMTaH83TeI8of/euG/XhRAAKMQvvrwZQaDVyh/v5h7pvytHED5w3+98F8vCiCAUQhfffgyg8Gpd/m7bOLAyx/+64X/elEAAYxC+OrDlxkMXH9Q/na24n8Chf96UQABjEL46sOXGQxM2Sp/+K8X/utFAQQwCuGrD19mkLlC+fuPtzb1lL9VQyh/+K8X/utFAQQwCuGrD19mkJl6l78vTSwbcvnDf73wXy8KIIBRCF99+DKD8yuUv3/vVf5W7xp6+cN/vfBfLwoggFEIX334MoNza7jKH/7rhf96UQABjEL46sOXGZxd7R0n3b2nyt+Xs1z+8F8v/NeLAghgFMJXH77MoH+F8vdvvz1T/tZkufzhv174rxcFEMAohK8+fJnBHyqUv5+/uXFYyx/+64X/elEAAYxC+OrDlxl8Um2+/N3zxoao/F3+cJlbu7sN/1Mq/NeLAghgFMJXH77M4IxC+fvnOWfK37o9w1f+8F8v/NeLAghgFMJXH77MoFtt7SfcXa/XROXvq48sc1V72vE/5cJ/vSiAAEYhfPXhywz+27X68vePr3aXvysmLXPVtcNf/vBfL/zXiwIIYBTCVx++1mcQyt8ds6t7yl/N3tyUP/zXC//1ogACGIXw1Yev5RkcbjvhfvJKVVT+rpxc7jbWdeC/IeG/XhRAAKMQvvrwtTqDFl/+fvxyd/n7ui9/m+pzW/6s+x8H4b9eFEAAoxC++vC1OINQ/m57aX1U/q56tNxtqe/Ef4PCf70ogABGIXz14WttBs2tx92ts7rL39VTKtzWfZryZ9X/OAn/9aIAAhiF8NWHr6UZhPL3oxfXReXvz6ZWuG37deXPov9xE/7rRQEEMArhqw9fKzM45MvfD19YG5W/0b78bd9/RL5PlvyPo/BfLwoggFEIX334WpjBwcMfuZueWxOVvz+fVul2NujLnyX/4yr814sCCGAUwlcfvmmfwYGWj9yNM7rL37XTl7tdjUfl+2TJ/zgL//WiAAIYhfDVh2+aZ9DQfMzd8MzqqPz9xePLXe2B+JQ/C/7HXfivFwUQwCiErz580zqDfYeOue89vSoqf9c/scLtPdgl3ydL/idB+K8XBRDAKISvPnzTOIO6pi73l0+ujMrfd59aGZVB9T5Z8j8pwn+9KIAARgp4UcIAABdgSURBVCF89eGbthnUHuxy1z2xIip/339mldsf0/KXVv+TJPzXiwIIYBTCVx++aZrB7saj7trHlkfl78YZq6MTQNT7ZMn/pAn/9aIAAhiF8NWHb1pmEC7t8o1plVH5+9vn1kSXflHvkyX/kyj814sCCGAUwlcfvmmYQbijR7i4cyh/4WLP4aLP6n2y5H9Shf96UQABjEL46sM36TPYUt8Z3dM3lL9bZq2Lbvem3idL/idZ+K8XBRDAKISvPnyTPIONdR3u65PLo/L3Dy9XuZa2E/J9suR/0oX/elEAAYxC+OrDN6kzqKptd1dMWhaVvztmV7vDCSt/Sfc/DcJ/vSiAAEYhfPXhm8QZrNnV6i5/uCwqf3e+VuPa2pNX/pLsf1qE/3pRAAGMQvjqwzdpM6jcfthdNrE0Kn//+uZG19ZxUr5PlvxPk/BfLwoggFEIX334JmkGpVua3SUTlkbl7755m11HZ3LLXxL9T5vwXy8KIIBRCF99+CZlBgs3Nrnicd3l7/73trrOhJe/pPmfRuG/XhRAAKMQvvrwTcIMPqg64ArHlUTlb+Lvd6Si/CXJ/7QK//WiAAIYhfDVh2/cZzB3bYPLH7MkKn/TFu2S7481/9Ms/NeLAghgFMJXH75xnsFrK/e5UafK3zOltfL9seZ/2oX/elEAAYxC+OrDN64zeKG8Lip+QS9W1Mn3x5r/FoT/elEAAYxC+OrDN44zeHppbVT8wtG/cBRQvT/W/Lci/NeLAghgFMJXH75xmkE4uWPqol1R+Quf+wuf/1PvkyX/rQn/9aIAAhiF8NWHb1xmEMpfOMM3lL9wxm8481e9T5b8tyj814sCCGAUwlcfvnGYQbig82/e3RqVv3Ctv3DNP7U3lvy3KvzXiwIIYBTCVx++6hmEW7n92283RuXvixNKo7t9qH2x5L9l4b9eFEAAoxC++vBVzuBw2wn3s1ero/J3+cNlbuXOVrknlvy3LvzXiwIIYBTCVx++qhkcaj3ubpm1Lip/V04ud1W17XI/LPmP8D8OogACGIXw1YevYgaNzR+5H8xcE5W/0VMr3NZ9nXIvLPmP8D8uogACGIXw1YdvrmdQ19TlvvvUyqj8Xff4Cre78ajcB0v+I/yPkyiAAEYhfPXhm8sZ7Gw84r712PKo/H3v6VWu3pdBtQeW/Ef4HzdRAAGMQvjqwzdXM9hc3+mumVIRlb+/fW6NO9Dykfz1q0UBwX/rogACGIXw1YdvLmZQtafdXTFpWVT+bp213jW3Hpe/9jiIAoL/1kUBBDAK4asP3+GewYodh92XJ5ZF5e+fXquJLv2ift1xEQUE/62LAghgFMJXH77DOYOlm5vdJROWRuXv3rc2RRd9Vr/mOIkCgv/WRQEEMArhqw/f4ZpBuJdv0biSqPzd/97W6HZv6tcbN1FA8N+6KIAARiF89eE7HDN4dcU+N2rMkqj8TVqw03VS/nLqP8L/pIgCCGAUwlcfvtmewVMle6LiFzSzbK/8NcZZFBD8ty4KIIBRCF99+GZrBuEo37gPtkfFL39siXtz9X7564u7KCD4b10UQACjEL768M3GDMLJHf/+1qao/BWPX+oWbGiSv7YkiAKC/9ZFAQQwCuGrD9+hziBc0++O2dVR+fvSxDJXsb1F/rqSIgoI/lsXBRDAKISvPnyHMoNwN4+bnlsblb8rJ5e7qtp2+WtKkigg+G9dFEAAoxC++vAd7Az2Huxy331qZVT+vjm90m3ff0T+epImCgj+WxcFEMAohK8+fAczg637Ot03plVG5e97T69ydU1d8teSRFFA8N+6KIAARiF89eE70Bms39Pmvja5PCp/Nz+/NnobWP06kioKCP5bFwUQwCiErz58BzKD8m0t0Ykeofz9bHa1a+G+vjn1H+F/2kQBBDAK4asP30xn8Lvqg9ElXkL5+8XczdzXN8f+I/xPoyiAAEYhfPXhm8kMXqqs77m124T5O7i1W479R/ifVlEAAYxC+OrD91wzCEVv8oc7o+I3klu75dx/hP9pFwUQwCiErz58zzaD8BZveKs3lL/CcSXu7XWN8v1Nmygg+G9dFEAAoxC++vDtbwaHWo+7f3i5Kip/l00sdaVbmuX7mkZRQPDfuiiAAEYhfPXh23cG9U1d7oZnVkfl76pHubtHrv1H+G9JFEAAoxC++vDtPYNwgedwV49Q/r79xAq3s5G7e+TSf4T/1kQBBDAK4asP39MzWLWz1V0xaVlU/sL9fRubucBzLv1X74tF4b9eFEAAoxC++vANLNzY5C6Z0H2Nv7ter+ECzzn2n98B/LcqCiCAUQhfffh+sLnF5Y8ticrf/e9tdR1c4y+n/vM7gP+WRQEEMArhq1O4xt9jS3ZHxS/oqZI9XOA5x6KA4L91UQABjEL4atTWfsL957wz1/j77Zr98n2yKAoI/lsXBRAgJhQWFj5QVFR0s9dk//iic21bXFz8Ff/HH40YMeKzBQUFhYP5foRv7nWg5SN366z1Ufm79KFSt3b/UWYgEgUE/62LAggQA3zhG+1L3ezw2P/5eV8C559re//1bX67Lq8FeXl5Fw7mexK+uVW4rMtfPrkyKn/XTKlw1XvbWQCFooDgv3VRAAFigC9yY30JvPv0c1/wWs6z/R1D/Z6Eb+60Zleru3JyeVT+vv/MKld74CgLoFj4j//WRQEEiAG+8M30ur3X8+bw9u7ZtvcFcHpBQcEN/s8xI0eOvGQw3zOEb1dXdwig4dPvaw72XObljtnVrrntePT3wXtmoBP+4791Be8Hs3YAQBbxRe6FwsLCW3o9b8vLy/vMOf4vF4T/ufDCC//El8XqwXxPB8POnPUH3Kgx3Wf6PrJ4j/u//+9j9S4BAPQwmLUDAAaIL3XXhrLmVdVH88ORPF8A7+y1bevZ/jsFBQU3+a8/derpp/3//38Gsz/hl59/fQ+PwvX8Hnx/W1T8QgF8btnefv/1zQx0wn/8ty6OAALEAF/org5HAcPj/Px83+mKFp3+mi+GBb239QXwer/NVeHxqFGjLvbblg/me4bwDSGg/hxK2nSo9bj76ezqqPxdPH6p+131wbN+/oYZ6IT/+G9dwfuhrFsAkCV80ZvqS+Btpz7fd/rSLhf4gtfgv/a5PtveHY4Y+q9N4izg+Kj2YFd0kkcof+Gkj3Dyx7nClxnohP/4b10UQACjEL7ZVVVte3R5l1D+wuVewmVfzhe+zEAn/Md/66IAAhiF8M2eFm5sii7sHMpfuNBzuOBzJuHLDHTCf/y3LgoggFEI36Er3L93RtnenjN9wy3ewq3eMg1fZqAT/uO/dVEAAYxC+A5Nrb7o/WLu5p4zfUMRDIVwIOHLDHTCf/y3LgoggFEI38GrvqnL3fTc2qj8XTaxNHoLeDDhywx0wn/8ty4KIIBRCN/BqWpPuxs9tftkj29Or3Qb6zoGHb7MQCf8x3/rogACGIXwHbg+qD7ovjih+2SPH724zu0/dGxI4csMdMJ//LcuCiCAUQjfzBU+2/fEkj1u5IPdJ3v81ztbMz7Z41zhywx0wn/8ty4KIIBRCN/M1NJ2wv3rmxuj4pc/Zol7saIua+HLDHTCf/y3LgoggFEI3/Mr3Nnjb55dHZW/L08scyWbD2U1fJmBTviP/9ZFAQQwCuF7boXbuF31aHlU/q57fIXbUt+Z9fBlBjrhP/5bFwUQwCiE79k1b22jKx6/NCp/t7+U2Z09BhO+zEAn/Md/66IAAhiF8P1DtXWcdGM/2B4Vv6AxH2xz7R2ZX9x5oOHLDHTCf/y3LgoggFEI308qXNz5hy+si4pfOPr3xqr9wx6+zEAn/Md/66IAAhiF8D2j1bta3TVTui/uHC7yvHZ3W07ClxnohP/4b10UQACjEL7dem3lPlc0riQqf7fOWu/2DeHizgMNX2agE/7jv3VRAAGMYj18W9tPuF+/s6Xn834Pzd8xbJ/3O1v4Wp+BUviP/9ZFAQQwiuXw3XPgqPvBzDVR8Qu3dnt3XaMkfC3PQC38x3/rogACGMVq+FZsa3Ffm9x9fb9rH1vuava2y8LX6gziIPzHf+uiAAIYxVr4hvv5vlBe5/LHdn/e76ezq4fl+n4DCV9rM4iT8B//rYsCCGAUS+Hb3Hrc3fvWpqj4jfSatmiX6+jM3ef9zha+lmYQN+E//lsXBRDAKFbCd3N9p/vOUyuj8veliWVuwYYm+T6dDl8rM4ij8B//rYsCCGAUC+E7d21DdJJHKH+hBG7dl937+Q41fC3MIK7Cf/y3LgoggFHSHL4tbSfcr3pd4uVXb2+J/k69X33DN80ziLvwH/+tiwIIYJS0hm84yve9p1f1XOLlrTUN8n06W/imdQZJEP7jv3VRAAGMksbwfWddo7v0oVNv+T650m2s65Dv07nCN40zSIrwH/+tiwIIYJQ0he/hthPuN+9u7XnL9755m6Mzf9X7db7wTdMMkib8x3/rogACGCUt4Rve8v3+M91v+V4yYal7c/V++T5lGr5pmUEShf/4b10UQACjpCF8311/wF02sfst3+ufWBHrt3z7C980zCCpwn/8ty4KIIBRkhy+re0n3P3vnXnL9z/e2hT7t3z7C98kzyDpwn/8ty4KIIBRkhq+4SjfX506y/fi8UvdnFXJeMu3v/BN6gzSIPzHf+uiAAIYJWnhG+7lO6uizhX70nf6Ld+ave3y/RpK+CZtBmkS/uO/dVEAAYySpPCtb+pyP3mlquct3wfe2xa7CzsPJnyTNIO0Cf/x37oogABGSUr4frihyV0xaVlU/L42udwt3BiPe/lmI3yTMoM0Cv/x37oogABGiXv4hiN8vU/0+Ons6uhIoHq/shm+cZ9BmoX/+G9dFEAAo8Q5fKv2tEef8QvFL3zm76XKuugzgOr9ynb4xnkGaRf+4791UQABjBLH8O3wJW9G2V5XNK4kKn/hbN8kXdtvoOEbxxlYEf7jv3VRAAGMErfwrT1w1N06a31U/EZ6TZi/I7ren3q/hjN84zYDS8J//LcuCiCAUeIUvuGOHpc/XBaVv6seLXelW5rl+5SL8I3TDKwJ//HfuiiAAEaJQ/juO3TM3T1nQ8+JHne9XuMamo/JgzFX4RuHGVgV/uO/dVEAAYyiDt931zW6rz7SfXmXcPTvzdX7U3eix/nCVz0Dy8J//LcuCiCAUVThGy7lctfrZ476/Wx2tas9mJ7LuwwkfFkA8d+q8F8vCiCAURTh+3afo35z1zSYOurXN3xZAPHfqvBfLwoggFFyGb51TV3uztdqeo76/eOrNW6vwaN+fcOXBRD/rQr/9aIAAhglF+Ebju7NW9vovtL7qN9au0f9+oYvCyD+WxX+60UBBDDKcIdvOML3T72O+oXHdSm6lVs2wpcFEP+tCv/1ogACGGW4wjcc3Qtn9J6+rl84+hc++6cOu7iJBRD/LQv/9aIAAhhlOMJ3677Onrt5dF/Xb0N01q866OIoFkD8tyz814sCCGCUbIZvW/sJ98SSPa54/NKo+H19crl7b/0BecDFWSyA+G9Z+K8XBRDAKNkK3xU7DrvvPLmy5x6+v3l3qzvQ8pE83OIuFkD8tyz814sCCGCUoYZvuGXbr9/ZEpW+UP5CCQxlUB1qSRELIP5bFv7rRQEEMMpgw7ej86R7beW+ngs6h7d9nyzZE70NrA60JIkFEP8tC//1ogACGGUw4btuT5v7XzPX9Jzkccfsard9/xF5kCVRLID4b1n4rxcFEMAoAwnf8Jm+B97b5kaN6S5+o6dVut/XHJQHWJLFAoj/loX/elEAAYySSfi2d5x0s5fXuysmdb/dWzSuxD364U7X3HpcHl5JFwsg/lsW/utFAQQwyvnCt3xbi/urp1f1vN3745er3Jb6TnlopUUsgPhvWfivFwUQwChnC9+djUfcPXM29BS/bz223C3Y0CQPq7SJBRD/LQv/9aIAAhilb/g2HT7upizc1XMx58smlrpnS2s5u3cYw5cFEP+tCv/1ogACGOV0+IbP+b2yvN59bXJ5z8Wc/3PeZlfHLdyGPXxZAPHfqvBfLwoggFE+/vhj9+HGJnf9Eyt63u69Zda66FIv6mCyIBZA/Lcs/NeLAghgkIt+s7jox6/W9BS/UAIXbuRzfrkOXxZA/Lcq/NeLAghgkC88uHhhKH5XTi6PLvMS3gZWh5E1sQDiv2Xhv14UQACDfOHBJVfOrWlyzW1cz08ZviyA+G9V+K8XBRDAKISvPnyZAf5bFf7rRQEEMArhqw9fZoD/VoX/elEAAYxC+OrDlxngv1Xhv14UQACjEL768GUG+G9V+K8XBRDAKISvPnyZAf5bFf7rRQEEMArhqw9fZoD/VoX/elEAAYxC+OrDlxngv1Xhv14UQACjEL768GUG+G9V+K8XBRDAKISvPnyZAf5bFf7rRQEEMArhqw9fZoD/VoX/elEAAYxC+OrDlxngv1Xhv14UQACjEL768GUG+G9V+K8XBRDAKISvPnyZAf5bFf7rRQEEMArhqw9fZoD/VoX/elEAAYxC+OrDlxngv1Xhv14UQACjEL768GUG+G9V+K8XBRDAKISvPnyZAf5bFf7rRQEEMArhqw9fZoD/VoX/elEAAYxC+OrDlxngv1Xhv14UQACjEL768GUG+G9V+K8XBRDAKISvPnyZAf5bFf7rRQEEMArhqw9fZoD/VoX/elEAAYxC+OrDlxngv1Xhv14UQACjEL768GUG+G9V+K8XBRDAKISvPnyZAf5bFf7rRQEEiBHFxcX35Ofnf/N82xUWFj5QVFR0s9dk//iiwXwvwlcfvswA/60K//WiAALEgz/2Re5eXwA3+VL3rXNt6Lcb7bebHR77Pz/vt58/mG9I+OrDlxngv1Xhv14UQIAY4cvcnPMVQF/6xvoSeHev/0/LYL4X4asPX2aA/1aF/3pRAAFiRCYF0H99ptftvZ43jxgx4rMD/V4hfLu6ukMA5V7Be2aA/1aF/3oF7wezTgHAMJDhEcAXCgsLb+n1vC0vL+8zw793AAAAADAgfFG71pe7aq+qXqru/Rm+AbwFfGev563Dud8AAAAAMIz0VwB92Svo/dwXvqvDUcDwOD8/329etCiX+wgAAAAAWcIXvZ/7Mrfb6w3/+LpTf32Bf97gn3+uz7ZTfQm8zWt6QUFBYe73FgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7FFYWPhAUVHRzV6T/eOLhrodDIxMfS0uLv6K/+OPRowY8VnucpR9vL/35Ofnf/Nc2/A7AJBSMgmAACGQfQbiKQth9vBej/Z+zg6P/Z+f9/7PH8p2MDAG4qv/2ja/TZfXgry8vAtzt5ep54/9HO71vm7qe7/53vA7AJBOMgqAACGQfQbqKQth9vAejvX+3336ufe2ZSjbwcAYiK9+2ztys1c28d7POVf+8zsAkGLOFwABQiD7DNRTFsLs4b2e6XV7r+fN4cjqYLeDgTEQX/3P/fSCgoIb/J9jRo4ceUnu9tIG58t/fgcAUkwmBZAQyD4D9ZSFMHt4D1/w5fuWXs/b8vLyPjPY7WBgDNDXC8L/XHjhhX/if0eqc7KDhsjgCCC/AwBpJcMjgIRAlhmEpyyEWeLU0dc7ez1vHcp2MDAy9dX/g+cm/7WnTj39tP+5/5+c7KAhMnwLmN8BgKThf1mvDWXBq6qXqnt/3mwAbwETAgPkLP4HzQ9H8jL1lIUwu3gvrw4FPDzOz8/3dhYtCo/9PAoy2Q6GRqb++5/76/3XrwqPR40adbHfrjz3e5tu+uY/vwMAhuivABICw8+5PGUhHH68x1O9/7edems9nFV9gfe1wf/9586zHWSBAfh/d/iHkv/aJE5+yi7e1597X3d7veEfX/cpfgcA7NBPAAQIgRxxFk9ZCAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHLC/wdpo3tEbIja6wAAAABJRU5ErkJggg==\">"
],
"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": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 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": 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": [
"# 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": 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": [
"# 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": 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"
},
{
"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() # Show the figure with only the plot above\n",
" fig.plot(range(10), [-i for i in range(10)]) # Add an extra plot to the figure\n",
" # Figure is shown again when going out of scope, with two subplots this time"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## One-liner plotting\n",
"\n",
"You can also make plot with a one-liner."
]
},
{
"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": [
"# 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": 31,
"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": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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w6kf9/2dIsSRx/aeeUf73i1/a9975qZje710pu8vFCMy+3UUvvi/j+k1c6RvXwwgxrHj6BunfjLz1VmwcearM//xN8/8d9/fKUYcc8eMyzP77ct89k/H9p5xse/vEyPaXTfzE/DBzB//I1v3r3zu1qmf8f2dEo4oBbHuWeBblXFlGVeV57coHI9cU/b3/Ra+7pEW3rP5cPPwv/f9FaJHsiEXrK/pyGJcQojAA0pa86bI1vpdH/P9JRIUUS04ZoGwU/nfs2B4Gp6Q8eeOHTtmL+8yw+V3TEhISNBFinEJCQkJFciC4A1ZoNuccUL253PFPx+Z/X1n9vdPVbx2YBYgL8s4qFOnTp3df9uEhIQENaQYl5CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJBQXHTu3LlXly5dLsp4b/bnz/n+Pj7QtWvXk7L/ffzoo4/+ZLN1nMjGfl3Hjh3Ppr8nf0goIprdr5s5xgEpzlVBpVGAZjVMMy6QbH67ZeN+En/O/v/ZbM5f8P2dfCAb95vZ+D/MOL1du3ZH+f4+jvB32fzflI35derLW1R/SHEuRzPGOKCofq2CJo1xQNPEORV8xChAMxumGRdINta+2ZxfS3/PbLDX5/fxhcwOP/H9HXwhm/PxFAMK6A8pzpWhGWMcUEC/VkYzxzig4HFOD+VGAZrZMM24QLL5HZ7x8rK/78HugM/v5APZ3A/q1KnTt7L/9+nQocMJvr+PS5THgKL6Q4pzOZoxxgFF9WsVNHOMA5ohzimjMjA2s2GacYFkYx2VXQgvLfv7gXbt2n3C53fyhCPxn6OOOuofMp9f5fvLuETFk3Eh/SHFuRzNGOOAovq1Ipo2xgHNEOeUUeXJuJkN03QLROyEXFP29/0+v48PZBfEC7NxDxV//Vg293/1+oUco8rRSOH8IcW5VjRdjAOK6teyaPYYBzRDnDsM2aC6Y5FnXFnGVeX5LjWORgppmBr2AF8QC+Rh8dKmWSDZmE/DxRB/7tixYzbsLjN8fyfXyOb+/GzsX8GfjzvuuOMzG8zz/Z1coiIwRucPKc61IcW46ojRrznR7DEOiD3OWUGVwNiUhmnmBZJdCAdmc36ZOB5qmsrAciAfDDcE2bzf00zJ8dmYb8jGvDnjhOzP54p/K5w/pDjX3DEOKKJfq6BZYxzQLHFOCdWMIv69KQ3TzAskIaGoSHGuDSnGJSQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkmOP/A4BQPrXfHZO8AAAAAElFTkSuQmCC\">"
],
"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": 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": [
"# 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": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Applying a grid on a figure, one empty subplot\n",
"# Note that if there is a single row, enclosing in a list is not mandatory\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.set_grid(\"ab\")"
]
},
{
"cell_type": "code",
"execution_count": 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": [
"# 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": 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": [
"# 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": 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,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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": 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,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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": 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": [
"# 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": 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9eXRVVbY3WvV9b7w/7vveN8Yb49b43vO7txq7auwBQRoVFXtRELFXbABFUbFDGpFeAen7vg+EJiSE0AdCIPQBAqFJgABpCKCWpXWrbjW3yrzzW3vNk52d3ay99lp7H0/2HGMq55zdzOwzf2etNdecv/mTn8QSSyyxxBJLLLHEEkssscQSSyyxxBJLLLHEEkssscQSSyyxxBJLLLHEEkssscQSSyyxxBJLLLHEEkssscQSSyyxxBJLLLHEEkssscQSSyyxxBJLLLHEEkssscQSSyyxxBJLLLHEEkssscQSSyyxxBJLLLHEEkssscQSSyyxxBJLLLHEEkssscQSSyyxxBJLLLHEEkssscQSSyyxxBJLLLHEEkssscQSSyyxxBJLLBrl+uuv73n11Ve3czvm2muv/eS66657MqHDE//+t7BsiyWWH4PEGIollmASYyiWWMKV/zMBorcTwDuYANRdTgcljmmdOGYO/p34//9OHJsVnomxxJLSEmMolliCSYyhWGKJShJAWuAGvATYBiTA1910fHU4lsUSy49DYgzFEkswiTEUSywRiBfwEp9NTuhzptdVP/vZz/5HONb5k5/3y2v+80/WdfzJT4b8t6htkZSfJv6Grv/20dqbozZEVv7fd1b+7Od91z31iz5Z/1/UtoQl6YShf/84786f9117f9R2SEv7If/Hz/vmvvRv76+9NmpTZOWqT9b9/Bf9crskfgv+n6htCUvSB0ND/hvw8/OP17YVPeOWub+7rdmCGxLj1k9+qtEwYbmq57p/+fd+ua8I/4Z3/cl/b77ghudvmf2b6zWbJixX9V3763/vu67T//po8f8lcvyNc371v25beEMX/F+3bSklAiuvaYmV19Om17VXXXXVv4hc+4cffqgLS45U/aHul/3z6n7RL69u7q5zod1XpUzKP83sv/7TDXWlF7+L2hzfgu+78/Qi9je0/7Kg7r/+8c/Q7q0CC7KSLhjaePwS++6gG0prQ7uvSumXdZTZf/PQzXU1f/jPqM3xLX/9r3/U3TVmO/sbus7cUxfm968CC7KSLhhasPtcEkPFF771PP5g7f662xfdXNd84Y112aezQrDQW7rN38/sbzNqW933f/m75/GTi8cz+9suvb3u/HcV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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": 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"
},
{
"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": 42,
"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": 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 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": 44,
"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": 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 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": 46,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [],
"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": 47,
"metadata": {
"collapsed": false
},
"outputs": [],
"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": 49,
"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": [
"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": 50,
"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": 51,
"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-51-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 317\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 318\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--> 319\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 320\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 321\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": 52,
"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-52-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 309\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 310\u001b[0m raise exc.InvalidParameterError(\n\u001b[1;32m--> 311\u001b[1;33m \"You should pass at least one argument to this function.\")\n\u001b[0m\u001b[0;32m 312\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 313\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": 53,
"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-53-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 313\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 314\u001b[0m \u001b[1;31m# kwargs\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 315\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 316\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 317\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": 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-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": 55,
"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-55-c6ca6527d69a>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcos\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroup\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"a\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m figure.apply_grid([\"a\",\n\u001b[0m\u001b[0;32m 5\u001b[0m \"ba\"])\n",
"\u001b[1;31mAttributeError\u001b[0m: 'Figure' object has no attribute 'apply_grid'"
]
}
],
"source": [
"# Invalid grid, not a rectangular one\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.apply_grid([\"a\",\n",
" \"ba\"])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "physique",
"language": "python",
"name": "physique"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}