Skip to content

Instantly share code, notes, and snippets.

@hurutoriya
Last active February 17, 2017 07:20
Show Gist options
  • Save hurutoriya/662268ad0336dd5ac3aade879ffe00db to your computer and use it in GitHub Desktop.
Save hurutoriya/662268ad0336dd5ac3aade879ffe00db to your computer and use it in GitHub Desktop.
%matplotlib option on Jupyter
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\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",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\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 backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\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 * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\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",
" var width = fig.canvas.width/mpl.ratio\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 + '\" width=\"' + width + '\">');\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 width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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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\" width=\"432\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x111c58cf8>]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%matplotlib notebook\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"x = np.arange(-3, 3, 0.1)\n",
"y = np.sin(x)\n",
"plt.plot(x, y)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x111bbe438>]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nhxEzVQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1115ec8d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"x = np.arange(-3, 3, 0.1)\n",
"y = np.sin(x)\n",
"plt.plot(x, y)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true,
"deletable": true,
"editable": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.6.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment