Skip to content

Instantly share code, notes, and snippets.

@elsonidoq
Created February 26, 2018 01:20
Show Gist options
  • Save elsonidoq/41721f1ad23b9bc4d08d4af36ef3bf48 to your computer and use it in GitHub Desktop.
Save elsonidoq/41721f1ad23b9bc4d08d4af36ef3bf48 to your computer and use it in GitHub Desktop.
Example scatter plot
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using matplotlib backend: nbAgg\n",
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"%matplotlib nbagg\n",
"%pylab"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"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",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10dc471d0>]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"figure(figsize=(4,4))\n",
"n = 1000\n",
"std = 100\n",
"scatter(\n",
" np.random.normal(0, std, n) + np.arange(n), \n",
" np.random.normal(0, std, n) + np.arange(n), \n",
" c=np.arange(n), \n",
" lw=0, \n",
" s=np.arange(n) ** 0.75 + 40\n",
")\n",
"plot(np.arange(-0.1*n, 1.1*n), np.arange(-0.1*n, 1.1*n))\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment