Skip to content

Instantly share code, notes, and snippets.

@moorepants
Created September 13, 2017 04:44
Show Gist options
  • Save moorepants/59c064952ff401a5687f11513a7399df to your computer and use it in GitHub Desktop.
Save moorepants/59c064952ff401a5687f11513a7399df to your computer and use it in GitHub Desktop.
First draft of the firt notebook for ENG 122
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\def\\CC{\\bf C}\n",
"\\def\\QQ{\\bf Q}\n",
"\\def\\RR{\\bf R}\n",
"\\def\\ZZ{\\bf Z}\n",
"\\def\\NN{\\bf N}\n",
"$$\n",
"# 2. Introducing Mechanical Vibrations By Investigating a Book Oscillating on a Cylindrical Cup\n",
"\n",
"## Introduction\n",
"\n",
"This notebook introduces a single degree of freedom vibratory system of a textbook balancing on a cylindrical cup. The system is implemented as a model that students can interact with in order to visualize its free response and compare the computer simulation to a demonstration in the classroom.\n",
"\n",
"### Learning Objectives\n",
"\n",
"After the completion of this assignment students will be able to:\n",
"\n",
"- load a specific system\n",
"- view and set parameters on a system\n",
"- create a visualization that depicts the system's configuration\n",
"- visualize a system's free response\n",
"- estimate the period of a sinusoidal vibration from a time series\n",
"- compare a computer simulation result to experimental result\n",
"- interactively adjust the book inertia to see the affect on system response\n",
"- understand the concept of natural frequency nd its relationship to mass/inertia\n",
"\n",
"## What are vibrations?\n",
"\n",
"Here we will study a simple vibratory system. A vibrating mechanical system is typically defined as a collection of rigid and flexible objects that interact in a closed envelope. If you set a cylindrical cup on its side and place a book lying flat on top of it, the book will oscillate if initially displaced at a small non-horizontal angle. Note that it oscillates about a horizontal position. This position is called an *equilibrium point*, *equilibrium state*, or *equilibrium configuration* which is a natural position the system comes to when there is no motion. Vibration is formally defined as an *oscillation about an equilibrium*.\n",
"\n",
"During this class we will examine and explore many different vibratory systems, such as this simple book on a cup system. We will have some live demos, as we are showing now, but in general we will work with computational representations of systems to experiment and learn about the nature of vibration. For example, here is a system that represents the book on a cup. To execute the following Jupyter code cell press the shift and enter key simultaneously:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from resonance.linear_systems import BookOnCupSystem"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The line above loads the command, `BookOnCupSystem`, that can create systems that behave like the live demo at the front of the room. To create a system and assign it to a variable called `sys`, execute the following cell:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"sys = BookOnCupSystem()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This system has many variables and functions associated with it. You can see what the system has and can do by using the Python dot notation. Type `sys.` and press the tab key to see a list of all the variables and functions that the system applies.\n",
"\n",
"## Constant Parameters\n",
"\n",
"Systems have different parameters, for example this system has geometry, such as the book's height and length and the cup's radius. The book also has a mass and, in this case, an underlying assumption is that the book is uniformly dense. Note that these parameters do not change with time, i.e. they are constant with respect to time. You can view all of the constant parameters, which are stored in a Python dictionary by typing:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'height': 0.029, 'length': 0.238, 'mass': 1.058, 'radius': 0.042}"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sys.parameters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A Python dictionary maps keys, the variable name, to values, the default numerical value. For example the key `'height'` is associated with a value `0.029`. An individual parameter value can be accessed by using square brackets:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.042"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sys.parameters['radius']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can set the values of these attributes as such:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"sys.parameters['height'] = 1.0 # cm\n",
"sys.parameters['width'] = 6.0 # cm\n",
"sys.parameters['length'] = 10.0 # cm\n",
"sys.parameters['radius'] = 3.0 # cm\n",
"sys.parameters['mass'] = 1.0 # kg"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*Note that you will be responsible for ensuring that the units are consistent and that all angles should be in radians.* Overwrite the `sys` variable by loading the system again to get back the default parameters."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'height': 0.029, 'length': 0.238, 'mass': 1.058, 'radius': 0.042}"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sys = BookOnCupSystem()\n",
"sys.parameters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"All systems will have different sets of constant parameters. This system could also have more parameters, for example what if you were on the moon? Maybe the acceleration due to gravity could be changed. Or what if the book to cup connection was very slippery? Maybe the coefficient of friction would be a specific parameter. It is important to note that the system parameters, as we've defined here, are constant with respect to time.\n",
"\n",
"## Time Varying Parameters\n",
"\n",
"There are other types of parameters too. Another very important type of parameter are those that vary with time.\n",
"\n",
"### Exercise\n",
"\n",
"What are the time varying parameters of this system?\n",
"\n",
"There are are an infinite number of time varying parameters. Most systems are described by a uniquely simple set of time varying parameters, often called *generalized coordinates*. These coordinates define the configuration of the system. In our case the vertical and horizontal location of the book's mass center could uniquely describe the configuration of the system (if the book can't slip on the cup). But a better choice would be to use the single time varying angle of the books surface relative to horizontal to define the configuration. The angle of the book is thus a generalized coordinate because no fewer number of time varying parameters can possibly be used to describe the configuration. For simple systems, the number of generalized coordinates corresponds to the number of *degrees of [freedom]()* of a system. The degrees of freedom are the number of independent parameters that define the configuration. The non-slipping book on a cup has 1 degree of freedom which is described by the single generalized coordinate, the book's angle. The system's generalized coordinates can be accessed as such:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'book_angle': 0.0}"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sys.coordinates"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.0"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sys.coordinates['book_angle']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Another type of time varying parameter that can be extracted from systems are non-generalized coordinates or other combinations of constant parameters. We will call these *measurement parameters*. For example, maybe you are interested in the vertical and horizontal location of the book's lower left corner. If you had an appropriate dynamics distance sensor you could measure this location as it changes with time. Or you can define how these two measurement parameters are a function of the book angle and the system's geometry. You can add measurement parameters to a system by defining a Python functions that compute the geometric relationship. Given the value of a generalized coordinate and the values of the system's constant parameters, we can define a function that computes the measurement parameter. These functions need to be to accept scalars and arrays, so import NumPy to make use of array aware functions like `cos()` and `sin()` :"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The height of the bottom left corner of the book relative to the origin is defined by this mathematical function:\n",
"\n",
"$$P_y = r + r \\cos{\\theta} + (r \\theta + l / 2) \\sin{\\theta}$$\n",
"\n",
"and the Python function that implements this would look like:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def bottom_left_y(radius, height, length, book_angle):\n",
" r = radius\n",
" h = height\n",
" l = length\n",
" theta = book_angle\n",
" return r + r * np.cos(theta) + (r * theta + l / 2) * np.sin(theta)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that the variable names in the function signature must be exactly as you have defined them in the parameters. This function can be used independently like so:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.084 , 0.08608323, 0.08817862, 0.09028551, 0.09240325,\n",
" 0.09453115, 0.09666855, 0.09881473, 0.10096901, 0.10313066])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"angles = np.deg2rad(np.arange(10))\n",
"bottom_left_y(0.042, 0.029, 0.238, angles)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And you can add this measurement function to the system, so that it automatically calculates the measurement for you with:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Warning : cannot set measurement values.\n"
]
}
],
"source": [
"sys.add_measurement('bottom_left_y', bottom_left_y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Similarly, you can add the horizontal position:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Warning : cannot set measurement values.\n"
]
}
],
"source": [
"def bottom_left_x(radius, height, length, book_angle):\n",
" r = radius\n",
" h = height\n",
" l = length\n",
" theta = book_angle\n",
" return r * np.sin(theta) - (r * theta + l / 2) * np.cos(theta)\n",
"\n",
"sys.add_measurement('bottom_left_x', bottom_left_x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, if you change the book angle you'll get a different measurement:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.086083232844703692"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sys.coordinates['book_angle'] = np.deg2rad(1)\n",
"sys.measurements['bottom_left_y']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice that all angles must be in radians and that we use the NumPy function `rad2deg()` to do this.\n",
"\n",
"## Visualizing the Configuration\n",
"\n",
"It is often very helpful to visualize a system's configuration. In this case we need a two dimensional drawing similar to the diagram above. The package `matplotlib` provides \"patch\" objects that represent a circle and a rectangle that should be able to make a reasonable diagram. First import these functions:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"from matplotlib.patches import Circle, Rectangle"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And for nice interactive plotting in the Jupyter notebook, use this command to turn it on:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"% matplotlib notebook"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Just as we did with the measurement functions, you can create a function that generates the figure using the system's various parameters."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def create_plot(radius, length, height, book_angle, bottom_left_x, bottom_left_y):\n",
" # create a blank figure and set basic settings on the axis\n",
" fig, ax = plt.subplots(1, 1)\n",
" ax.set_xlim((-0.15, 0.15))\n",
" ax.set_ylim((0.0, 0.2))\n",
" ax.set_xlabel('x [m]')\n",
" ax.set_ylabel('y [m]')\n",
" ax.set_aspect('equal')\n",
"\n",
" # circles are created by supplying an (x, y) pair and the radius\n",
" circ = Circle((0.0, radius), radius=radius)\n",
"\n",
" # rectangles are created by supplying the (x, y) pair locating the\n",
" # bottom left corner, the width, the height, and the to rotation\n",
" # angle. notice that the rotation angle is defined in the opposite\n",
" # direction as we have and it is supposed to be in degrees not radians\n",
" rect = Rectangle((bottom_left_x, bottom_left_y),\n",
" length, height,\n",
" angle=-np.rad2deg(book_angle),\n",
" color='black')\n",
"\n",
" ax.add_patch(circ)\n",
" ax.add_patch(rect)\n",
"\n",
" return fig"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A system can have a single configuration plot function and it is set like so:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"sys.configuration_plot_function = create_plot"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now have a look at the configuration plot by calling `plot_configuration()` :"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"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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7LHHWuvWre3EE0+0U0891c4++2w7//zz7cILL7SOHTva5ZdfbldddZVdc801dsMNN1jXrl3ttttus7vuusu6d+9uvXr1soceesgeffRR69evnz355JM2YMAAGzhwoL300ks2ZMgQGzZsmL355pv27rvv2vvvv29jxoyx8ePHW15enk2aNMny8/Nt+vTp9u2339rs2bNt7ty5VlBQYIsWLbJly5bZr7/+amvXrrWNGzfali1bKLkAECEUQPgVqQJ4ww03WE5OToVLYCZSo0YNy87OtuzsbMvJybGaNWumTE5Ozv/NW6NGjUpft6ysLKtVq5btvPPOtvvuu1vdunVt3333tQMOOMAOPvhgO+yww6xhw4bWtGlTa9GihbVq1cratm1rp5xyip1xxhn2xz/+0f785z/bJZdcYpdddpn99a9/tS5dutj1119vN998s/3jH/+wO++807p162Y9e/a0Bx980B555BF7/PHHrX///vbMM8/YCy+8YP/+979t8ODB9uqrr9obb7xh77zzjv33v/+1Dz74wMaNG2cTJkywzz//3KZMmWJfffWVffPNN/bdd9/Zjz/+aD/99JMtXLjQlixZYitXrrQ1a9bYb7/9Zps3b6bkAqg2KIDwK1IF8JprrnFeAKtDatSoYVlZWf9XcssquvElNysrq9KLblZWltWsWdN22mkn22233WzPPfe0ffbZx+rVq2cHHXSQ5ebm2pFHHmlNmjSx5s2bW8uWLe3444+3k08+2U4//XQ799xz7YILLrCLL77YOnXqZH/5y1+sc+fOdt1119lNN91kf//73+2OO+6we+65x+677z574IEH7OGHH7bHHnvM/vWvf9nTTz9tzz//vL344ov2yiuv2H/+8x8bPny4vf322zZy5EgbPXq0ffjhh/bJJ5/Yp59+al988YVNmzbNvv76a5s1a5b98MMPNn/+fFuwYIH98ssvtmLFClu9erVt2LDBNm3aZNu2bXP9vxmAAKAAwq9IFcCrrrrKsrOznRckEv6Ut+SWFt2qKLk1atSwnJwc22mnnWzXXXe1PfbYw/baay/bf//9rX79+nbooYfa4Ycfbo0aNbKjjz7ajjvuOGvTpo2ddNJJdtppp9k555xjf/rTn+yiiy6ySy+91K644gq7+uqr7dprr7Ubb7zRbrnlFrv99tvt7rvvth49etj9999v//zn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P/74Y+dvLIQQQoKdDh06uP64yggKYOYcJ+97d4skrZD0pKQjna5R1YhMAfzwww+dv7EQQggJbmrUqGGXXHKJ64+rjKAAZsYBku6V9IO87/8dImm8vKOCtztcr6oQmQI4atQo528uhBBCgpusrCy7/PLLXX9cZQQFsOJqSrpY0ihJWyR9KelGSbvHzXO5pNVVv2pVKjIFcMSIEc7fXAghhAQ32dnZ9te//tX1x1VGUAArbqWkVZKek9QixTx1Jf1cZWvkRmQK4FtvveX8zYUQQkhwk5OTY9dcc43rj6uMoABW3F8l7eR6JQIgMgXw9ddfd/7mQgghJLjJycmx66+/3vXHVUZQAOFXZArg0KFDnb+5EEIICW5q1qxpXbt2df1xlREUQPgVmQL48ssvO39zIYQQEtzUrFnT/vGPf7j+uMoICiD8ikwBHDRokPM3F0IIIcFNzZo17c4773T9cZURFED4FZkCOGHCBMvKysrIm0RWVpZlZ2dbdna25eTkWE5OjtWsWTNpcnJyLDs727KysqxGjRrO3+AIIYQkT82aNa1bt26uP64yggIIvyJTAM3Mli1bZgUFBTZ37lybPXu2ffvttzZ9+nTLz8+3SZMmWV5eno0fP97Gjh1r77//vr333nv25ptv2muvvWZDhgyxl156yQYOHGgDBgywJ5980vr162ePPvqoPfTQQ9arVy/r3r273XXXXXbbbbfZLbfcYjfccINde+21dtVVV9kVV1xhHTt2tAsvvNDOP/98O+uss6x9+/Z2wgknWOvWre3YY4+1Zs2a2VFHHWUNGjSwQw45xOrXr2/77bef7bXXXlanTh3bddddrXbt2paTk1Ppb4Q1atT4v6Kbbsml6BJCwpyaNWtaz549XX9UZQQFEH5FqgBGSUlJiW3dutWKiops/fr1tmrVKlu+fLktXrzYCgsLbd68eTZnzhybOXOmzZgxw6ZNm2aTJ0+2Tz/91D7++GP78MMPbdSoUTZixAh766237PXXX7ehQ4fayy+/bIMGDbLnnnvOnnrqKXviiSesT58+9s9//tMeeOAB69Gjh91zzz12++2329///ne78cYb7W9/+5tdffXVduWVV9qll15qF110kf3pT3+yc845x0477TQ76aSTrE2bNnbcccdZ8+bNrVGjRnbEEUfYoYceagceeKDtv//+tvfee9see+xhu+22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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sys.plot_configuration();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exercise\n",
"\n",
"Change the system's parameters (constant parameters and the book angle) and see how the plot reflects these changes.\n",
"\n",
"## Free Response\n",
"\n",
"Now that we have a system with defined constant parameters we can make it vibrate. There are two ways to create this motion: apply perturbing forces to the system or set the coordinate to an initial angle other than the equilibrium angle. We will do the later here. The resulting motion is called the *free response* of the system, meaning that no external forces are causing the motion. To simulate the free response of the system, some values of time are needed. In this case an initial time value and a final time value are passed into the `free_response()` function. First, set the initial angle of the book and then call `free_repsonse)`, storing the result in a variable named `trajectories` :"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Simulating system with no damping.\n"
]
}
],
"source": [
"sys.coordinates['book_angle'] = np.deg2rad(1)\n",
"trajectories = sys.free_response(0, 5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This creates what is called a data frame. Data frames are defined in the Pandas Python package and are one of the most common Python data types. They are essentially a 2D table with labels for each column and an index for each row. In our case the index is the time value and the columns are the values of the coordinates and the measurements at that particular time:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"pandas.core.frame.DataFrame"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(trajectories)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>book_angle</th>\n",
" <th>bottom_left_y</th>\n",
" <th>bottom_left_x</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Time [s]</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.000000</th>\n",
" <td>0.017453</td>\n",
" <td>0.086083</td>\n",
" <td>-0.118982</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.016722</th>\n",
" <td>0.017322</td>\n",
" <td>0.086067</td>\n",
" <td>-0.118982</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.033445</th>\n",
" <td>0.016929</td>\n",
" <td>0.086021</td>\n",
" <td>-0.118983</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.050167</th>\n",
" <td>0.016282</td>\n",
" <td>0.085943</td>\n",
" <td>-0.118984</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.066890</th>\n",
" <td>0.015389</td>\n",
" <td>0.085836</td>\n",
" <td>-0.118986</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.083612</th>\n",
" <td>0.014264</td>\n",
" <td>0.085702</td>\n",
" <td>-0.118988</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.100334</th>\n",
" <td>0.012925</td>\n",
" <td>0.085541</td>\n",
" <td>-0.118990</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.117057</th>\n",
" <td>0.011390</td>\n",
" <td>0.085358</td>\n",
" <td>-0.118992</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.133779</th>\n",
" <td>0.009684</td>\n",
" <td>0.085154</td>\n",
" <td>-0.118994</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.150502</th>\n",
" <td>0.007832</td>\n",
" <td>0.084933</td>\n",
" <td>-0.118996</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.167224</th>\n",
" <td>0.005862</td>\n",
" <td>0.084698</td>\n",
" <td>-0.118998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.183946</th>\n",
" <td>0.003804</td>\n",
" <td>0.084453</td>\n",
" <td>-0.118999</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.200669</th>\n",
" <td>0.001689</td>\n",
" <td>0.084201</td>\n",
" <td>-0.119000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.217391</th>\n",
" <td>-0.000452</td>\n",
" <td>0.083946</td>\n",
" <td>-0.119000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.234114</th>\n",
" <td>-0.002587</td>\n",
" <td>0.083692</td>\n",
" <td>-0.119000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.250836</th>\n",
" <td>-0.004682</td>\n",
" <td>0.083443</td>\n",
" <td>-0.118999</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.267559</th>\n",
" <td>-0.006706</td>\n",
" <td>0.083203</td>\n",
" <td>-0.118997</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.284281</th>\n",
" <td>-0.008630</td>\n",
" <td>0.082975</td>\n",
" <td>-0.118996</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.301003</th>\n",
" <td>-0.010424</td>\n",
" <td>0.082762</td>\n",
" <td>-0.118994</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.317726</th>\n",
" <td>-0.012060</td>\n",
" <td>0.082568</td>\n",
" <td>-0.118991</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.334448</th>\n",
" <td>-0.013515</td>\n",
" <td>0.082396</td>\n",
" <td>-0.118989</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.351171</th>\n",
" <td>-0.014766</td>\n",
" <td>0.082247</td>\n",
" <td>-0.118987</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.367893</th>\n",
" <td>-0.015795</td>\n",
" <td>0.082126</td>\n",
" <td>-0.118985</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.384615</th>\n",
" <td>-0.016586</td>\n",
" <td>0.082032</td>\n",
" <td>-0.118984</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.401338</th>\n",
" <td>-0.017127</td>\n",
" <td>0.081968</td>\n",
" <td>-0.118983</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.418060</th>\n",
" <td>-0.017409</td>\n",
" <td>0.081935</td>\n",
" <td>-0.118982</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.434783</th>\n",
" <td>-0.017430</td>\n",
" <td>0.081932</td>\n",
" <td>-0.118982</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.451505</th>\n",
" <td>-0.017188</td>\n",
" <td>0.081961</td>\n",
" <td>-0.118982</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.468227</th>\n",
" <td>-0.016687</td>\n",
" <td>0.082020</td>\n",
" <td>-0.118983</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0.484950</th>\n",
" <td>-0.015934</td>\n",
" <td>0.082109</td>\n",
" <td>-0.118985</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.515050</th>\n",
" <td>-0.003055</td>\n",
" <td>0.083637</td>\n",
" <td>-0.118999</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.531773</th>\n",
" <td>-0.005137</td>\n",
" <td>0.083389</td>\n",
" <td>-0.118998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.548495</th>\n",
" <td>-0.007142</td>\n",
" <td>0.083151</td>\n",
" <td>-0.118997</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.565217</th>\n",
" <td>-0.009039</td>\n",
" <td>0.082926</td>\n",
" <td>-0.118995</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.581940</th>\n",
" <td>-0.010801</td>\n",
" <td>0.082717</td>\n",
" <td>-0.118993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.598662</th>\n",
" <td>-0.012399</td>\n",
" <td>0.082528</td>\n",
" <td>-0.118991</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.615385</th>\n",
" <td>-0.013810</td>\n",
" <td>0.082361</td>\n",
" <td>-0.118989</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.632107</th>\n",
" <td>-0.015014</td>\n",
" <td>0.082218</td>\n",
" <td>-0.118987</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.648829</th>\n",
" <td>-0.015991</td>\n",
" <td>0.082103</td>\n",
" <td>-0.118985</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.665552</th>\n",
" <td>-0.016727</td>\n",
" <td>0.082015</td>\n",
" <td>-0.118983</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.682274</th>\n",
" <td>-0.017212</td>\n",
" <td>0.081958</td>\n",
" <td>-0.118982</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.698997</th>\n",
" <td>-0.017437</td>\n",
" <td>0.081932</td>\n",
" <td>-0.118982</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.715719</th>\n",
" <td>-0.017399</td>\n",
" <td>0.081936</td>\n",
" <td>-0.118982</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.732441</th>\n",
" <td>-0.017099</td>\n",
" <td>0.081971</td>\n",
" <td>-0.118983</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.749164</th>\n",
" <td>-0.016541</td>\n",
" <td>0.082037</td>\n",
" <td>-0.118984</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.765886</th>\n",
" <td>-0.015735</td>\n",
" <td>0.082133</td>\n",
" <td>-0.118985</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.782609</th>\n",
" <td>-0.014691</td>\n",
" <td>0.082256</td>\n",
" <td>-0.118987</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.799331</th>\n",
" <td>-0.013425</td>\n",
" <td>0.082406</td>\n",
" <td>-0.118989</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.816054</th>\n",
" <td>-0.011958</td>\n",
" <td>0.082580</td>\n",
" <td>-0.118992</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.832776</th>\n",
" <td>-0.010310</td>\n",
" <td>0.082775</td>\n",
" <td>-0.118994</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.849498</th>\n",
" <td>-0.008507</td>\n",
" <td>0.082989</td>\n",
" <td>-0.118996</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.866221</th>\n",
" <td>-0.006576</td>\n",
" <td>0.083218</td>\n",
" <td>-0.118997</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.882943</th>\n",
" <td>-0.004546</td>\n",
" <td>0.083459</td>\n",
" <td>-0.118999</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.899666</th>\n",
" <td>-0.002447</td>\n",
" <td>0.083709</td>\n",
" <td>-0.119000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.916388</th>\n",
" <td>-0.000312</td>\n",
" <td>0.083963</td>\n",
" <td>-0.119000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.933110</th>\n",
" <td>0.001829</td>\n",
" <td>0.084218</td>\n",
" <td>-0.119000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.949833</th>\n",
" <td>0.003941</td>\n",
" <td>0.084469</td>\n",
" <td>-0.118999</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.966555</th>\n",
" <td>0.005995</td>\n",
" <td>0.084714</td>\n",
" <td>-0.118998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4.983278</th>\n",
" <td>0.007958</td>\n",
" <td>0.084948</td>\n",
" <td>-0.118996</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5.000000</th>\n",
" <td>0.009801</td>\n",
" <td>0.085168</td>\n",
" <td>-0.118994</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>300 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" book_angle bottom_left_y bottom_left_x\n",
"Time [s] \n",
"0.000000 0.017453 0.086083 -0.118982\n",
"0.016722 0.017322 0.086067 -0.118982\n",
"0.033445 0.016929 0.086021 -0.118983\n",
"0.050167 0.016282 0.085943 -0.118984\n",
"0.066890 0.015389 0.085836 -0.118986\n",
"0.083612 0.014264 0.085702 -0.118988\n",
"0.100334 0.012925 0.085541 -0.118990\n",
"0.117057 0.011390 0.085358 -0.118992\n",
"0.133779 0.009684 0.085154 -0.118994\n",
"0.150502 0.007832 0.084933 -0.118996\n",
"0.167224 0.005862 0.084698 -0.118998\n",
"0.183946 0.003804 0.084453 -0.118999\n",
"0.200669 0.001689 0.084201 -0.119000\n",
"0.217391 -0.000452 0.083946 -0.119000\n",
"0.234114 -0.002587 0.083692 -0.119000\n",
"0.250836 -0.004682 0.083443 -0.118999\n",
"0.267559 -0.006706 0.083203 -0.118997\n",
"0.284281 -0.008630 0.082975 -0.118996\n",
"0.301003 -0.010424 0.082762 -0.118994\n",
"0.317726 -0.012060 0.082568 -0.118991\n",
"0.334448 -0.013515 0.082396 -0.118989\n",
"0.351171 -0.014766 0.082247 -0.118987\n",
"0.367893 -0.015795 0.082126 -0.118985\n",
"0.384615 -0.016586 0.082032 -0.118984\n",
"0.401338 -0.017127 0.081968 -0.118983\n",
"0.418060 -0.017409 0.081935 -0.118982\n",
"0.434783 -0.017430 0.081932 -0.118982\n",
"0.451505 -0.017188 0.081961 -0.118982\n",
"0.468227 -0.016687 0.082020 -0.118983\n",
"0.484950 -0.015934 0.082109 -0.118985\n",
"... ... ... ...\n",
"4.515050 -0.003055 0.083637 -0.118999\n",
"4.531773 -0.005137 0.083389 -0.118998\n",
"4.548495 -0.007142 0.083151 -0.118997\n",
"4.565217 -0.009039 0.082926 -0.118995\n",
"4.581940 -0.010801 0.082717 -0.118993\n",
"4.598662 -0.012399 0.082528 -0.118991\n",
"4.615385 -0.013810 0.082361 -0.118989\n",
"4.632107 -0.015014 0.082218 -0.118987\n",
"4.648829 -0.015991 0.082103 -0.118985\n",
"4.665552 -0.016727 0.082015 -0.118983\n",
"4.682274 -0.017212 0.081958 -0.118982\n",
"4.698997 -0.017437 0.081932 -0.118982\n",
"4.715719 -0.017399 0.081936 -0.118982\n",
"4.732441 -0.017099 0.081971 -0.118983\n",
"4.749164 -0.016541 0.082037 -0.118984\n",
"4.765886 -0.015735 0.082133 -0.118985\n",
"4.782609 -0.014691 0.082256 -0.118987\n",
"4.799331 -0.013425 0.082406 -0.118989\n",
"4.816054 -0.011958 0.082580 -0.118992\n",
"4.832776 -0.010310 0.082775 -0.118994\n",
"4.849498 -0.008507 0.082989 -0.118996\n",
"4.866221 -0.006576 0.083218 -0.118997\n",
"4.882943 -0.004546 0.083459 -0.118999\n",
"4.899666 -0.002447 0.083709 -0.119000\n",
"4.916388 -0.000312 0.083963 -0.119000\n",
"4.933110 0.001829 0.084218 -0.119000\n",
"4.949833 0.003941 0.084469 -0.118999\n",
"4.966555 0.005995 0.084714 -0.118998\n",
"4.983278 0.007958 0.084948 -0.118996\n",
"5.000000 0.009801 0.085168 -0.118994\n",
"\n",
"[300 rows x 3 columns]"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"trajectories"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The data frames have useful plotting functions associated with them, so it is rather easy to plot the various coordinates and measurements versus time:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"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=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"trajectories.plot();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is often a little clearer if each column is in a subplots, especially if they have different units, as these do:"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"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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Vvyrw5aGWYetDyjJmgDcgx2KX4stDzPca4sGNpd9HQW8AfzQY1sGqiPpmpvsskzHoZtTn9z74lLsZ/fVHtsi+6CDsG/g64ArPbdF7MrHN7AT3q/z3JaB6mDsNIgsdrhLQ1x+HQ6Mw0503wXc5Lc5IqlwOPAA8Afs++IGv80RkWodDdyB0vi+PQ/8ChsMin83Y4fhdT1EutyGncql94WISB9Rcdt00QpTke70vhARERERERERERERERERERERERERERERERERERERERERERERERFJTi1ggI95+NsmdzRUeH5t5Gf+t5/aJCIiIrJPM2WOO4ADgSPwUwjWAGOAT1Z4vmvrDBQAioiIiMQ6InJ8G7vPZ/Sxw/w1DbAB4Jd78XMZFACKiIiIlDWG+KHWWvKHgN15FwCrgSZgNnAo8FVgHbAT+AX529wdBNwHbAIagaW5311KXAA4CHgB2APsBpYDJxWck0EBoIiIiEhZY6g8AGwDngNOAL4EbAOexQ69fgEbHLYCoyO/5zfAYuAM4HPAd4EW4J9KtCkuAFwJTAaOy/3sV7BBYVQGBYAiIiIiZY2h8gDQYIM45yFsVi86ZDw/9zjAUUAH8JmC370AGFuiTXEB4G5sprGUDAoARURERMoaQ+UBYGPBOT8F3ix4bCLwWO7r83O/Y2/B0Y7NGhYTFwDekfu5BcAPyA9EnQwKAEVERETKGkPP5gBG3QGsKHgsQ1cQNhqbAfxn4B8LjiNKtKnYIpBjgVuww9CtwMgSf1tEREREihhD/wWAx+Z+xxk9bFMlq4CnA/NK/G0RERERKWIM/RcAAkwB1gKXAMcAg4HbsMPDxRQGgIcAE3Jt+ixwGrAGuKfM3xYRERGRGGPo3wDwI9i5gmuxq4jrsXME/7VEmwoDwAOxGb/12KHfTcADwMFl/raIiIiI7CNUCFpERERkgDFAM7CxwvPPoGt1sQJAERERkX2QWyl8TIXnH0Jlq4tFREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREUu7/AeBmEs13ntOHAAAAAElFTkSuQmCC\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"trajectories.plot(subplots=True);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A single column can be accessed and plotted too:"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"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=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure()\n",
"trajectories['book_angle'].plot();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Maybe you want to use degrees for the book angle instead, just make a new column:"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"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=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"trajectories['book_angle_deg'] = np.rad2deg(trajectories['book_angle'])\n",
"plt.figure()\n",
"trajectories['book_angle_deg'].plot();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exercise\n",
"\n",
"Create the free response of the system with different initial coordinate values and parameter values.\n",
"\n",
"- Does the simulation always work, if not what doesn't work? *Hint: try a tall stack of books, can you find a stack height that is significant?*\n",
"- What mathematical function can be used describe the change in the book angle?\n",
"\n",
"## Animate The Motion\n",
"\n",
"Now that we we have a time varying response, we can animate the configure figure to visualize how the system moves. There is one minor change that needs to be made to the configuration plot function first. We need to make sure that it returns any of the objects that change with time."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def create_plot(radius, length, height, book_angle, bottom_left_x, bottom_left_y):\n",
" fig, ax = plt.subplots(1, 1)\n",
" ax.set_xlim((-0.15, 0.15))\n",
" ax.set_ylim((0.0, 0.2))\n",
" ax.set_xlabel('x [m]')\n",
" ax.set_ylabel('y [m]')\n",
" ax.set_aspect('equal')\n",
"\n",
" circ = Circle((0.0, radius), radius=radius)\n",
"\n",
" rect = Rectangle((bottom_left_x, bottom_left_y),\n",
" length, height,\n",
" angle=-np.rad2deg(book_angle),\n",
" color='black')\n",
"\n",
" ax.add_patch(circ)\n",
" ax.add_patch(rect)\n",
"\n",
" # make sure to return the rectangle, which moves at each time step!\n",
" return fig, rect\n",
"\n",
"sys.configuration_plot_function = create_plot"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, an animation update function can be created which updates the bottom left corner's x and y coordinate at each time step. The last argument in the function signature must be the object that changes."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def animate(book_angle, bottom_left_x, bottom_left_y, rect):\n",
" rect.set_xy((bottom_left_x, bottom_left_y))\n",
" rect._angle = -np.rad2deg(book_angle)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lastly, add this function to the system:"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"sys.configuration_plot_update_function = animate"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The visualization can now be animated with:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"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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/vOf/9jQoUPt9ddft1deecWGDBligwcPtkGDBln//v3tueees379+tkzzzxjffr0sSeeeMIee+wxe/TRR+2RRx6xHj162IMPPmj333+/3Xfffda1a1fr3Lmz3X333XbnnXfabbfdZrfccot17NjRbrzxRrvuuuvsmmuusfbt29uVV15pV1xxhbVr184uueQSu+iii6xNmzZ2/vnn2znnnGNnnnmmnXbaaXbyySfbiSeeaK1bt7YWLVrY7373O2vWrJkdeeSR1qRJEzvssMPs0EMPtQYNGtiBBx5o+++/v9WvX9/q1atn1113ne+XNG8ogAiKAgggJxs3brT169dbaWmp/frrr7ZixQpbtmyZ/fLLL7Zw4UKbP3++zZ0712bNmmU//fSTTZ8+3b7//nv77rvvbMqUKfb111/bl19+aZ9//rkVFxfbZ599Zp988ol9+OGH9v7779uYMWPsnXfesbffftuGDx9uw4YNszfeeMNeffVVe/nll+3FF1+0//u//7MBAwbY888/b//+97/t2WeftaeeesqefPJJe/zxx+2f//yn9erVyx5++GF76KGH7IEHHrDu3btbt27drEuXLva3v/3N7rrrLrv99tvtr3/9q918881200032fXXX2/XXnutXX311XbVVVfZn//8Z7vsssvs0ksvtYsvvtguvPBCu+CCC+y8886zs846y04//XQ75ZRT7KSTTrLjjjvOWrZsacccc4wdffTRdtRRR1nTpk2tUaNG1rBhQzv44IPtoIMOsgMOOMDq169v++67r+29996255572u67725169a1OnXq2E477WS1a9e2mjVrWo0aNaygoCB5gA9dqlWrZtWqVbOCggKrXr26Va9e3WrUqLE5NWvWzCmpP5NcTkFBwebl53u969at6/v/RnlDAURQFEBETnJUZO3atbZ69erNoyJLliyxRYsWbR4VmT17tpWUlNiMGTPshx9+sKlTp9o333xjkydPtq+++sq++OILGz9+vI0bN84+/fRT++ijjzaPirz77rs2cuTIzaMib775pr322mv2yiuv2EsvvWQvvPCCDRw40Pr372//+7//a3379t08KvKvf/3LevfuvXlU5B//+If9/e9/t/vvv9/uvfdeu+eee6xTp05299132x133GG33nrr5lGRG264wf7yl79sHhX5n//5H7v88sutXbt21rZtW/vTn/5kf/zjH+3888+3s88+28444ww79dRT7eSTT7YTTjjBWrVqtXlU5Le//a0dccQRm0dFDjnkECssLLQDDzzQ9ttvP/vNb35j++yzj+211162++6726677mq77LKL7bzzzla7dm2rVauW1axZM9RFRIkyUlBQkLGM5FpEUstIahFJlhHffyPJT+rUqeP77StvKIAIigIY0MaNGzefnkmOiiRPzyxcuNDmzZu3+fTMTz/9tMXpmSlTpmw+PZMcFUmenkmOiiRPz7z99tv21ltvbT498+qrr24+PZMcFUmenkmOiiRPz/zzn/+0nj17bj4988ADD2w+PZMcFUmenkmOiiRPz1x77bXWoUOHzadnLrvssi1Oz1xwwQV27rnn2plnnrl5VCR5eqZly5bWvHnzzadnmjZtaocffrg1bNjQGjRoYAcddNDm0zPJUZE99tjDdtttt82jIjvuuKPtsMMOVrNmTatevXqoD8ZRHRUhpKpkp5128n3IyBsKIIKKTQF8+umnN5+eSY6KnHTSSXb88cdbq1at7Nhjj918euaII46wxo0bbzEqcsABB2wxKpI8PbPrrrtucXqmVq1aoT89IzEqQggh6aldu7bvQ1XeUAARVGwKYJ06dby/uRBCCAlvatas6ftQlTcUQAQVmwK4yy67eH9zIYQQEt7UqFHD96EqbyiACCo2BXC33Xbz/uZCCCEkvCkoKPB9qMobCmD5LClnfpF0kJc13X5iUwD32GMP728uhBBCwp1Nmzb5PlzlBQWwfDZJukXSVTmkvaTVkg72saLbUWwK4F577eX9jYUQQki4s2HDBt+Hq7ygAJbPJkn7lGP+laIARka9evW8v7EQQggJd9atW+f7cJUXFEAEFZsCWL9+fe9vLIQQQsKdNWvW+D5c5QUFEEHFpgDuv//+3t9YCCGEhDurVq3yfbjKCwpgMPUlXSLpZrnPBqamqohNATzwwAO9v7EQQggJd+JwvDOjAAbRXtJauc/5lUj6KSUzvK3V9hebAtigQQPvbyyEEELCnaVLl/o+XOUFBbDiZku6R1KB7xXxLDYFsGHDht7fWAghhIQ7ixcv9n24ygsKYMX9IukQ3ysRArEpgIcffrj3NxZCCCHhzoIFC3wfrvKCAlhxPSV18r0SIRCbAtikSRPvbyyEEELCnZ9//tn34SovKIAVV13SSElF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m1uLFi2sdevWduKJJ9rJJ59sp512mp155pl29tln2/nnn29t2rSxiy66yNq2bWvt2rWzK664wq688kpr3769XXPNNXbdddfZjTfeaB07drRbbrnFbrvtNrvzzjvt7rvvts6dO1vXrl3t3nvvtfvvv98efPBB69Gjhz3yyCP26KOP2mOPPWZPPPGE9enTx5555hnr16+fPffcc9a/f38bNGiQDR482IYMGWKvvPKKvf766zZ06FB76623bMSIETZq1CgbPXq0vffee1ZUVGQff/yxjR071saNG2cTJkywiRMn2qRJk2zy5Mn27bff2rRp0+zHH3+0GTNm2MyZM23OnDk2b948W7BggS1evNiWLl1qy5cvt1WrVtmaNWts3bp1tmHDBtu0aZPvt3ZkQQFEULEpgI8++igF0MPBmFGR3EdFCgsLN4+KNG7c2I444ogtRkVatWpV5qhImzYX2lnntbHj/3C+NT/1fDvi5POs4Qnn2oGtzrV9jj3H6h59ttU5+lzbpfn5tssxf7Rdjm1jdVv8yeq2utjqtr7Edj2une1x4hW2/+ntrdF5f7FjL7nZTr3ydmtzQ2e7+s7u1u2hXtanz1PWt29f+/e//23PP/+8DRw40F544QV78cUX7eWXX7bXXnvN3njjDRs2bJgNHz7cRo4cae+8846NGTPGPvjgA/voo4/sk08+sc8++8zGjx9vX3zxhX355Zf29ddf2zfffGNTp06177//3qZPn24lJSU2a9Ysmzt3rs2fP98WLVpkv/zyiy1btsxWrlxpq1evttLSUlu/fj1FBEhDAURQsSmAjz32mEnK22dF4jIqsscee2QdFWnYsGG5RkXOOeecLUZFLrnkki1GRTp06JDzqMh99923xahIz549txgVeeqppyo8KvL+++9vMSpSXFxc4VGRFStWbDEqsnHjxu1SRjZt2mTfz19hr30+2+4bNsUuevpTa9xtpB30t+GVmsbdRtpFT39q9w2bYq9/Mdu+n7+C8gWEEAUQQcWmAC5evNiuueaaLT4r8pe//GWLz4rceuutW3xW5J577tnisyL/+Mc/Nn9WpHfv3vb444/bk08+aU8//fQ2R0XefPPNLUZF3n333S1GRT799NOcR0Vmz569xajIkiVLthgVWbt2LaMiMbRm3QYb/c18+9trk+zYB0dXetnLNcc+ONo6vT7Jxnw7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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.animation.FuncAnimation at 0x7fdb1d792978>"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sys.animate_configuration()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exercie\n",
"\n",
"There is a special variable `time` that can be specified in the plot setup and update functions. Add this variable to the function signatures and create some text on the plot that displays the current time using:"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# text = ax.text(-0.125, 0.025, 'Time = {:0.3f} s'.format(time))\n",
"# text.set_text('Time = {:0.3f} s'.format(time))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Time Series Analysis\n",
"\n",
"From the above plots you can see that the oscillation is periodic and sinusoidal. Using your program, create a function that calculates the period of the non-linear model to three significant figures of the 11 oscillations when the initial book angle is X degrees. Compare the period predicted by the system to the period measured in class.\n",
"\n",
"*Hint: Look for sign changes with np.sign(), use boolean indexing to extract important times, and finally np.diff() and np.mean() can be useful for finding the delta times and averaging. Note that np.diff() returns one fewer item in the array it operates on.*"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.85618729096989965"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def find_period(t, theta):\n",
" \"\"\"Computes the period of oscillation based on the trajectory of theta.\n",
"\n",
" Parameters\n",
" ==========\n",
" t : array_like, shape(n,)\n",
" An array of monotonically increasing time values.\n",
" theta : array_like, shape(n,)\n",
" An array of values for theta at each time in ``t``.\n",
"\n",
" Returns\n",
" =======\n",
" T : float\n",
" An estimate of the period of oscillation.\n",
"\n",
" \"\"\"\n",
"\n",
" peak_idxs = np.diff(np.sign(theta)) < 0\n",
" peak_idxs = np.hstack((peak_idxs, False))\n",
" T = np.diff(t[peak_idxs]).mean()\n",
"\n",
" return T\n",
"\n",
"find_period(trajectories.index, trajectories.book_angle)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exercise\n",
"\n",
"Plot the period versus change in mass, length, and radius. Is there anything interesting about these plots?"
]
}
],
"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.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment