Skip to content

Instantly share code, notes, and snippets.

@klonuo
Last active June 3, 2016 15:28
Show Gist options
  • Save klonuo/ce0a9fdb158da49a893f795e6862d86c to your computer and use it in GitHub Desktop.
Save klonuo/ce0a9fdb158da49a893f795e6862d86c to your computer and use it in GitHub Desktop.
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python35\\lib\\site-packages\\ipykernel\\pylab\\config.py:66: DeprecationWarning: metadata {'config': True} was set from the constructor. Metadata should be set using the .tag() method, e.g., Int().tag(key1='value1', key2='value2')\n",
" inline backend.\"\"\"\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\pylab\\config.py:71: DeprecationWarning: metadata {'config': True} was set from the constructor. Metadata should be set using the .tag() method, e.g., Int().tag(key1='value1', key2='value2')\n",
" 'retina', 'jpeg', 'svg', 'pdf'.\"\"\")\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\pylab\\config.py:85: DeprecationWarning: metadata {'config': True} was set from the constructor. Metadata should be set using the .tag() method, e.g., Int().tag(key1='value1', key2='value2')\n",
" use `figure_formats` instead)\"\"\")\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\pylab\\config.py:95: DeprecationWarning: metadata {'config': True} was set from the constructor. Metadata should be set using the .tag() method, e.g., Int().tag(key1='value1', key2='value2')\n",
" \"\"\"\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\pylab\\config.py:114: DeprecationWarning: metadata {'config': True} was set from the constructor. Metadata should be set using the .tag() method, e.g., Int().tag(key1='value1', key2='value2')\n",
" \"\"\")\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\pylab\\config.py:44: DeprecationWarning: InlineBackend._config_changed is deprecated: use @observe and @unobserve instead.\n",
" def _config_changed(self, name, old, new):\n",
"c:\\python35\\lib\\site-packages\\traitlets\\traitlets.py:770: DeprecationWarning: A parent of InlineBackend._config_changed has adopted the new @observe(change) API\n",
" clsname, change_or_name), DeprecationWarning)\n",
"c:\\python35\\lib\\site-packages\\IPython\\core\\formatters.py:98: DeprecationWarning: DisplayFormatter._formatters_default is deprecated: use @default decorator instead.\n",
" def _formatters_default(self):\n",
"c:\\python35\\lib\\site-packages\\IPython\\core\\formatters.py:677: DeprecationWarning: PlainTextFormatter._deferred_printers_default is deprecated: use @default decorator instead.\n",
" def _deferred_printers_default(self):\n",
"c:\\python35\\lib\\site-packages\\IPython\\core\\formatters.py:669: DeprecationWarning: PlainTextFormatter._singleton_printers_default is deprecated: use @default decorator instead.\n",
" def _singleton_printers_default(self):\n",
"c:\\python35\\lib\\site-packages\\IPython\\core\\formatters.py:672: DeprecationWarning: PlainTextFormatter._type_printers_default is deprecated: use @default decorator instead.\n",
" def _type_printers_default(self):\n",
"c:\\python35\\lib\\site-packages\\IPython\\core\\formatters.py:672: DeprecationWarning: PlainTextFormatter._type_printers_default is deprecated: use @default decorator instead.\n",
" def _type_printers_default(self):\n",
"c:\\python35\\lib\\site-packages\\IPython\\core\\formatters.py:677: DeprecationWarning: PlainTextFormatter._deferred_printers_default is deprecated: use @default decorator instead.\n",
" def _deferred_printers_default(self):\n",
"c:\\python35\\lib\\site-packages\\IPython\\core\\formatters.py:92: DeprecationWarning: DisplayFormatter._ipython_display_formatter_default is deprecated: use @default decorator instead.\n",
" def _ipython_display_formatter_default(self):\n"
]
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import mpld3\n",
"\n",
"%matplotlib notebook"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python35\\lib\\site-packages\\IPython\\core\\formatters.py:669: DeprecationWarning: PlainTextFormatter._singleton_printers_default is deprecated: use @default decorator instead.\n",
" def _singleton_printers_default(self):\n"
]
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\python35\\lib\\site-packages\\ipykernel\\comm\\comm.py:52: DeprecationWarning: Comm._comm_id_default is deprecated: use @default decorator instead.\n",
" def _comm_id_default(self):\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\comm\\comm.py:29: DeprecationWarning: Comm._iopub_socket_default is deprecated: use @default decorator instead.\n",
" def _iopub_socket_default(self):\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\comm\\comm.py:24: DeprecationWarning: Comm._kernel_default is deprecated: use @default decorator instead.\n",
" def _kernel_default(self):\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\comm\\comm.py:32: DeprecationWarning: Comm._session_default is deprecated: use @default decorator instead.\n",
" def _session_default(self):\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\comm\\comm.py:41: DeprecationWarning: Comm._topic_default is deprecated: use @default decorator instead.\n",
" def _topic_default(self):\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\comm\\comm.py:24: DeprecationWarning: Comm._kernel_default is deprecated: use @default decorator instead.\n",
" def _kernel_default(self):\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\comm\\comm.py:52: DeprecationWarning: Comm._comm_id_default is deprecated: use @default decorator instead.\n",
" def _comm_id_default(self):\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\comm\\comm.py:32: DeprecationWarning: Comm._session_default is deprecated: use @default decorator instead.\n",
" def _session_default(self):\n",
"c:\\python35\\lib\\site-packages\\ipykernel\\comm\\comm.py:41: DeprecationWarning: Comm._topic_default is deprecated: use @default decorator instead.\n",
" def _topic_default(self):\n"
]
}
],
"source": [
"fig, ax = plt.subplots()\n",
"ax.plot(np.random.randn(4, 4), label='x')\n",
"ax.legend()\n",
"\n",
"d = mpld3.fig_to_dict(fig)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"640.0 480.0\n",
"data [array([102, 238]), array([252, 298]), array([403, 69]), array([553, 301])]\n",
"data [array([102, 375]), array([252, 350]), array([403, 274]), array([553, 324])]\n",
"data [array([102, 195]), array([252, 179]), array([403, 285]), array([553, 214])]\n",
"data [array([102, 246]), array([252, 335]), array([403, 255]), array([553, 405])]\n",
"axes [array([106, 312]), array([114, 312])]\n",
"axes [array([106, 308]), array([114, 308])]\n",
"axes [array([106, 304]), array([114, 304])]\n",
"axes [array([106, 300]), array([114, 300])]\n"
]
}
],
"source": [
"print(d['width'], d['height'])\n",
"for line in d['axes'][0]['lines']:\n",
" coord = [\n",
" ax.transData.transform((x[line['xindex']], x[line['yindex']])).astype('int')\n",
" for x in d['data'][line['data']]\n",
" ]\n",
" print(line['coordinates'], coord)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": 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.5.1"
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment