replot/Examples.ipynb

11943 lines
1.0 MiB

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import replot\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib notebook\n",
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "code",
"execution_count": 3,
"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.sin)\n",
" figure.plot(np.cos)"
]
},
{
"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": [
"with replot.Figure() as figure:\n",
" figure.plot(np.sin, (-2, 2))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"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": [
"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": 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": [
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.plot(x)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"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": [
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.plot(x, x)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"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": 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": [
"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, label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"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(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, label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"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, label=\"sin\")\n",
"fig.show()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"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, label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"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": [
"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, label=\"sin\")"
]
},
{
"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": [
"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)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"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"
}
],
"source": [
"replot.plot([np.sin],\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": 72,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/phyks/.local/share/virtualenvs/physique/lib/python3.5/site-packages/matplotlib/pyplot.py:516: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_open_warning`).\n",
" max_open_warning, RuntimeWarning)\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"
}
],
"source": [
"replot.plot([range(10), (np.sin, (-5, 5)), np.cos, (lambda x: np.sin(x) + 4, (-10, 10), {\"linewidth\": 10}), (lambda x: np.sin(x) - 4, {\"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": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"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, linewidth=20)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "physique",
"language": "python",
"name": "physique"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}