replot/Examples.ipynb
Phyks (Lucas Verney) 809044c698 Handle groups of plots
But no difference between grouped plots and ungrouped plots at the
moment.
2016-03-02 17:40:39 +01:00

16726 lines
1.5 MiB

{
"cells": [
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import replot\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The autoreload extension is already loaded. To reload it, use:\n",
" %reload_ext autoreload\n"
]
}
],
"source": [
"%matplotlib notebook\n",
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "code",
"execution_count": 17,
"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",
" for i in range(8):\n",
" figure.plot(lambda x: np.sin(x + np.pi * i / 4), (-10, 10))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure() as figure:\n",
" figure.plot(np.sin, (-2, 2))"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"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": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.plot(x)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.plot(x, x)"
]
},
{
"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() 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": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\") as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=True) as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\")\n",
"fig.plot(np.sin, (-10, 10), label=\"sin\")\n",
"fig.show()"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\") as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 26,
"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, (-10, 10), label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 27,
"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, (-10, 10))"
]
},
{
"cell_type": "code",
"execution_count": 37,
"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, (-10, 10))],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\")"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"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([range(10), (np.sin, (-5, 5)), (lambda x: np.sin(x) + 4, (-10, 10), {\"linewidth\": 10}), (lambda x: np.sin(x) - 4, (-10, 10), {\"linewidth\": 10}), ([-i for i in range(5)], {\"linewidth\": 10})],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\")"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"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, (-10, 10), linewidth=20)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"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": [
"replot.plot([range(10), (np.sin, (-5, 5)), (lambda x: np.sin(x) + 4, (-10, 10), {\"linewidth\": 10}), (lambda x: np.sin(x) - 4, (-10, 10), {\"linewidth\": 10}), ([-i for i in range(5)], {\"linewidth\": 10})],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\",\n",
" palette=\"dark\")"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"replot.plot([range(10), (np.sin, (-5, 5)), (lambda x: np.sin(x) + 4, (-10, 10), {\"linewidth\": 10}), (lambda x: np.sin(x) - 4, (-10, 10), {\"linewidth\": 10}), ([-i for i in range(5)], {\"linewidth\": 10})],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\",\n",
" palette=replot.sns.color_palette(\"husl\", 2))"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"ename": "InvalidParameterError",
"evalue": "Second parameter in plot command should be a tuple specifying plotting interval.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-35-123737853af4>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msin\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 139\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"__call__\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 140\u001b[0m \u001b[1;31m# We want to plot a function\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 141\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_plot_function\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 142\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 143\u001b[0m \u001b[1;31m# Else, it is a point series, and we just have to store it for\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36m_plot_function\u001b[1;34m(self, data, *args, **kwargs)\u001b[0m\n\u001b[0;32m 181\u001b[0m raise exc.InvalidParameterError(\n\u001b[0;32m 182\u001b[0m \u001b[1;34m\"Second parameter in plot command should be a tuple \"\u001b[0m \u001b[1;33m+\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 183\u001b[1;33m \"specifying plotting interval.\")\n\u001b[0m\u001b[0;32m 184\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplots\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_values\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_values\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 185\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: Second parameter in plot command should be a tuple specifying plotting interval."
]
}
],
"source": [
"with replot.Figure() as figure:\n",
" figure.plot(np.sin, None)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"ename": "InvalidParameterError",
"evalue": "You should pass at least one argument to this function.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-36-04fab9ca003f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 135\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 136\u001b[0m raise exc.InvalidParameterError(\n\u001b[1;32m--> 137\u001b[1;33m \"You should pass at least one argument to this function.\")\n\u001b[0m\u001b[0;32m 138\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 139\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"__call__\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: You should pass at least one argument to this function."
]
}
],
"source": [
"with replot.Figure() as figure:\n",
" figure.plot()"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.sin, (-10, 10), group=\"ç\")"
]
},
{
"cell_type": "code",
"execution_count": 48,
"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"
},
{
"ename": "InvalidParameterError",
"evalue": "Group name cannot be longer than one unicode character.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-48-39e2b2172760>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcos\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroup\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"abc\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 129\u001b[0m \u001b[1;31m# Extra custom kwargs (the ones from replot but not matplotlib) from\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 130\u001b[0m \u001b[1;31m# kwargs\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 131\u001b[1;33m \u001b[0mkwargs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcustom_kwargs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_handle_custom_plot_arguments\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 132\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 133\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"__call__\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36m_handle_custom_plot_arguments\u001b[1;34m(kwargs)\u001b[0m\n\u001b[0;32m 253\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"group\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 254\u001b[0m raise exc.InvalidParameterError(\n\u001b[1;32m--> 255\u001b[1;33m \"Group name cannot be longer than one unicode character.\")\n\u001b[0m\u001b[0;32m 256\u001b[0m \u001b[0mcustom_kwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"group\"\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"group\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 257\u001b[0m \u001b[1;32mdel\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"group\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: Group name cannot be longer than one unicode character."
]
}
],
"source": [
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"abc\")"
]
},
{
"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
}