Skip to content

Instantly share code, notes, and snippets.

@tacaswell
Created October 13, 2015 22:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tacaswell/7a0e5e76fb3cafa3b7cd to your computer and use it in GitHub Desktop.
Save tacaswell/7a0e5e76fb3cafa3b7cd to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib notebook\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib\n",
"\n",
"def pandas_plot(ax, df, style_cycle, **kwargs):\n",
" \"\"\"\n",
" Plot a pandas DataFrame\n",
"\n",
" Parameters\n",
" ----------\n",
" ax : matplotlib.axes.Axes\n",
" The axes to plot to\n",
"\n",
" df : pd.DataFrame\n",
" The data to plot\n",
"\n",
" style_cycle : Cycler\n",
" Something that when iterated over yields style dict\n",
"\n",
" Returns\n",
" -------\n",
" ret : dict\n",
" Dictionary of line2d artists added \n",
" \"\"\"\n",
" ret = {}\n",
" x = df.index\n",
" for n, sty in zip(df.columns, style_cycle):\n",
" sty.update(kwargs)\n",
" ln, = ax.plot(x, df[n], label=n, **sty)\n",
" ret[n] = ln\n",
" ax.legend()\n",
" return ret"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/tcaswell/.virtualenvs/dd_35/lib/python3.5/site-packages/IPython/html.py:14: ShimWarning: The `IPython.html` package has been deprecated. You should import from `notebook` instead. `IPython.html.widgets` has moved to `ipywidgets`.\n",
" \"`IPython.html.widgets` has moved to `ipywidgets`.\", ShimWarning)\n"
]
}
],
"source": [
"from IPython.html.widgets import *\n",
"from IPython.display import display\n",
"\n",
"def widget_function_factory(arts):\n",
" \"\"\"\n",
" Generate fulnction + args to pass to interactive\n",
" Parameters\n",
" ----------\n",
" arts : dict\n",
" dictionary of Line2D\n",
" \n",
" \"\"\"\n",
" \n",
" name = Dropdown(options=list(arts.keys()))\n",
" \n",
" def set_all(_, old_line, new_line):\n",
" ln = arts[new_line]\n",
" lw.value = ln.get_lw()\n",
" alph.value = ln.get_alpha() or 1\n",
" visible.value = ln.get_visible()\n",
" markevery.value = ln.get_markevery()\n",
" marker.value = ln.get_marker()\n",
" \n",
" def set_lw(_, old_lw, new_lw):\n",
" ln = arts[name.value]\n",
" arts[name.value].set_lw(new_lw)\n",
" arts[name.value].axes.legend()\n",
" \n",
" def set_alpha(_, old_value, new_value):\n",
" ln = arts[name.value]\n",
" ln.set_alpha(new_value)\n",
" ln.axes.legend()\n",
" \n",
" def set_visible(_, old_value, new_value):\n",
" ln = arts[name.value]\n",
" ln.set_visible(new_value)\n",
" ln.axes.legend()\n",
" \n",
" def set_markevery(_, old_value, new_value):\n",
" ln = arts[name.value]\n",
" ln.set_markevery(new_value)\n",
" \n",
" def set_marker(_, old_value, new_value):\n",
" ln = arts[name.value]\n",
" ln.set_marker(new_value)\n",
" ln.axes.legend()\n",
" \n",
" lw = FloatSlider(min=1, max=5, description='lw: ')\n",
" alph = FloatSlider(min=0, max=1, description='alpha: ')\n",
" visible = Checkbox(description='visible: ')\n",
" markevery = IntSlider(min=1, max=15, description='markevery: ')\n",
" marker = Dropdown(options={v:k for k, v in matplotlib.markers.MarkerStyle.markers.items()},\n",
" description='marker: ')\n",
" \n",
" name.on_trait_change(set_all, 'value')\n",
" lw.on_trait_change(set_lw, 'value')\n",
" alph.on_trait_change(set_alpha, 'value')\n",
" visible.on_trait_change(set_visible, 'value')\n",
" markevery.on_trait_change(set_markevery, 'value')\n",
" marker.on_trait_change(set_marker, 'value')\n",
" display(name, lw, alph, marker, markevery, visible)\n",
" set_all(None, None, name.value)\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"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"
},
{
"data": {
"text/plain": [
"<matplotlib.lines.Line2D at 0x7f8ed9be05f8>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"th = np.linspace(0, 2*np.pi, 128)\n",
"df = pd.DataFrame({'sin': np.sin(th),\n",
" 'shift +': np.sin(th + np.pi / 3), \n",
" 'shift -': np.sin(th - np.pi / 3)}, index=th)\n",
"\n",
"fig, ax = plt.subplots()\n",
"from cycler import cycler\n",
"style_cycle = cycler('color',['r', 'black', 'pink']) + cycler('marker', 'sxo')\n",
"#style_cycle = [{'color': 'r', 'marker': 's'},\n",
"# {'color': 'black', 'marker': 'x'},\n",
"# {'color': 'pink', 'marker': 'o'}]\n",
"arts = pandas_plot(ax, df, style_cycle, markevery=10)\n",
"vlns = []\n",
"for x in np.arange(1, 7) * np.pi/3:\n",
" vlns.append(plt.axvline(x, color='k', linestyle=':'))\n",
"plt.axhline(0, color='k', linestyle=':')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"widget_function_factory(arts)"
]
},
{
"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.0"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment