Created
March 6, 2016 03:09
-
-
Save moorepants/f4adeecfe9d0abe1fdad to your computer and use it in GitHub Desktop.
Files from the PyDy tutorial given to the UCD HRVIP lab on March 4, 2016.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Introduction\n", | |
| "\n", | |
| "This example gives a simple demostration of chaotic behavior in a simple two body system. The system is made up of a slender rod that is connected to the ceiling at one end with a revolute joint that rotates about the $\\hat{\\mathbf{n}}_y$ unit vector. At the other end of the rod a flat plate is attached via a second revolute joint allowing the plate to rotate about the rod's axis with aligns with the $\\hat{\\mathbf{a}_z}$ unit vector.\n", | |
| "\n", | |
| "" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Setup" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "import numpy as np\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "import sympy as sym\n", | |
| "import sympy.physics.mechanics as me\n", | |
| "from pydy.system import System\n", | |
| "from pydy.viz import Cylinder, Plane, VisualizationFrame, Scene" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "%matplotlib nbagg" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "me.init_vprinting(use_latex='mathjax')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Define Variables\n", | |
| "\n", | |
| "First define the system constants:\n", | |
| "\n", | |
| "- $m_A$: Mass of the slender rod.\n", | |
| "- $m_B$: Mass of the plate.\n", | |
| "- $l_B$: Distance from $N_o$ to $B_o$ along the slender rod's axis.\n", | |
| "- $w$: The width of the plate.\n", | |
| "- $h$: The height of the plate.\n", | |
| "- $g$: The acceleratoin due to gravity." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "mA, mB, lB, w, h, g = sym.symbols('m_A, m_B, L_B, w, h, g')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "There are two time varying generalized coordinates:\n", | |
| "\n", | |
| "- $\\theta(t)$: The angle of the slender rod with respect to the ceiling.\n", | |
| "- $\\phi(t)$: The angle of the plate with respect to the slender rod.\n", | |
| "\n", | |
| "The two generalized speeds will then be defined as:\n", | |
| "\n", | |
| "- $\\omega(t)=\\dot{\\theta}$: The angular rate of the slender rod with respect to the ceiling.\n", | |
| "- $\\alpha(t)=\\dot{\\phi}$: The angluer rate of the plate with respect to the slender rod." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "theta, phi = me.dynamicsymbols('theta, phi')\n", | |
| "omega, alpha = me.dynamicsymbols('omega, alpha')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The kinematical differential equations are defined in this fashion for the `KanesMethod` class:\n", | |
| "\n", | |
| "$$0 = \\omega - \\dot{\\theta}\\\\\n", | |
| "0 = \\alpha - \\dot{\\phi}$$" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/latex": [ | |
| "$$\\left ( \\omega - \\dot{\\theta}, \\quad \\alpha - \\dot{\\phi}\\right )$$" | |
| ], | |
| "text/plain": [ | |
| "(ω - θ̇, α - φ̇)" | |
| ] | |
| }, | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "kin_diff = (omega - theta.diff(), alpha - phi.diff())\n", | |
| "kin_diff" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Define Orientations\n", | |
| "\n", | |
| "There are three reference frames. These are defined as such:" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "N = me.ReferenceFrame('N')\n", | |
| "A = me.ReferenceFrame('A')\n", | |
| "B = me.ReferenceFrame('B')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The frames are oriented with respect to each other by simple revolute rotations. The following lines set the orientations:" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "A.orient(N, 'Axis', (theta, N.y))\n", | |
| "B.orient(A, 'Axis', (phi, A.z))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Define Positions\n", | |
| "\n", | |
| "Three points are necessary to define the problem:\n", | |
| "\n", | |
| "- $N_o$: The fixed point which the slender rod rotates about.\n", | |
| "- $A_o$: The center of mass of the slender rod.\n", | |
| "- $B_o$: The center of mass of the plate." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "No = me.Point('No')\n", | |
| "Ao = me.Point('Ao')\n", | |
| "Bo = me.Point('Bo')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The two centers of mass positions can be set relative to the fixed point, $N_o$." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "lA = (lB - h / 2) / 2\n", | |
| "Ao.set_pos(No, lA * A.z)\n", | |
| "Bo.set_pos(No, lB * A.z)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Specify the Velocities\n", | |
| "\n", | |
| "The generalized speeds should be used in the definition of the linear and angular velocities when using Kane's method. For simple rotations and the defined kinematical differential equations the angular rates are:" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "A.set_ang_vel(N, omega * N.y)\n", | |
| "B.set_ang_vel(A, alpha * A.z)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Once the angular velocities are specified the linear velocities can be computed using the two point velocity thereom, starting with the origin point having a velocity of zero." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 12, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "No.set_vel(N, 0)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 13, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/latex": [ | |
| "$$\\left(\\frac{L_{B}}{2} - \\frac{h}{4}\\right) \\omega\\mathbf{\\hat{a}_x}$$" | |
| ], | |
| "text/plain": [ | |
| "⎛L_B h⎞ \n", | |
| "⎜─── - ─⎟⋅ω\n", | |
| "⎝ 2 4⎠ a_x" | |
| ] | |
| }, | |
| "execution_count": 13, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "Ao.v2pt_theory(No, N, A)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 14, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/latex": [ | |
| "$$L_{B} \\omega\\mathbf{\\hat{a}_x}$$" | |
| ], | |
| "text/plain": [ | |
| "L_B⋅ω a_x" | |
| ] | |
| }, | |
| "execution_count": 14, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "Bo.v2pt_theory(No, N, A)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Inertia\n", | |
| "\n", | |
| "The central inertia of the symmetric slender rod with respect to its reference frame is a function of its length and its mass." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 15, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "IAxx = sym.S(1) / 12 * mA * (2 * lA)**2\n", | |
| "IAyy = IAxx\n", | |
| "IAzz = 0\n", | |
| "\n", | |
| "IA = (me.inertia(A, IAxx, IAyy, IAzz), Ao)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "This gives the inertia tensor:" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 16, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/latex": [ | |
| "$$\\left[\\begin{matrix}\\frac{m_{A}}{12} \\left(L_{B} - \\frac{h}{2}\\right)^{2} & 0 & 0\\\\0 & \\frac{m_{A}}{12} \\left(L_{B} - \\frac{h}{2}\\right)^{2} & 0\\\\0 & 0 & 0\\end{matrix}\\right]$$" | |
| ], | |
| "text/plain": [ | |
| "⎡ 2 ⎤\n", | |
| "⎢ ⎛ h⎞ ⎥\n", | |
| "⎢m_A⋅⎜L_B - ─⎟ ⎥\n", | |
| "⎢ ⎝ 2⎠ ⎥\n", | |
| "⎢────────────── 0 0⎥\n", | |
| "⎢ 12 ⎥\n", | |
| "⎢ ⎥\n", | |
| "⎢ 2 ⎥\n", | |
| "⎢ ⎛ h⎞ ⎥\n", | |
| "⎢ m_A⋅⎜L_B - ─⎟ ⎥\n", | |
| "⎢ ⎝ 2⎠ ⎥\n", | |
| "⎢ 0 ────────────── 0⎥\n", | |
| "⎢ 12 ⎥\n", | |
| "⎢ ⎥\n", | |
| "⎣ 0 0 0⎦" | |
| ] | |
| }, | |
| "execution_count": 16, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "IA[0].to_matrix(A)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The central inerita of the symmetric plate with respect to its reference frame is a function of its width and height." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 17, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "IBxx = sym.S(1)/12 * mB * h**2\n", | |
| "IByy = sym.S(1)/12 * mB * (w**2 + h**2)\n", | |
| "IBzz = sym.S(1)/12 * mB * w**2\n", | |
| "\n", | |
| "IB = (me.inertia(B, IBxx, IByy, IBzz), Bo)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 18, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/latex": [ | |
| "$$\\left[\\begin{matrix}\\frac{h^{2} m_{B}}{12} & 0 & 0\\\\0 & \\frac{m_{B}}{12} \\left(h^{2} + w^{2}\\right) & 0\\\\0 & 0 & \\frac{m_{B} w^{2}}{12}\\end{matrix}\\right]$$" | |
| ], | |
| "text/plain": [ | |
| "⎡ 2 ⎤\n", | |
| "⎢h ⋅m_B ⎥\n", | |
| "⎢────── 0 0 ⎥\n", | |
| "⎢ 12 ⎥\n", | |
| "⎢ ⎥\n", | |
| "⎢ ⎛ 2 2⎞ ⎥\n", | |
| "⎢ m_B⋅⎝h + w ⎠ ⎥\n", | |
| "⎢ 0 ───────────── 0 ⎥\n", | |
| "⎢ 12 ⎥\n", | |
| "⎢ ⎥\n", | |
| "⎢ 2⎥\n", | |
| "⎢ m_B⋅w ⎥\n", | |
| "⎢ 0 0 ──────⎥\n", | |
| "⎣ 12 ⎦" | |
| ] | |
| }, | |
| "execution_count": 18, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "IB[0].to_matrix(B)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "All of the information to define the two rigid bodies are now available. This information is used to create an object for the rod and the plate." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 19, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "rod = me.RigidBody('rod', Ao, A, mA, IA)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 20, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "plate = me.RigidBody('plate', Bo, B, mB, IB)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Loads\n", | |
| "\n", | |
| "The only loads in this problem is the force due to gravity that acts on the center of mass of each body. These forces are specified with a tuple containing the point of application and the force vector." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 21, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "rod_gravity = (Ao, mA * g * N.z)\n", | |
| "plate_gravity = (Bo, mB * g * N.z)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Equations of motion\n", | |
| "\n", | |
| "Now that the kinematics, kinetics, and inertia have all been defined the `KanesMethod` class can be used to generate the equations of motion of the system. In this case the independent generalized speeds, independent generalized speeds, the kinematical differential equations, and the inertial reference frame are used to initialize the class." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 22, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "kane = me.KanesMethod(N, q_ind=(theta, phi), u_ind=(omega, alpha), kd_eqs=kin_diff)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The equations of motion are then generated by passing in all of the loads and bodies to the `kanes_equations` method. This produces $f_r$ and $f_r^*$." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 23, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "bodies = (rod, plate)\n", | |
| "loads = (rod_gravity, plate_gravity)\n", | |
| "\n", | |
| "fr, frstar = kane.kanes_equations(loads, bodies)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 24, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/latex": [ | |
| "$$\\left[\\begin{matrix}\\frac{g \\operatorname{sin}\\left(\\theta\\right)}{4} \\left(- 2 L_{B} m_{A} - 4 L_{B} m_{B} + h m_{A}\\right)\\\\0\\end{matrix}\\right]$$" | |
| ], | |
| "text/plain": [ | |
| "⎡g⋅(-2⋅L_B⋅m_A - 4⋅L_B⋅m_B + h⋅m_A)⋅sin(θ)⎤\n", | |
| "⎢─────────────────────────────────────────⎥\n", | |
| "⎢ 4 ⎥\n", | |
| "⎢ ⎥\n", | |
| "⎣ 0 ⎦" | |
| ] | |
| }, | |
| "execution_count": 24, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "sym.trigsimp(fr)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 25, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/latex": [ | |
| "$$\\left[\\begin{matrix}\\frac{m_{B} w^{2}}{12} \\alpha \\omega \\operatorname{sin}\\left(2 \\phi\\right) - \\left(\\frac{L_{B}^{2} m_{A}}{3} + L_{B}^{2} m_{B} - \\frac{L_{B} h}{3} m_{A} + \\frac{h^{2} m_{A}}{12} + \\frac{h^{2} m_{B}}{12} + \\frac{m_{B} w^{2}}{12} \\operatorname{cos}^{2}\\left(\\phi\\right)\\right) \\dot{\\omega}\\\\- \\frac{m_{B} w^{2}}{24} \\left(\\omega^{2} \\operatorname{sin}\\left(2 \\phi\\right) + 2 \\dot{\\alpha}\\right)\\end{matrix}\\right]$$" | |
| ], | |
| "text/plain": [ | |
| "⎡ 2 ⎛ 2 2 2 \n", | |
| "⎢m_B⋅w ⋅α⋅ω⋅sin(2⋅φ) ⎜L_B ⋅m_A 2 L_B⋅h⋅m_A h ⋅m_A h ⋅m_B m_\n", | |
| "⎢─────────────────── - ⎜──────── + L_B ⋅m_B - ───────── + ────── + ────── + ──\n", | |
| "⎢ 12 ⎝ 3 3 12 12 \n", | |
| "⎢ \n", | |
| "⎢ 2 ⎛ 2 ⎞ \n", | |
| "⎢ -m_B⋅w ⋅⎝ω ⋅sin(2⋅φ) + 2⋅α̇⎠ \n", | |
| "⎢ ───────────────────────────── \n", | |
| "⎣ 24 \n", | |
| "\n", | |
| " 2 2 ⎞ ⎤\n", | |
| "B⋅w ⋅cos (φ)⎟ ⎥\n", | |
| "────────────⎟⋅ω̇⎥\n", | |
| " 12 ⎠ ⎥\n", | |
| " ⎥\n", | |
| " ⎥\n", | |
| " ⎥\n", | |
| " ⎥\n", | |
| " ⎦" | |
| ] | |
| }, | |
| "execution_count": 25, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "sym.trigsimp(frstar)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Simulation\n", | |
| "\n", | |
| "The equations of motion can now be simulated numerically. Values for the constants, initial conditions, and time are provided to the `System` class along with the symbolic `KanesMethod` object." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 26, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "sys = System(kane)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 27, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "sys.constants = {lB: 0.2, # meters\n", | |
| " h: 0.1, # meters\n", | |
| " w: 0.2, # meters\n", | |
| " mA: 0.01, # kilograms\n", | |
| " mB: 0.1, # kilograms\n", | |
| " g: 9.81} # meters per second squared" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 28, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "sys.initial_conditions = {theta: np.deg2rad(45),\n", | |
| " phi: np.deg2rad(0.5),\n", | |
| " omega: 0,\n", | |
| " alpha: 0}" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 29, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "sys.times = np.linspace(0, 10, 500)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The trajectories of the states are found with the `integrate` method." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 30, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "x = sys.integrate()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The angles can be plotted to see how they change with respect to time given the initial conditions." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 31, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "application/javascript": [ | |
| "/* Put everything inside the global mpl namespace */\n", | |
| "window.mpl = {};\n", | |
| "\n", | |
| "mpl.get_websocket_type = function() {\n", | |
| " if (typeof(WebSocket) !== 'undefined') {\n", | |
| " return WebSocket;\n", | |
| " } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
| " return MozWebSocket;\n", | |
| " } else {\n", | |
| " alert('Your browser does not have WebSocket support.' +\n", | |
| " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
| " 'Firefox 4 and 5 are also supported but you ' +\n", | |
| " 'have to enable WebSockets in about:config.');\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
| " this.id = figure_id;\n", | |
| "\n", | |
| " this.ws = websocket;\n", | |
| "\n", | |
| " this.supports_binary = (this.ws.binaryType != undefined);\n", | |
| "\n", | |
| " if (!this.supports_binary) {\n", | |
| " var warnings = document.getElementById(\"mpl-warnings\");\n", | |
| " if (warnings) {\n", | |
| " warnings.style.display = 'block';\n", | |
| " warnings.textContent = (\n", | |
| " \"This browser does not support binary websocket messages. \" +\n", | |
| " \"Performance may be slow.\");\n", | |
| " }\n", | |
| " }\n", | |
| "\n", | |
| " this.imageObj = new Image();\n", | |
| "\n", | |
| " this.context = undefined;\n", | |
| " this.message = undefined;\n", | |
| " this.canvas = undefined;\n", | |
| " this.rubberband_canvas = undefined;\n", | |
| " this.rubberband_context = undefined;\n", | |
| " this.format_dropdown = undefined;\n", | |
| "\n", | |
| " this.image_mode = 'full';\n", | |
| "\n", | |
| " this.root = $('<div/>');\n", | |
| " this._root_extra_style(this.root)\n", | |
| " this.root.attr('style', 'display: inline-block');\n", | |
| "\n", | |
| " $(parent_element).append(this.root);\n", | |
| "\n", | |
| " this._init_header(this);\n", | |
| " this._init_canvas(this);\n", | |
| " this._init_toolbar(this);\n", | |
| "\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " this.waiting = false;\n", | |
| "\n", | |
| " this.ws.onopen = function () {\n", | |
| " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
| " fig.send_message(\"send_image_mode\", {});\n", | |
| " fig.send_message(\"refresh\", {});\n", | |
| " }\n", | |
| "\n", | |
| " this.imageObj.onload = function() {\n", | |
| " if (fig.image_mode == 'full') {\n", | |
| " // Full images could contain transparency (where diff images\n", | |
| " // almost always do), so we need to clear the canvas so that\n", | |
| " // there is no ghosting.\n", | |
| " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
| " }\n", | |
| " fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
| " };\n", | |
| "\n", | |
| " this.imageObj.onunload = function() {\n", | |
| " this.ws.close();\n", | |
| " }\n", | |
| "\n", | |
| " this.ws.onmessage = this._make_on_message_function(this);\n", | |
| "\n", | |
| " this.ondownload = ondownload;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_header = function() {\n", | |
| " var titlebar = $(\n", | |
| " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", | |
| " 'ui-helper-clearfix\"/>');\n", | |
| " var titletext = $(\n", | |
| " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", | |
| " 'text-align: center; padding: 3px;\"/>');\n", | |
| " titlebar.append(titletext)\n", | |
| " this.root.append(titlebar);\n", | |
| " this.header = titletext[0];\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_canvas = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var canvas_div = $('<div/>');\n", | |
| "\n", | |
| " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
| "\n", | |
| " function canvas_keyboard_event(event) {\n", | |
| " return fig.key_event(event, event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
| " canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
| " this.canvas_div = canvas_div\n", | |
| " this._canvas_extra_style(canvas_div)\n", | |
| " this.root.append(canvas_div);\n", | |
| "\n", | |
| " var canvas = $('<canvas/>');\n", | |
| " canvas.addClass('mpl-canvas');\n", | |
| " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
| "\n", | |
| " this.canvas = canvas[0];\n", | |
| " this.context = canvas[0].getContext(\"2d\");\n", | |
| "\n", | |
| " var rubberband = $('<canvas/>');\n", | |
| " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
| "\n", | |
| " var pass_mouse_events = true;\n", | |
| "\n", | |
| " canvas_div.resizable({\n", | |
| " start: function(event, ui) {\n", | |
| " pass_mouse_events = false;\n", | |
| " },\n", | |
| " resize: function(event, ui) {\n", | |
| " fig.request_resize(ui.size.width, ui.size.height);\n", | |
| " },\n", | |
| " stop: function(event, ui) {\n", | |
| " pass_mouse_events = true;\n", | |
| " fig.request_resize(ui.size.width, ui.size.height);\n", | |
| " },\n", | |
| " });\n", | |
| "\n", | |
| " function mouse_event_fn(event) {\n", | |
| " if (pass_mouse_events)\n", | |
| " return fig.mouse_event(event, event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " rubberband.mousedown('button_press', mouse_event_fn);\n", | |
| " rubberband.mouseup('button_release', mouse_event_fn);\n", | |
| " // Throttle sequential mouse events to 1 every 20ms.\n", | |
| " rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
| "\n", | |
| " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
| " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
| "\n", | |
| " canvas_div.on(\"wheel\", function (event) {\n", | |
| " event = event.originalEvent;\n", | |
| " event['data'] = 'scroll'\n", | |
| " if (event.deltaY < 0) {\n", | |
| " event.step = 1;\n", | |
| " } else {\n", | |
| " event.step = -1;\n", | |
| " }\n", | |
| " mouse_event_fn(event);\n", | |
| " });\n", | |
| "\n", | |
| " canvas_div.append(canvas);\n", | |
| " canvas_div.append(rubberband);\n", | |
| "\n", | |
| " this.rubberband = rubberband;\n", | |
| " this.rubberband_canvas = rubberband[0];\n", | |
| " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
| " this.rubberband_context.strokeStyle = \"#000000\";\n", | |
| "\n", | |
| " this._resize_canvas = function(width, height) {\n", | |
| " // Keep the size of the canvas, canvas container, and rubber band\n", | |
| " // canvas in synch.\n", | |
| " canvas_div.css('width', width)\n", | |
| " canvas_div.css('height', height)\n", | |
| "\n", | |
| " canvas.attr('width', width);\n", | |
| " canvas.attr('height', height);\n", | |
| "\n", | |
| " rubberband.attr('width', width);\n", | |
| " rubberband.attr('height', height);\n", | |
| " }\n", | |
| "\n", | |
| " // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
| " // upon first draw.\n", | |
| " this._resize_canvas(600, 600);\n", | |
| "\n", | |
| " // Disable right mouse context menu.\n", | |
| " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
| " return false;\n", | |
| " });\n", | |
| "\n", | |
| " function set_focus () {\n", | |
| " canvas.focus();\n", | |
| " canvas_div.focus();\n", | |
| " }\n", | |
| "\n", | |
| " window.setTimeout(set_focus, 100);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_toolbar = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var nav_element = $('<div/>')\n", | |
| " nav_element.attr('style', 'width: 100%');\n", | |
| " this.root.append(nav_element);\n", | |
| "\n", | |
| " // Define a callback function for later on.\n", | |
| " function toolbar_event(event) {\n", | |
| " return fig.toolbar_button_onclick(event['data']);\n", | |
| " }\n", | |
| " function toolbar_mouse_event(event) {\n", | |
| " return fig.toolbar_button_onmouseover(event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " for(var toolbar_ind in mpl.toolbar_items) {\n", | |
| " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
| " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
| " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
| " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
| "\n", | |
| " if (!name) {\n", | |
| " // put a spacer in here.\n", | |
| " continue;\n", | |
| " }\n", | |
| " var button = $('<button/>');\n", | |
| " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
| " 'ui-button-icon-only');\n", | |
| " button.attr('role', 'button');\n", | |
| " button.attr('aria-disabled', 'false');\n", | |
| " button.click(method_name, toolbar_event);\n", | |
| " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
| "\n", | |
| " var icon_img = $('<span/>');\n", | |
| " icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
| " icon_img.addClass(image);\n", | |
| " icon_img.addClass('ui-corner-all');\n", | |
| "\n", | |
| " var tooltip_span = $('<span/>');\n", | |
| " tooltip_span.addClass('ui-button-text');\n", | |
| " tooltip_span.html(tooltip);\n", | |
| "\n", | |
| " button.append(icon_img);\n", | |
| " button.append(tooltip_span);\n", | |
| "\n", | |
| " nav_element.append(button);\n", | |
| " }\n", | |
| "\n", | |
| " var fmt_picker_span = $('<span/>');\n", | |
| "\n", | |
| " var fmt_picker = $('<select/>');\n", | |
| " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
| " fmt_picker_span.append(fmt_picker);\n", | |
| " nav_element.append(fmt_picker_span);\n", | |
| " this.format_dropdown = fmt_picker[0];\n", | |
| "\n", | |
| " for (var ind in mpl.extensions) {\n", | |
| " var fmt = mpl.extensions[ind];\n", | |
| " var option = $(\n", | |
| " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
| " fmt_picker.append(option)\n", | |
| " }\n", | |
| "\n", | |
| " // Add hover states to the ui-buttons\n", | |
| " $( \".ui-button\" ).hover(\n", | |
| " function() { $(this).addClass(\"ui-state-hover\");},\n", | |
| " function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
| " );\n", | |
| "\n", | |
| " var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
| " nav_element.append(status_bar);\n", | |
| " this.message = status_bar[0];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
| " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
| " // which will in turn request a refresh of the image.\n", | |
| " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.send_message = function(type, properties) {\n", | |
| " properties['type'] = type;\n", | |
| " properties['figure_id'] = this.id;\n", | |
| " this.ws.send(JSON.stringify(properties));\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.send_draw_message = function() {\n", | |
| " if (!this.waiting) {\n", | |
| " this.waiting = true;\n", | |
| " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
| " var format_dropdown = fig.format_dropdown;\n", | |
| " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
| " fig.ondownload(fig, format);\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
| " var size = msg['size'];\n", | |
| " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
| " fig._resize_canvas(size[0], size[1]);\n", | |
| " fig.send_message(\"refresh\", {});\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
| " var x0 = msg['x0'];\n", | |
| " var y0 = fig.canvas.height - msg['y0'];\n", | |
| " var x1 = msg['x1'];\n", | |
| " var y1 = fig.canvas.height - msg['y1'];\n", | |
| " x0 = Math.floor(x0) + 0.5;\n", | |
| " y0 = Math.floor(y0) + 0.5;\n", | |
| " x1 = Math.floor(x1) + 0.5;\n", | |
| " y1 = Math.floor(y1) + 0.5;\n", | |
| " var min_x = Math.min(x0, x1);\n", | |
| " var min_y = Math.min(y0, y1);\n", | |
| " var width = Math.abs(x1 - x0);\n", | |
| " var height = Math.abs(y1 - y0);\n", | |
| "\n", | |
| " fig.rubberband_context.clearRect(\n", | |
| " 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
| "\n", | |
| " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
| " // Updates the figure title.\n", | |
| " fig.header.textContent = msg['label'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
| " var cursor = msg['cursor'];\n", | |
| " switch(cursor)\n", | |
| " {\n", | |
| " case 0:\n", | |
| " cursor = 'pointer';\n", | |
| " break;\n", | |
| " case 1:\n", | |
| " cursor = 'default';\n", | |
| " break;\n", | |
| " case 2:\n", | |
| " cursor = 'crosshair';\n", | |
| " break;\n", | |
| " case 3:\n", | |
| " cursor = 'move';\n", | |
| " break;\n", | |
| " }\n", | |
| " fig.rubberband_canvas.style.cursor = cursor;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
| " fig.message.textContent = msg['message'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
| " // Request the server to send over a new figure.\n", | |
| " fig.send_draw_message();\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
| " fig.image_mode = msg['mode'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
| " // Called whenever the canvas gets updated.\n", | |
| " this.send_message(\"ack\", {});\n", | |
| "}\n", | |
| "\n", | |
| "// A function to construct a web socket function for onmessage handling.\n", | |
| "// Called in the figure constructor.\n", | |
| "mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
| " return function socket_on_message(evt) {\n", | |
| " if (evt.data instanceof Blob) {\n", | |
| " /* FIXME: We get \"Resource interpreted as Image but\n", | |
| " * transferred with MIME type text/plain:\" errors on\n", | |
| " * Chrome. But how to set the MIME type? It doesn't seem\n", | |
| " * to be part of the websocket stream */\n", | |
| " evt.data.type = \"image/png\";\n", | |
| "\n", | |
| " /* Free the memory for the previous frames */\n", | |
| " if (fig.imageObj.src) {\n", | |
| " (window.URL || window.webkitURL).revokeObjectURL(\n", | |
| " fig.imageObj.src);\n", | |
| " }\n", | |
| "\n", | |
| " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
| " evt.data);\n", | |
| " fig.updated_canvas_event();\n", | |
| " fig.waiting = false;\n", | |
| " return;\n", | |
| " }\n", | |
| " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", | |
| " fig.imageObj.src = evt.data;\n", | |
| " fig.updated_canvas_event();\n", | |
| " fig.waiting = false;\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " var msg = JSON.parse(evt.data);\n", | |
| " var msg_type = msg['type'];\n", | |
| "\n", | |
| " // Call the \"handle_{type}\" callback, which takes\n", | |
| " // the figure and JSON message as its only arguments.\n", | |
| " try {\n", | |
| " var callback = fig[\"handle_\" + msg_type];\n", | |
| " } catch (e) {\n", | |
| " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " if (callback) {\n", | |
| " try {\n", | |
| " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", | |
| " callback(fig, msg);\n", | |
| " } catch (e) {\n", | |
| " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", | |
| " }\n", | |
| " }\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", | |
| "mpl.findpos = function(e) {\n", | |
| " //this section is from http://www.quirksmode.org/js/events_properties.html\n", | |
| " var targ;\n", | |
| " if (!e)\n", | |
| " e = window.event;\n", | |
| " if (e.target)\n", | |
| " targ = e.target;\n", | |
| " else if (e.srcElement)\n", | |
| " targ = e.srcElement;\n", | |
| " if (targ.nodeType == 3) // defeat Safari bug\n", | |
| " targ = targ.parentNode;\n", | |
| "\n", | |
| " // jQuery normalizes the pageX and pageY\n", | |
| " // pageX,Y are the mouse positions relative to the document\n", | |
| " // offset() returns the position of the element relative to the document\n", | |
| " var x = e.pageX - $(targ).offset().left;\n", | |
| " var y = e.pageY - $(targ).offset().top;\n", | |
| "\n", | |
| " return {\"x\": x, \"y\": y};\n", | |
| "};\n", | |
| "\n", | |
| "/*\n", | |
| " * return a copy of an object with only non-object keys\n", | |
| " * we need this to avoid circular references\n", | |
| " * http://stackoverflow.com/a/24161582/3208463\n", | |
| " */\n", | |
| "function simpleKeys (original) {\n", | |
| " return Object.keys(original).reduce(function (obj, key) {\n", | |
| " if (typeof original[key] !== 'object')\n", | |
| " obj[key] = original[key]\n", | |
| " return obj;\n", | |
| " }, {});\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.mouse_event = function(event, name) {\n", | |
| " var canvas_pos = mpl.findpos(event)\n", | |
| "\n", | |
| " if (name === 'button_press')\n", | |
| " {\n", | |
| " this.canvas.focus();\n", | |
| " this.canvas_div.focus();\n", | |
| " }\n", | |
| "\n", | |
| " var x = canvas_pos.x;\n", | |
| " var y = canvas_pos.y;\n", | |
| "\n", | |
| " this.send_message(name, {x: x, y: y, button: event.button,\n", | |
| " step: event.step,\n", | |
| " guiEvent: simpleKeys(event)});\n", | |
| "\n", | |
| " /* This prevents the web browser from automatically changing to\n", | |
| " * the text insertion cursor when the button is pressed. We want\n", | |
| " * to control all of the cursor setting manually through the\n", | |
| " * 'cursor' event from matplotlib */\n", | |
| " event.preventDefault();\n", | |
| " return false;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
| " // Handle any extra behaviour associated with a key event\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.key_event = function(event, name) {\n", | |
| "\n", | |
| " // Prevent repeat events\n", | |
| " if (name == 'key_press')\n", | |
| " {\n", | |
| " if (event.which === this._key)\n", | |
| " return;\n", | |
| " else\n", | |
| " this._key = event.which;\n", | |
| " }\n", | |
| " if (name == 'key_release')\n", | |
| " this._key = null;\n", | |
| "\n", | |
| " var value = '';\n", | |
| " if (event.ctrlKey && event.which != 17)\n", | |
| " value += \"ctrl+\";\n", | |
| " if (event.altKey && event.which != 18)\n", | |
| " value += \"alt+\";\n", | |
| " if (event.shiftKey && event.which != 16)\n", | |
| " value += \"shift+\";\n", | |
| "\n", | |
| " value += 'k';\n", | |
| " value += event.which.toString();\n", | |
| "\n", | |
| " this._key_event_extra(event, name);\n", | |
| "\n", | |
| " this.send_message(name, {key: value,\n", | |
| " guiEvent: simpleKeys(event)});\n", | |
| " return false;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
| " if (name == 'download') {\n", | |
| " this.handle_save(this, null);\n", | |
| " } else {\n", | |
| " this.send_message(\"toolbar_button\", {name: name});\n", | |
| " }\n", | |
| "};\n", | |
| "\n", | |
| "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
| " this.message.textContent = tooltip;\n", | |
| "};\n", | |
| "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
| "\n", | |
| "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", | |
| "\n", | |
| "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
| " // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
| " // object with the appropriate methods. Currently this is a non binary\n", | |
| " // socket, so there is still some room for performance tuning.\n", | |
| " var ws = {};\n", | |
| "\n", | |
| " ws.close = function() {\n", | |
| " comm.close()\n", | |
| " };\n", | |
| " ws.send = function(m) {\n", | |
| " //console.log('sending', m);\n", | |
| " comm.send(m);\n", | |
| " };\n", | |
| " // Register the callback with on_msg.\n", | |
| " comm.on_msg(function(msg) {\n", | |
| " //console.log('receiving', msg['content']['data'], msg);\n", | |
| " // Pass the mpl event to the overriden (by mpl) onmessage function.\n", | |
| " ws.onmessage(msg['content']['data'])\n", | |
| " });\n", | |
| " return ws;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.mpl_figure_comm = function(comm, msg) {\n", | |
| " // This is the function which gets called when the mpl process\n", | |
| " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
| "\n", | |
| " var id = msg.content.data.id;\n", | |
| " // Get hold of the div created by the display call when the Comm\n", | |
| " // socket was opened in Python.\n", | |
| " var element = $(\"#\" + id);\n", | |
| " var ws_proxy = comm_websocket_adapter(comm)\n", | |
| "\n", | |
| " function ondownload(figure, format) {\n", | |
| " window.open(figure.imageObj.src);\n", | |
| " }\n", | |
| "\n", | |
| " var fig = new mpl.figure(id, ws_proxy,\n", | |
| " ondownload,\n", | |
| " element.get(0));\n", | |
| "\n", | |
| " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
| " // web socket which is closed, not our websocket->open comm proxy.\n", | |
| " ws_proxy.onopen();\n", | |
| "\n", | |
| " fig.parent_element = element.get(0);\n", | |
| " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
| " if (!fig.cell_info) {\n", | |
| " console.error(\"Failed to find cell for figure\", id, fig);\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " var output_index = fig.cell_info[2]\n", | |
| " var cell = fig.cell_info[0];\n", | |
| "\n", | |
| "};\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
| " fig.root.unbind('remove')\n", | |
| "\n", | |
| " // Update the output cell to use the data from the current canvas.\n", | |
| " fig.push_to_output();\n", | |
| " var dataURL = fig.canvas.toDataURL();\n", | |
| " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", | |
| " // the notebook keyboard shortcuts fail.\n", | |
| " IPython.keyboard_manager.enable()\n", | |
| " $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n", | |
| " fig.close_ws(fig, msg);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.close_ws = function(fig, msg){\n", | |
| " fig.send_message('closing', msg);\n", | |
| " // fig.ws.close()\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", | |
| " // Turn the data on the canvas into data in the output cell.\n", | |
| " var dataURL = this.canvas.toDataURL();\n", | |
| " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
| " // Tell IPython that the notebook contents must change.\n", | |
| " IPython.notebook.set_dirty(true);\n", | |
| " this.send_message(\"ack\", {});\n", | |
| " var fig = this;\n", | |
| " // Wait a second, then push the new image to the DOM so\n", | |
| " // that it is saved nicely (might be nice to debounce this).\n", | |
| " setTimeout(function () { fig.push_to_output() }, 1000);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_toolbar = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var nav_element = $('<div/>')\n", | |
| " nav_element.attr('style', 'width: 100%');\n", | |
| " this.root.append(nav_element);\n", | |
| "\n", | |
| " // Define a callback function for later on.\n", | |
| " function toolbar_event(event) {\n", | |
| " return fig.toolbar_button_onclick(event['data']);\n", | |
| " }\n", | |
| " function toolbar_mouse_event(event) {\n", | |
| " return fig.toolbar_button_onmouseover(event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " for(var toolbar_ind in mpl.toolbar_items){\n", | |
| " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
| " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
| " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
| " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
| "\n", | |
| " if (!name) { continue; };\n", | |
| "\n", | |
| " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", | |
| " button.click(method_name, toolbar_event);\n", | |
| " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
| " nav_element.append(button);\n", | |
| " }\n", | |
| "\n", | |
| " // Add the status bar.\n", | |
| " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", | |
| " nav_element.append(status_bar);\n", | |
| " this.message = status_bar[0];\n", | |
| "\n", | |
| " // Add the close button to the window.\n", | |
| " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", | |
| " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", | |
| " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", | |
| " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", | |
| " buttongrp.append(button);\n", | |
| " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", | |
| " titlebar.prepend(buttongrp);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._root_extra_style = function(el){\n", | |
| " var fig = this\n", | |
| " el.on(\"remove\", function(){\n", | |
| "\tfig.close_ws(fig, {});\n", | |
| " });\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
| " // this is important to make the div 'focusable\n", | |
| " el.attr('tabindex', 0)\n", | |
| " // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
| " // off when our div gets focus\n", | |
| "\n", | |
| " // location in version 3\n", | |
| " if (IPython.notebook.keyboard_manager) {\n", | |
| " IPython.notebook.keyboard_manager.register_events(el);\n", | |
| " }\n", | |
| " else {\n", | |
| " // location in version 2\n", | |
| " IPython.keyboard_manager.register_events(el);\n", | |
| " }\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
| " var manager = IPython.notebook.keyboard_manager;\n", | |
| " if (!manager)\n", | |
| " manager = IPython.keyboard_manager;\n", | |
| "\n", | |
| " // Check for shift+enter\n", | |
| " if (event.shiftKey && event.which == 13) {\n", | |
| " this.canvas_div.blur();\n", | |
| " event.shiftKey = false;\n", | |
| " // Send a \"J\" for go to next cell\n", | |
| " event.which = 74;\n", | |
| " event.keyCode = 74;\n", | |
| " manager.command_mode();\n", | |
| " manager.handle_keydown(event);\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
| " fig.ondownload(fig, null);\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.find_output_cell = function(html_output) {\n", | |
| " // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
| " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
| " // IPython event is triggered only after the cells have been serialised, which for\n", | |
| " // our purposes (turning an active figure into a static one), is too late.\n", | |
| " var cells = IPython.notebook.get_cells();\n", | |
| " var ncells = cells.length;\n", | |
| " for (var i=0; i<ncells; i++) {\n", | |
| " var cell = cells[i];\n", | |
| " if (cell.cell_type === 'code'){\n", | |
| " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
| " var data = cell.output_area.outputs[j];\n", | |
| " if (data.data) {\n", | |
| " // IPython >= 3 moved mimebundle to data attribute of output\n", | |
| " data = data.data;\n", | |
| " }\n", | |
| " if (data['text/html'] == html_output) {\n", | |
| " return [cell, data, j];\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "// Register the function which deals with the matplotlib target/channel.\n", | |
| "// The kernel may be null if the page has been refreshed.\n", | |
| "if (IPython.notebook.kernel != null) {\n", | |
| " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
| "}\n" | |
| ], | |
| "text/plain": [ | |
| "<IPython.core.display.Javascript object>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOydebhN5fvG17dfpSRF4kRzmamIUlSEIpVkyJChQYSSeR4LkSEyZCqzZJ7nMmTMFFHmzERmjnHfvz8em3P22cN61/u8a61Tz+e69uWcPbzndc7aaz/rGe7bsgRBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARB+JfwP8uyMlmWlVpucpOb3OQmN7klq1smiz7HBUGZTJZlQW5yk5vc5CY3uSXLWyZLEByQ2rIs7Nu3D6dOnZKbx7e6det6vge5yd/Cjzf5e/jnJn8Lf9z27dsXDABTexxHCMmU1JZl4dSpUxC8p0GDBl5vQbiG/C38hfw9/IP8LfzBqVOnJAAUtJAA0EfIidU/yN/CX8jfwz/I38IfSAAo6CIBoI+YM2eO11sQriF/C38hfw//IH8LfyABoKCLBICCIAiCkMyQAFDQRQJAQRAEQUhmSAAo6CIBoCAIgsBKfHy851Oy/4ZbfHx8xN+xBICCLhIACoIgCGzEx8cjLi7Oa228f8UtLi4uYhAoAaCgiwSAgiAIAhvBwET0ZfVuQZ2/SJ/PEgAKukgAKAiCILARDEzkc0WPWL9HCQAFXSQAFARBENiQAJAHCQAF00gAKAiCILAhASAPEgAKppEAUBAEQWBDAkAeJAAUTCMBoCAIgsCGBIA8SAAomEYCQEEQBIGN/3oAeOHChYiPbdy4EatXr7a1jgSAgmkkABQEQRDY+C8E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\">" | |
| ], | |
| "text/plain": [ | |
| "<IPython.core.display.HTML object>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "def plot():\n", | |
| " plt.figure()\n", | |
| " plt.plot(sys.times, np.rad2deg(x[:, :2]))\n", | |
| " plt.legend([sym.latex(s, mode='inline') for s in sys.coordinates])\n", | |
| "plot()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Chaotic Behavior\n", | |
| "\n", | |
| "Now change the intial condition of the plat angle just slighty to see if the behvior of the system is similar." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 32, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "application/javascript": [ | |
| "/* Put everything inside the global mpl namespace */\n", | |
| "window.mpl = {};\n", | |
| "\n", | |
| "mpl.get_websocket_type = function() {\n", | |
| " if (typeof(WebSocket) !== 'undefined') {\n", | |
| " return WebSocket;\n", | |
| " } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
| " return MozWebSocket;\n", | |
| " } else {\n", | |
| " alert('Your browser does not have WebSocket support.' +\n", | |
| " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
| " 'Firefox 4 and 5 are also supported but you ' +\n", | |
| " 'have to enable WebSockets in about:config.');\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
| " this.id = figure_id;\n", | |
| "\n", | |
| " this.ws = websocket;\n", | |
| "\n", | |
| " this.supports_binary = (this.ws.binaryType != undefined);\n", | |
| "\n", | |
| " if (!this.supports_binary) {\n", | |
| " var warnings = document.getElementById(\"mpl-warnings\");\n", | |
| " if (warnings) {\n", | |
| " warnings.style.display = 'block';\n", | |
| " warnings.textContent = (\n", | |
| " \"This browser does not support binary websocket messages. \" +\n", | |
| " \"Performance may be slow.\");\n", | |
| " }\n", | |
| " }\n", | |
| "\n", | |
| " this.imageObj = new Image();\n", | |
| "\n", | |
| " this.context = undefined;\n", | |
| " this.message = undefined;\n", | |
| " this.canvas = undefined;\n", | |
| " this.rubberband_canvas = undefined;\n", | |
| " this.rubberband_context = undefined;\n", | |
| " this.format_dropdown = undefined;\n", | |
| "\n", | |
| " this.image_mode = 'full';\n", | |
| "\n", | |
| " this.root = $('<div/>');\n", | |
| " this._root_extra_style(this.root)\n", | |
| " this.root.attr('style', 'display: inline-block');\n", | |
| "\n", | |
| " $(parent_element).append(this.root);\n", | |
| "\n", | |
| " this._init_header(this);\n", | |
| " this._init_canvas(this);\n", | |
| " this._init_toolbar(this);\n", | |
| "\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " this.waiting = false;\n", | |
| "\n", | |
| " this.ws.onopen = function () {\n", | |
| " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
| " fig.send_message(\"send_image_mode\", {});\n", | |
| " fig.send_message(\"refresh\", {});\n", | |
| " }\n", | |
| "\n", | |
| " this.imageObj.onload = function() {\n", | |
| " if (fig.image_mode == 'full') {\n", | |
| " // Full images could contain transparency (where diff images\n", | |
| " // almost always do), so we need to clear the canvas so that\n", | |
| " // there is no ghosting.\n", | |
| " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
| " }\n", | |
| " fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
| " };\n", | |
| "\n", | |
| " this.imageObj.onunload = function() {\n", | |
| " this.ws.close();\n", | |
| " }\n", | |
| "\n", | |
| " this.ws.onmessage = this._make_on_message_function(this);\n", | |
| "\n", | |
| " this.ondownload = ondownload;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_header = function() {\n", | |
| " var titlebar = $(\n", | |
| " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", | |
| " 'ui-helper-clearfix\"/>');\n", | |
| " var titletext = $(\n", | |
| " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", | |
| " 'text-align: center; padding: 3px;\"/>');\n", | |
| " titlebar.append(titletext)\n", | |
| " this.root.append(titlebar);\n", | |
| " this.header = titletext[0];\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_canvas = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var canvas_div = $('<div/>');\n", | |
| "\n", | |
| " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
| "\n", | |
| " function canvas_keyboard_event(event) {\n", | |
| " return fig.key_event(event, event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
| " canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
| " this.canvas_div = canvas_div\n", | |
| " this._canvas_extra_style(canvas_div)\n", | |
| " this.root.append(canvas_div);\n", | |
| "\n", | |
| " var canvas = $('<canvas/>');\n", | |
| " canvas.addClass('mpl-canvas');\n", | |
| " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
| "\n", | |
| " this.canvas = canvas[0];\n", | |
| " this.context = canvas[0].getContext(\"2d\");\n", | |
| "\n", | |
| " var rubberband = $('<canvas/>');\n", | |
| " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
| "\n", | |
| " var pass_mouse_events = true;\n", | |
| "\n", | |
| " canvas_div.resizable({\n", | |
| " start: function(event, ui) {\n", | |
| " pass_mouse_events = false;\n", | |
| " },\n", | |
| " resize: function(event, ui) {\n", | |
| " fig.request_resize(ui.size.width, ui.size.height);\n", | |
| " },\n", | |
| " stop: function(event, ui) {\n", | |
| " pass_mouse_events = true;\n", | |
| " fig.request_resize(ui.size.width, ui.size.height);\n", | |
| " },\n", | |
| " });\n", | |
| "\n", | |
| " function mouse_event_fn(event) {\n", | |
| " if (pass_mouse_events)\n", | |
| " return fig.mouse_event(event, event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " rubberband.mousedown('button_press', mouse_event_fn);\n", | |
| " rubberband.mouseup('button_release', mouse_event_fn);\n", | |
| " // Throttle sequential mouse events to 1 every 20ms.\n", | |
| " rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
| "\n", | |
| " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
| " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
| "\n", | |
| " canvas_div.on(\"wheel\", function (event) {\n", | |
| " event = event.originalEvent;\n", | |
| " event['data'] = 'scroll'\n", | |
| " if (event.deltaY < 0) {\n", | |
| " event.step = 1;\n", | |
| " } else {\n", | |
| " event.step = -1;\n", | |
| " }\n", | |
| " mouse_event_fn(event);\n", | |
| " });\n", | |
| "\n", | |
| " canvas_div.append(canvas);\n", | |
| " canvas_div.append(rubberband);\n", | |
| "\n", | |
| " this.rubberband = rubberband;\n", | |
| " this.rubberband_canvas = rubberband[0];\n", | |
| " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
| " this.rubberband_context.strokeStyle = \"#000000\";\n", | |
| "\n", | |
| " this._resize_canvas = function(width, height) {\n", | |
| " // Keep the size of the canvas, canvas container, and rubber band\n", | |
| " // canvas in synch.\n", | |
| " canvas_div.css('width', width)\n", | |
| " canvas_div.css('height', height)\n", | |
| "\n", | |
| " canvas.attr('width', width);\n", | |
| " canvas.attr('height', height);\n", | |
| "\n", | |
| " rubberband.attr('width', width);\n", | |
| " rubberband.attr('height', height);\n", | |
| " }\n", | |
| "\n", | |
| " // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
| " // upon first draw.\n", | |
| " this._resize_canvas(600, 600);\n", | |
| "\n", | |
| " // Disable right mouse context menu.\n", | |
| " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
| " return false;\n", | |
| " });\n", | |
| "\n", | |
| " function set_focus () {\n", | |
| " canvas.focus();\n", | |
| " canvas_div.focus();\n", | |
| " }\n", | |
| "\n", | |
| " window.setTimeout(set_focus, 100);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_toolbar = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var nav_element = $('<div/>')\n", | |
| " nav_element.attr('style', 'width: 100%');\n", | |
| " this.root.append(nav_element);\n", | |
| "\n", | |
| " // Define a callback function for later on.\n", | |
| " function toolbar_event(event) {\n", | |
| " return fig.toolbar_button_onclick(event['data']);\n", | |
| " }\n", | |
| " function toolbar_mouse_event(event) {\n", | |
| " return fig.toolbar_button_onmouseover(event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " for(var toolbar_ind in mpl.toolbar_items) {\n", | |
| " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
| " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
| " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
| " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
| "\n", | |
| " if (!name) {\n", | |
| " // put a spacer in here.\n", | |
| " continue;\n", | |
| " }\n", | |
| " var button = $('<button/>');\n", | |
| " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
| " 'ui-button-icon-only');\n", | |
| " button.attr('role', 'button');\n", | |
| " button.attr('aria-disabled', 'false');\n", | |
| " button.click(method_name, toolbar_event);\n", | |
| " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
| "\n", | |
| " var icon_img = $('<span/>');\n", | |
| " icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
| " icon_img.addClass(image);\n", | |
| " icon_img.addClass('ui-corner-all');\n", | |
| "\n", | |
| " var tooltip_span = $('<span/>');\n", | |
| " tooltip_span.addClass('ui-button-text');\n", | |
| " tooltip_span.html(tooltip);\n", | |
| "\n", | |
| " button.append(icon_img);\n", | |
| " button.append(tooltip_span);\n", | |
| "\n", | |
| " nav_element.append(button);\n", | |
| " }\n", | |
| "\n", | |
| " var fmt_picker_span = $('<span/>');\n", | |
| "\n", | |
| " var fmt_picker = $('<select/>');\n", | |
| " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
| " fmt_picker_span.append(fmt_picker);\n", | |
| " nav_element.append(fmt_picker_span);\n", | |
| " this.format_dropdown = fmt_picker[0];\n", | |
| "\n", | |
| " for (var ind in mpl.extensions) {\n", | |
| " var fmt = mpl.extensions[ind];\n", | |
| " var option = $(\n", | |
| " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
| " fmt_picker.append(option)\n", | |
| " }\n", | |
| "\n", | |
| " // Add hover states to the ui-buttons\n", | |
| " $( \".ui-button\" ).hover(\n", | |
| " function() { $(this).addClass(\"ui-state-hover\");},\n", | |
| " function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
| " );\n", | |
| "\n", | |
| " var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
| " nav_element.append(status_bar);\n", | |
| " this.message = status_bar[0];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
| " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
| " // which will in turn request a refresh of the image.\n", | |
| " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.send_message = function(type, properties) {\n", | |
| " properties['type'] = type;\n", | |
| " properties['figure_id'] = this.id;\n", | |
| " this.ws.send(JSON.stringify(properties));\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.send_draw_message = function() {\n", | |
| " if (!this.waiting) {\n", | |
| " this.waiting = true;\n", | |
| " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
| " var format_dropdown = fig.format_dropdown;\n", | |
| " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
| " fig.ondownload(fig, format);\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
| " var size = msg['size'];\n", | |
| " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
| " fig._resize_canvas(size[0], size[1]);\n", | |
| " fig.send_message(\"refresh\", {});\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
| " var x0 = msg['x0'];\n", | |
| " var y0 = fig.canvas.height - msg['y0'];\n", | |
| " var x1 = msg['x1'];\n", | |
| " var y1 = fig.canvas.height - msg['y1'];\n", | |
| " x0 = Math.floor(x0) + 0.5;\n", | |
| " y0 = Math.floor(y0) + 0.5;\n", | |
| " x1 = Math.floor(x1) + 0.5;\n", | |
| " y1 = Math.floor(y1) + 0.5;\n", | |
| " var min_x = Math.min(x0, x1);\n", | |
| " var min_y = Math.min(y0, y1);\n", | |
| " var width = Math.abs(x1 - x0);\n", | |
| " var height = Math.abs(y1 - y0);\n", | |
| "\n", | |
| " fig.rubberband_context.clearRect(\n", | |
| " 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
| "\n", | |
| " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
| " // Updates the figure title.\n", | |
| " fig.header.textContent = msg['label'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
| " var cursor = msg['cursor'];\n", | |
| " switch(cursor)\n", | |
| " {\n", | |
| " case 0:\n", | |
| " cursor = 'pointer';\n", | |
| " break;\n", | |
| " case 1:\n", | |
| " cursor = 'default';\n", | |
| " break;\n", | |
| " case 2:\n", | |
| " cursor = 'crosshair';\n", | |
| " break;\n", | |
| " case 3:\n", | |
| " cursor = 'move';\n", | |
| " break;\n", | |
| " }\n", | |
| " fig.rubberband_canvas.style.cursor = cursor;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
| " fig.message.textContent = msg['message'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
| " // Request the server to send over a new figure.\n", | |
| " fig.send_draw_message();\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
| " fig.image_mode = msg['mode'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
| " // Called whenever the canvas gets updated.\n", | |
| " this.send_message(\"ack\", {});\n", | |
| "}\n", | |
| "\n", | |
| "// A function to construct a web socket function for onmessage handling.\n", | |
| "// Called in the figure constructor.\n", | |
| "mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
| " return function socket_on_message(evt) {\n", | |
| " if (evt.data instanceof Blob) {\n", | |
| " /* FIXME: We get \"Resource interpreted as Image but\n", | |
| " * transferred with MIME type text/plain:\" errors on\n", | |
| " * Chrome. But how to set the MIME type? It doesn't seem\n", | |
| " * to be part of the websocket stream */\n", | |
| " evt.data.type = \"image/png\";\n", | |
| "\n", | |
| " /* Free the memory for the previous frames */\n", | |
| " if (fig.imageObj.src) {\n", | |
| " (window.URL || window.webkitURL).revokeObjectURL(\n", | |
| " fig.imageObj.src);\n", | |
| " }\n", | |
| "\n", | |
| " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
| " evt.data);\n", | |
| " fig.updated_canvas_event();\n", | |
| " fig.waiting = false;\n", | |
| " return;\n", | |
| " }\n", | |
| " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", | |
| " fig.imageObj.src = evt.data;\n", | |
| " fig.updated_canvas_event();\n", | |
| " fig.waiting = false;\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " var msg = JSON.parse(evt.data);\n", | |
| " var msg_type = msg['type'];\n", | |
| "\n", | |
| " // Call the \"handle_{type}\" callback, which takes\n", | |
| " // the figure and JSON message as its only arguments.\n", | |
| " try {\n", | |
| " var callback = fig[\"handle_\" + msg_type];\n", | |
| " } catch (e) {\n", | |
| " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " if (callback) {\n", | |
| " try {\n", | |
| " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", | |
| " callback(fig, msg);\n", | |
| " } catch (e) {\n", | |
| " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", | |
| " }\n", | |
| " }\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", | |
| "mpl.findpos = function(e) {\n", | |
| " //this section is from http://www.quirksmode.org/js/events_properties.html\n", | |
| " var targ;\n", | |
| " if (!e)\n", | |
| " e = window.event;\n", | |
| " if (e.target)\n", | |
| " targ = e.target;\n", | |
| " else if (e.srcElement)\n", | |
| " targ = e.srcElement;\n", | |
| " if (targ.nodeType == 3) // defeat Safari bug\n", | |
| " targ = targ.parentNode;\n", | |
| "\n", | |
| " // jQuery normalizes the pageX and pageY\n", | |
| " // pageX,Y are the mouse positions relative to the document\n", | |
| " // offset() returns the position of the element relative to the document\n", | |
| " var x = e.pageX - $(targ).offset().left;\n", | |
| " var y = e.pageY - $(targ).offset().top;\n", | |
| "\n", | |
| " return {\"x\": x, \"y\": y};\n", | |
| "};\n", | |
| "\n", | |
| "/*\n", | |
| " * return a copy of an object with only non-object keys\n", | |
| " * we need this to avoid circular references\n", | |
| " * http://stackoverflow.com/a/24161582/3208463\n", | |
| " */\n", | |
| "function simpleKeys (original) {\n", | |
| " return Object.keys(original).reduce(function (obj, key) {\n", | |
| " if (typeof original[key] !== 'object')\n", | |
| " obj[key] = original[key]\n", | |
| " return obj;\n", | |
| " }, {});\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.mouse_event = function(event, name) {\n", | |
| " var canvas_pos = mpl.findpos(event)\n", | |
| "\n", | |
| " if (name === 'button_press')\n", | |
| " {\n", | |
| " this.canvas.focus();\n", | |
| " this.canvas_div.focus();\n", | |
| " }\n", | |
| "\n", | |
| " var x = canvas_pos.x;\n", | |
| " var y = canvas_pos.y;\n", | |
| "\n", | |
| " this.send_message(name, {x: x, y: y, button: event.button,\n", | |
| " step: event.step,\n", | |
| " guiEvent: simpleKeys(event)});\n", | |
| "\n", | |
| " /* This prevents the web browser from automatically changing to\n", | |
| " * the text insertion cursor when the button is pressed. We want\n", | |
| " * to control all of the cursor setting manually through the\n", | |
| " * 'cursor' event from matplotlib */\n", | |
| " event.preventDefault();\n", | |
| " return false;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
| " // Handle any extra behaviour associated with a key event\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.key_event = function(event, name) {\n", | |
| "\n", | |
| " // Prevent repeat events\n", | |
| " if (name == 'key_press')\n", | |
| " {\n", | |
| " if (event.which === this._key)\n", | |
| " return;\n", | |
| " else\n", | |
| " this._key = event.which;\n", | |
| " }\n", | |
| " if (name == 'key_release')\n", | |
| " this._key = null;\n", | |
| "\n", | |
| " var value = '';\n", | |
| " if (event.ctrlKey && event.which != 17)\n", | |
| " value += \"ctrl+\";\n", | |
| " if (event.altKey && event.which != 18)\n", | |
| " value += \"alt+\";\n", | |
| " if (event.shiftKey && event.which != 16)\n", | |
| " value += \"shift+\";\n", | |
| "\n", | |
| " value += 'k';\n", | |
| " value += event.which.toString();\n", | |
| "\n", | |
| " this._key_event_extra(event, name);\n", | |
| "\n", | |
| " this.send_message(name, {key: value,\n", | |
| " guiEvent: simpleKeys(event)});\n", | |
| " return false;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
| " if (name == 'download') {\n", | |
| " this.handle_save(this, null);\n", | |
| " } else {\n", | |
| " this.send_message(\"toolbar_button\", {name: name});\n", | |
| " }\n", | |
| "};\n", | |
| "\n", | |
| "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
| " this.message.textContent = tooltip;\n", | |
| "};\n", | |
| "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
| "\n", | |
| "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", | |
| "\n", | |
| "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
| " // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
| " // object with the appropriate methods. Currently this is a non binary\n", | |
| " // socket, so there is still some room for performance tuning.\n", | |
| " var ws = {};\n", | |
| "\n", | |
| " ws.close = function() {\n", | |
| " comm.close()\n", | |
| " };\n", | |
| " ws.send = function(m) {\n", | |
| " //console.log('sending', m);\n", | |
| " comm.send(m);\n", | |
| " };\n", | |
| " // Register the callback with on_msg.\n", | |
| " comm.on_msg(function(msg) {\n", | |
| " //console.log('receiving', msg['content']['data'], msg);\n", | |
| " // Pass the mpl event to the overriden (by mpl) onmessage function.\n", | |
| " ws.onmessage(msg['content']['data'])\n", | |
| " });\n", | |
| " return ws;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.mpl_figure_comm = function(comm, msg) {\n", | |
| " // This is the function which gets called when the mpl process\n", | |
| " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
| "\n", | |
| " var id = msg.content.data.id;\n", | |
| " // Get hold of the div created by the display call when the Comm\n", | |
| " // socket was opened in Python.\n", | |
| " var element = $(\"#\" + id);\n", | |
| " var ws_proxy = comm_websocket_adapter(comm)\n", | |
| "\n", | |
| " function ondownload(figure, format) {\n", | |
| " window.open(figure.imageObj.src);\n", | |
| " }\n", | |
| "\n", | |
| " var fig = new mpl.figure(id, ws_proxy,\n", | |
| " ondownload,\n", | |
| " element.get(0));\n", | |
| "\n", | |
| " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
| " // web socket which is closed, not our websocket->open comm proxy.\n", | |
| " ws_proxy.onopen();\n", | |
| "\n", | |
| " fig.parent_element = element.get(0);\n", | |
| " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
| " if (!fig.cell_info) {\n", | |
| " console.error(\"Failed to find cell for figure\", id, fig);\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " var output_index = fig.cell_info[2]\n", | |
| " var cell = fig.cell_info[0];\n", | |
| "\n", | |
| "};\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
| " fig.root.unbind('remove')\n", | |
| "\n", | |
| " // Update the output cell to use the data from the current canvas.\n", | |
| " fig.push_to_output();\n", | |
| " var dataURL = fig.canvas.toDataURL();\n", | |
| " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", | |
| " // the notebook keyboard shortcuts fail.\n", | |
| " IPython.keyboard_manager.enable()\n", | |
| " $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n", | |
| " fig.close_ws(fig, msg);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.close_ws = function(fig, msg){\n", | |
| " fig.send_message('closing', msg);\n", | |
| " // fig.ws.close()\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", | |
| " // Turn the data on the canvas into data in the output cell.\n", | |
| " var dataURL = this.canvas.toDataURL();\n", | |
| " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
| " // Tell IPython that the notebook contents must change.\n", | |
| " IPython.notebook.set_dirty(true);\n", | |
| " this.send_message(\"ack\", {});\n", | |
| " var fig = this;\n", | |
| " // Wait a second, then push the new image to the DOM so\n", | |
| " // that it is saved nicely (might be nice to debounce this).\n", | |
| " setTimeout(function () { fig.push_to_output() }, 1000);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_toolbar = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var nav_element = $('<div/>')\n", | |
| " nav_element.attr('style', 'width: 100%');\n", | |
| " this.root.append(nav_element);\n", | |
| "\n", | |
| " // Define a callback function for later on.\n", | |
| " function toolbar_event(event) {\n", | |
| " return fig.toolbar_button_onclick(event['data']);\n", | |
| " }\n", | |
| " function toolbar_mouse_event(event) {\n", | |
| " return fig.toolbar_button_onmouseover(event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " for(var toolbar_ind in mpl.toolbar_items){\n", | |
| " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
| " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
| " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
| " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
| "\n", | |
| " if (!name) { continue; };\n", | |
| "\n", | |
| " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", | |
| " button.click(method_name, toolbar_event);\n", | |
| " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
| " nav_element.append(button);\n", | |
| " }\n", | |
| "\n", | |
| " // Add the status bar.\n", | |
| " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", | |
| " nav_element.append(status_bar);\n", | |
| " this.message = status_bar[0];\n", | |
| "\n", | |
| " // Add the close button to the window.\n", | |
| " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", | |
| " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", | |
| " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", | |
| " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", | |
| " buttongrp.append(button);\n", | |
| " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", | |
| " titlebar.prepend(buttongrp);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._root_extra_style = function(el){\n", | |
| " var fig = this\n", | |
| " el.on(\"remove\", function(){\n", | |
| "\tfig.close_ws(fig, {});\n", | |
| " });\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
| " // this is important to make the div 'focusable\n", | |
| " el.attr('tabindex', 0)\n", | |
| " // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
| " // off when our div gets focus\n", | |
| "\n", | |
| " // location in version 3\n", | |
| " if (IPython.notebook.keyboard_manager) {\n", | |
| " IPython.notebook.keyboard_manager.register_events(el);\n", | |
| " }\n", | |
| " else {\n", | |
| " // location in version 2\n", | |
| " IPython.keyboard_manager.register_events(el);\n", | |
| " }\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
| " var manager = IPython.notebook.keyboard_manager;\n", | |
| " if (!manager)\n", | |
| " manager = IPython.keyboard_manager;\n", | |
| "\n", | |
| " // Check for shift+enter\n", | |
| " if (event.shiftKey && event.which == 13) {\n", | |
| " this.canvas_div.blur();\n", | |
| " event.shiftKey = false;\n", | |
| " // Send a \"J\" for go to next cell\n", | |
| " event.which = 74;\n", | |
| " event.keyCode = 74;\n", | |
| " manager.command_mode();\n", | |
| " manager.handle_keydown(event);\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
| " fig.ondownload(fig, null);\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.find_output_cell = function(html_output) {\n", | |
| " // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
| " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
| " // IPython event is triggered only after the cells have been serialised, which for\n", | |
| " // our purposes (turning an active figure into a static one), is too late.\n", | |
| " var cells = IPython.notebook.get_cells();\n", | |
| " var ncells = cells.length;\n", | |
| " for (var i=0; i<ncells; i++) {\n", | |
| " var cell = cells[i];\n", | |
| " if (cell.cell_type === 'code'){\n", | |
| " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
| " var data = cell.output_area.outputs[j];\n", | |
| " if (data.data) {\n", | |
| " // IPython >= 3 moved mimebundle to data attribute of output\n", | |
| " data = data.data;\n", | |
| " }\n", | |
| " if (data['text/html'] == html_output) {\n", | |
| " return [cell, data, j];\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "// Register the function which deals with the matplotlib target/channel.\n", | |
| "// The kernel may be null if the page has been refreshed.\n", | |
| "if (IPython.notebook.kernel != null) {\n", | |
| " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
| "}\n" | |
| ], | |
| "text/plain": [ | |
| "<IPython.core.display.Javascript object>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<img src=\"data:image/png;base64,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\">" | |
| ], | |
| "text/plain": [ | |
| "<IPython.core.display.HTML object>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "sys.initial_conditions[phi] = np.deg2rad(1.0)\n", | |
| "x = sys.integrate()\n", | |
| "plot() " | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Seems all good, very similar behavior. But now set the rod angle to $90^\\circ$ and try the same slight change in plate angle." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 33, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "application/javascript": [ | |
| "/* Put everything inside the global mpl namespace */\n", | |
| "window.mpl = {};\n", | |
| "\n", | |
| "mpl.get_websocket_type = function() {\n", | |
| " if (typeof(WebSocket) !== 'undefined') {\n", | |
| " return WebSocket;\n", | |
| " } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
| " return MozWebSocket;\n", | |
| " } else {\n", | |
| " alert('Your browser does not have WebSocket support.' +\n", | |
| " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
| " 'Firefox 4 and 5 are also supported but you ' +\n", | |
| " 'have to enable WebSockets in about:config.');\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
| " this.id = figure_id;\n", | |
| "\n", | |
| " this.ws = websocket;\n", | |
| "\n", | |
| " this.supports_binary = (this.ws.binaryType != undefined);\n", | |
| "\n", | |
| " if (!this.supports_binary) {\n", | |
| " var warnings = document.getElementById(\"mpl-warnings\");\n", | |
| " if (warnings) {\n", | |
| " warnings.style.display = 'block';\n", | |
| " warnings.textContent = (\n", | |
| " \"This browser does not support binary websocket messages. \" +\n", | |
| " \"Performance may be slow.\");\n", | |
| " }\n", | |
| " }\n", | |
| "\n", | |
| " this.imageObj = new Image();\n", | |
| "\n", | |
| " this.context = undefined;\n", | |
| " this.message = undefined;\n", | |
| " this.canvas = undefined;\n", | |
| " this.rubberband_canvas = undefined;\n", | |
| " this.rubberband_context = undefined;\n", | |
| " this.format_dropdown = undefined;\n", | |
| "\n", | |
| " this.image_mode = 'full';\n", | |
| "\n", | |
| " this.root = $('<div/>');\n", | |
| " this._root_extra_style(this.root)\n", | |
| " this.root.attr('style', 'display: inline-block');\n", | |
| "\n", | |
| " $(parent_element).append(this.root);\n", | |
| "\n", | |
| " this._init_header(this);\n", | |
| " this._init_canvas(this);\n", | |
| " this._init_toolbar(this);\n", | |
| "\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " this.waiting = false;\n", | |
| "\n", | |
| " this.ws.onopen = function () {\n", | |
| " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
| " fig.send_message(\"send_image_mode\", {});\n", | |
| " fig.send_message(\"refresh\", {});\n", | |
| " }\n", | |
| "\n", | |
| " this.imageObj.onload = function() {\n", | |
| " if (fig.image_mode == 'full') {\n", | |
| " // Full images could contain transparency (where diff images\n", | |
| " // almost always do), so we need to clear the canvas so that\n", | |
| " // there is no ghosting.\n", | |
| " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
| " }\n", | |
| " fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
| " };\n", | |
| "\n", | |
| " this.imageObj.onunload = function() {\n", | |
| " this.ws.close();\n", | |
| " }\n", | |
| "\n", | |
| " this.ws.onmessage = this._make_on_message_function(this);\n", | |
| "\n", | |
| " this.ondownload = ondownload;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_header = function() {\n", | |
| " var titlebar = $(\n", | |
| " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", | |
| " 'ui-helper-clearfix\"/>');\n", | |
| " var titletext = $(\n", | |
| " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", | |
| " 'text-align: center; padding: 3px;\"/>');\n", | |
| " titlebar.append(titletext)\n", | |
| " this.root.append(titlebar);\n", | |
| " this.header = titletext[0];\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_canvas = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var canvas_div = $('<div/>');\n", | |
| "\n", | |
| " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
| "\n", | |
| " function canvas_keyboard_event(event) {\n", | |
| " return fig.key_event(event, event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
| " canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
| " this.canvas_div = canvas_div\n", | |
| " this._canvas_extra_style(canvas_div)\n", | |
| " this.root.append(canvas_div);\n", | |
| "\n", | |
| " var canvas = $('<canvas/>');\n", | |
| " canvas.addClass('mpl-canvas');\n", | |
| " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
| "\n", | |
| " this.canvas = canvas[0];\n", | |
| " this.context = canvas[0].getContext(\"2d\");\n", | |
| "\n", | |
| " var rubberband = $('<canvas/>');\n", | |
| " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
| "\n", | |
| " var pass_mouse_events = true;\n", | |
| "\n", | |
| " canvas_div.resizable({\n", | |
| " start: function(event, ui) {\n", | |
| " pass_mouse_events = false;\n", | |
| " },\n", | |
| " resize: function(event, ui) {\n", | |
| " fig.request_resize(ui.size.width, ui.size.height);\n", | |
| " },\n", | |
| " stop: function(event, ui) {\n", | |
| " pass_mouse_events = true;\n", | |
| " fig.request_resize(ui.size.width, ui.size.height);\n", | |
| " },\n", | |
| " });\n", | |
| "\n", | |
| " function mouse_event_fn(event) {\n", | |
| " if (pass_mouse_events)\n", | |
| " return fig.mouse_event(event, event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " rubberband.mousedown('button_press', mouse_event_fn);\n", | |
| " rubberband.mouseup('button_release', mouse_event_fn);\n", | |
| " // Throttle sequential mouse events to 1 every 20ms.\n", | |
| " rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
| "\n", | |
| " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
| " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
| "\n", | |
| " canvas_div.on(\"wheel\", function (event) {\n", | |
| " event = event.originalEvent;\n", | |
| " event['data'] = 'scroll'\n", | |
| " if (event.deltaY < 0) {\n", | |
| " event.step = 1;\n", | |
| " } else {\n", | |
| " event.step = -1;\n", | |
| " }\n", | |
| " mouse_event_fn(event);\n", | |
| " });\n", | |
| "\n", | |
| " canvas_div.append(canvas);\n", | |
| " canvas_div.append(rubberband);\n", | |
| "\n", | |
| " this.rubberband = rubberband;\n", | |
| " this.rubberband_canvas = rubberband[0];\n", | |
| " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
| " this.rubberband_context.strokeStyle = \"#000000\";\n", | |
| "\n", | |
| " this._resize_canvas = function(width, height) {\n", | |
| " // Keep the size of the canvas, canvas container, and rubber band\n", | |
| " // canvas in synch.\n", | |
| " canvas_div.css('width', width)\n", | |
| " canvas_div.css('height', height)\n", | |
| "\n", | |
| " canvas.attr('width', width);\n", | |
| " canvas.attr('height', height);\n", | |
| "\n", | |
| " rubberband.attr('width', width);\n", | |
| " rubberband.attr('height', height);\n", | |
| " }\n", | |
| "\n", | |
| " // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
| " // upon first draw.\n", | |
| " this._resize_canvas(600, 600);\n", | |
| "\n", | |
| " // Disable right mouse context menu.\n", | |
| " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
| " return false;\n", | |
| " });\n", | |
| "\n", | |
| " function set_focus () {\n", | |
| " canvas.focus();\n", | |
| " canvas_div.focus();\n", | |
| " }\n", | |
| "\n", | |
| " window.setTimeout(set_focus, 100);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_toolbar = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var nav_element = $('<div/>')\n", | |
| " nav_element.attr('style', 'width: 100%');\n", | |
| " this.root.append(nav_element);\n", | |
| "\n", | |
| " // Define a callback function for later on.\n", | |
| " function toolbar_event(event) {\n", | |
| " return fig.toolbar_button_onclick(event['data']);\n", | |
| " }\n", | |
| " function toolbar_mouse_event(event) {\n", | |
| " return fig.toolbar_button_onmouseover(event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " for(var toolbar_ind in mpl.toolbar_items) {\n", | |
| " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
| " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
| " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
| " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
| "\n", | |
| " if (!name) {\n", | |
| " // put a spacer in here.\n", | |
| " continue;\n", | |
| " }\n", | |
| " var button = $('<button/>');\n", | |
| " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
| " 'ui-button-icon-only');\n", | |
| " button.attr('role', 'button');\n", | |
| " button.attr('aria-disabled', 'false');\n", | |
| " button.click(method_name, toolbar_event);\n", | |
| " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
| "\n", | |
| " var icon_img = $('<span/>');\n", | |
| " icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
| " icon_img.addClass(image);\n", | |
| " icon_img.addClass('ui-corner-all');\n", | |
| "\n", | |
| " var tooltip_span = $('<span/>');\n", | |
| " tooltip_span.addClass('ui-button-text');\n", | |
| " tooltip_span.html(tooltip);\n", | |
| "\n", | |
| " button.append(icon_img);\n", | |
| " button.append(tooltip_span);\n", | |
| "\n", | |
| " nav_element.append(button);\n", | |
| " }\n", | |
| "\n", | |
| " var fmt_picker_span = $('<span/>');\n", | |
| "\n", | |
| " var fmt_picker = $('<select/>');\n", | |
| " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
| " fmt_picker_span.append(fmt_picker);\n", | |
| " nav_element.append(fmt_picker_span);\n", | |
| " this.format_dropdown = fmt_picker[0];\n", | |
| "\n", | |
| " for (var ind in mpl.extensions) {\n", | |
| " var fmt = mpl.extensions[ind];\n", | |
| " var option = $(\n", | |
| " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
| " fmt_picker.append(option)\n", | |
| " }\n", | |
| "\n", | |
| " // Add hover states to the ui-buttons\n", | |
| " $( \".ui-button\" ).hover(\n", | |
| " function() { $(this).addClass(\"ui-state-hover\");},\n", | |
| " function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
| " );\n", | |
| "\n", | |
| " var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
| " nav_element.append(status_bar);\n", | |
| " this.message = status_bar[0];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
| " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
| " // which will in turn request a refresh of the image.\n", | |
| " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.send_message = function(type, properties) {\n", | |
| " properties['type'] = type;\n", | |
| " properties['figure_id'] = this.id;\n", | |
| " this.ws.send(JSON.stringify(properties));\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.send_draw_message = function() {\n", | |
| " if (!this.waiting) {\n", | |
| " this.waiting = true;\n", | |
| " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
| " var format_dropdown = fig.format_dropdown;\n", | |
| " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
| " fig.ondownload(fig, format);\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
| " var size = msg['size'];\n", | |
| " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
| " fig._resize_canvas(size[0], size[1]);\n", | |
| " fig.send_message(\"refresh\", {});\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
| " var x0 = msg['x0'];\n", | |
| " var y0 = fig.canvas.height - msg['y0'];\n", | |
| " var x1 = msg['x1'];\n", | |
| " var y1 = fig.canvas.height - msg['y1'];\n", | |
| " x0 = Math.floor(x0) + 0.5;\n", | |
| " y0 = Math.floor(y0) + 0.5;\n", | |
| " x1 = Math.floor(x1) + 0.5;\n", | |
| " y1 = Math.floor(y1) + 0.5;\n", | |
| " var min_x = Math.min(x0, x1);\n", | |
| " var min_y = Math.min(y0, y1);\n", | |
| " var width = Math.abs(x1 - x0);\n", | |
| " var height = Math.abs(y1 - y0);\n", | |
| "\n", | |
| " fig.rubberband_context.clearRect(\n", | |
| " 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
| "\n", | |
| " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
| " // Updates the figure title.\n", | |
| " fig.header.textContent = msg['label'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
| " var cursor = msg['cursor'];\n", | |
| " switch(cursor)\n", | |
| " {\n", | |
| " case 0:\n", | |
| " cursor = 'pointer';\n", | |
| " break;\n", | |
| " case 1:\n", | |
| " cursor = 'default';\n", | |
| " break;\n", | |
| " case 2:\n", | |
| " cursor = 'crosshair';\n", | |
| " break;\n", | |
| " case 3:\n", | |
| " cursor = 'move';\n", | |
| " break;\n", | |
| " }\n", | |
| " fig.rubberband_canvas.style.cursor = cursor;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
| " fig.message.textContent = msg['message'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
| " // Request the server to send over a new figure.\n", | |
| " fig.send_draw_message();\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
| " fig.image_mode = msg['mode'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
| " // Called whenever the canvas gets updated.\n", | |
| " this.send_message(\"ack\", {});\n", | |
| "}\n", | |
| "\n", | |
| "// A function to construct a web socket function for onmessage handling.\n", | |
| "// Called in the figure constructor.\n", | |
| "mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
| " return function socket_on_message(evt) {\n", | |
| " if (evt.data instanceof Blob) {\n", | |
| " /* FIXME: We get \"Resource interpreted as Image but\n", | |
| " * transferred with MIME type text/plain:\" errors on\n", | |
| " * Chrome. But how to set the MIME type? It doesn't seem\n", | |
| " * to be part of the websocket stream */\n", | |
| " evt.data.type = \"image/png\";\n", | |
| "\n", | |
| " /* Free the memory for the previous frames */\n", | |
| " if (fig.imageObj.src) {\n", | |
| " (window.URL || window.webkitURL).revokeObjectURL(\n", | |
| " fig.imageObj.src);\n", | |
| " }\n", | |
| "\n", | |
| " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
| " evt.data);\n", | |
| " fig.updated_canvas_event();\n", | |
| " fig.waiting = false;\n", | |
| " return;\n", | |
| " }\n", | |
| " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", | |
| " fig.imageObj.src = evt.data;\n", | |
| " fig.updated_canvas_event();\n", | |
| " fig.waiting = false;\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " var msg = JSON.parse(evt.data);\n", | |
| " var msg_type = msg['type'];\n", | |
| "\n", | |
| " // Call the \"handle_{type}\" callback, which takes\n", | |
| " // the figure and JSON message as its only arguments.\n", | |
| " try {\n", | |
| " var callback = fig[\"handle_\" + msg_type];\n", | |
| " } catch (e) {\n", | |
| " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " if (callback) {\n", | |
| " try {\n", | |
| " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", | |
| " callback(fig, msg);\n", | |
| " } catch (e) {\n", | |
| " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", | |
| " }\n", | |
| " }\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", | |
| "mpl.findpos = function(e) {\n", | |
| " //this section is from http://www.quirksmode.org/js/events_properties.html\n", | |
| " var targ;\n", | |
| " if (!e)\n", | |
| " e = window.event;\n", | |
| " if (e.target)\n", | |
| " targ = e.target;\n", | |
| " else if (e.srcElement)\n", | |
| " targ = e.srcElement;\n", | |
| " if (targ.nodeType == 3) // defeat Safari bug\n", | |
| " targ = targ.parentNode;\n", | |
| "\n", | |
| " // jQuery normalizes the pageX and pageY\n", | |
| " // pageX,Y are the mouse positions relative to the document\n", | |
| " // offset() returns the position of the element relative to the document\n", | |
| " var x = e.pageX - $(targ).offset().left;\n", | |
| " var y = e.pageY - $(targ).offset().top;\n", | |
| "\n", | |
| " return {\"x\": x, \"y\": y};\n", | |
| "};\n", | |
| "\n", | |
| "/*\n", | |
| " * return a copy of an object with only non-object keys\n", | |
| " * we need this to avoid circular references\n", | |
| " * http://stackoverflow.com/a/24161582/3208463\n", | |
| " */\n", | |
| "function simpleKeys (original) {\n", | |
| " return Object.keys(original).reduce(function (obj, key) {\n", | |
| " if (typeof original[key] !== 'object')\n", | |
| " obj[key] = original[key]\n", | |
| " return obj;\n", | |
| " }, {});\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.mouse_event = function(event, name) {\n", | |
| " var canvas_pos = mpl.findpos(event)\n", | |
| "\n", | |
| " if (name === 'button_press')\n", | |
| " {\n", | |
| " this.canvas.focus();\n", | |
| " this.canvas_div.focus();\n", | |
| " }\n", | |
| "\n", | |
| " var x = canvas_pos.x;\n", | |
| " var y = canvas_pos.y;\n", | |
| "\n", | |
| " this.send_message(name, {x: x, y: y, button: event.button,\n", | |
| " step: event.step,\n", | |
| " guiEvent: simpleKeys(event)});\n", | |
| "\n", | |
| " /* This prevents the web browser from automatically changing to\n", | |
| " * the text insertion cursor when the button is pressed. We want\n", | |
| " * to control all of the cursor setting manually through the\n", | |
| " * 'cursor' event from matplotlib */\n", | |
| " event.preventDefault();\n", | |
| " return false;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
| " // Handle any extra behaviour associated with a key event\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.key_event = function(event, name) {\n", | |
| "\n", | |
| " // Prevent repeat events\n", | |
| " if (name == 'key_press')\n", | |
| " {\n", | |
| " if (event.which === this._key)\n", | |
| " return;\n", | |
| " else\n", | |
| " this._key = event.which;\n", | |
| " }\n", | |
| " if (name == 'key_release')\n", | |
| " this._key = null;\n", | |
| "\n", | |
| " var value = '';\n", | |
| " if (event.ctrlKey && event.which != 17)\n", | |
| " value += \"ctrl+\";\n", | |
| " if (event.altKey && event.which != 18)\n", | |
| " value += \"alt+\";\n", | |
| " if (event.shiftKey && event.which != 16)\n", | |
| " value += \"shift+\";\n", | |
| "\n", | |
| " value += 'k';\n", | |
| " value += event.which.toString();\n", | |
| "\n", | |
| " this._key_event_extra(event, name);\n", | |
| "\n", | |
| " this.send_message(name, {key: value,\n", | |
| " guiEvent: simpleKeys(event)});\n", | |
| " return false;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
| " if (name == 'download') {\n", | |
| " this.handle_save(this, null);\n", | |
| " } else {\n", | |
| " this.send_message(\"toolbar_button\", {name: name});\n", | |
| " }\n", | |
| "};\n", | |
| "\n", | |
| "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
| " this.message.textContent = tooltip;\n", | |
| "};\n", | |
| "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
| "\n", | |
| "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", | |
| "\n", | |
| "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
| " // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
| " // object with the appropriate methods. Currently this is a non binary\n", | |
| " // socket, so there is still some room for performance tuning.\n", | |
| " var ws = {};\n", | |
| "\n", | |
| " ws.close = function() {\n", | |
| " comm.close()\n", | |
| " };\n", | |
| " ws.send = function(m) {\n", | |
| " //console.log('sending', m);\n", | |
| " comm.send(m);\n", | |
| " };\n", | |
| " // Register the callback with on_msg.\n", | |
| " comm.on_msg(function(msg) {\n", | |
| " //console.log('receiving', msg['content']['data'], msg);\n", | |
| " // Pass the mpl event to the overriden (by mpl) onmessage function.\n", | |
| " ws.onmessage(msg['content']['data'])\n", | |
| " });\n", | |
| " return ws;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.mpl_figure_comm = function(comm, msg) {\n", | |
| " // This is the function which gets called when the mpl process\n", | |
| " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
| "\n", | |
| " var id = msg.content.data.id;\n", | |
| " // Get hold of the div created by the display call when the Comm\n", | |
| " // socket was opened in Python.\n", | |
| " var element = $(\"#\" + id);\n", | |
| " var ws_proxy = comm_websocket_adapter(comm)\n", | |
| "\n", | |
| " function ondownload(figure, format) {\n", | |
| " window.open(figure.imageObj.src);\n", | |
| " }\n", | |
| "\n", | |
| " var fig = new mpl.figure(id, ws_proxy,\n", | |
| " ondownload,\n", | |
| " element.get(0));\n", | |
| "\n", | |
| " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
| " // web socket which is closed, not our websocket->open comm proxy.\n", | |
| " ws_proxy.onopen();\n", | |
| "\n", | |
| " fig.parent_element = element.get(0);\n", | |
| " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
| " if (!fig.cell_info) {\n", | |
| " console.error(\"Failed to find cell for figure\", id, fig);\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " var output_index = fig.cell_info[2]\n", | |
| " var cell = fig.cell_info[0];\n", | |
| "\n", | |
| "};\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
| " fig.root.unbind('remove')\n", | |
| "\n", | |
| " // Update the output cell to use the data from the current canvas.\n", | |
| " fig.push_to_output();\n", | |
| " var dataURL = fig.canvas.toDataURL();\n", | |
| " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", | |
| " // the notebook keyboard shortcuts fail.\n", | |
| " IPython.keyboard_manager.enable()\n", | |
| " $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n", | |
| " fig.close_ws(fig, msg);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.close_ws = function(fig, msg){\n", | |
| " fig.send_message('closing', msg);\n", | |
| " // fig.ws.close()\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", | |
| " // Turn the data on the canvas into data in the output cell.\n", | |
| " var dataURL = this.canvas.toDataURL();\n", | |
| " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
| " // Tell IPython that the notebook contents must change.\n", | |
| " IPython.notebook.set_dirty(true);\n", | |
| " this.send_message(\"ack\", {});\n", | |
| " var fig = this;\n", | |
| " // Wait a second, then push the new image to the DOM so\n", | |
| " // that it is saved nicely (might be nice to debounce this).\n", | |
| " setTimeout(function () { fig.push_to_output() }, 1000);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_toolbar = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var nav_element = $('<div/>')\n", | |
| " nav_element.attr('style', 'width: 100%');\n", | |
| " this.root.append(nav_element);\n", | |
| "\n", | |
| " // Define a callback function for later on.\n", | |
| " function toolbar_event(event) {\n", | |
| " return fig.toolbar_button_onclick(event['data']);\n", | |
| " }\n", | |
| " function toolbar_mouse_event(event) {\n", | |
| " return fig.toolbar_button_onmouseover(event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " for(var toolbar_ind in mpl.toolbar_items){\n", | |
| " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
| " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
| " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
| " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
| "\n", | |
| " if (!name) { continue; };\n", | |
| "\n", | |
| " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", | |
| " button.click(method_name, toolbar_event);\n", | |
| " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
| " nav_element.append(button);\n", | |
| " }\n", | |
| "\n", | |
| " // Add the status bar.\n", | |
| " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", | |
| " nav_element.append(status_bar);\n", | |
| " this.message = status_bar[0];\n", | |
| "\n", | |
| " // Add the close button to the window.\n", | |
| " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", | |
| " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", | |
| " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", | |
| " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", | |
| " buttongrp.append(button);\n", | |
| " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", | |
| " titlebar.prepend(buttongrp);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._root_extra_style = function(el){\n", | |
| " var fig = this\n", | |
| " el.on(\"remove\", function(){\n", | |
| "\tfig.close_ws(fig, {});\n", | |
| " });\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
| " // this is important to make the div 'focusable\n", | |
| " el.attr('tabindex', 0)\n", | |
| " // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
| " // off when our div gets focus\n", | |
| "\n", | |
| " // location in version 3\n", | |
| " if (IPython.notebook.keyboard_manager) {\n", | |
| " IPython.notebook.keyboard_manager.register_events(el);\n", | |
| " }\n", | |
| " else {\n", | |
| " // location in version 2\n", | |
| " IPython.keyboard_manager.register_events(el);\n", | |
| " }\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
| " var manager = IPython.notebook.keyboard_manager;\n", | |
| " if (!manager)\n", | |
| " manager = IPython.keyboard_manager;\n", | |
| "\n", | |
| " // Check for shift+enter\n", | |
| " if (event.shiftKey && event.which == 13) {\n", | |
| " this.canvas_div.blur();\n", | |
| " event.shiftKey = false;\n", | |
| " // Send a \"J\" for go to next cell\n", | |
| " event.which = 74;\n", | |
| " event.keyCode = 74;\n", | |
| " manager.command_mode();\n", | |
| " manager.handle_keydown(event);\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
| " fig.ondownload(fig, null);\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.find_output_cell = function(html_output) {\n", | |
| " // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
| " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
| " // IPython event is triggered only after the cells have been serialised, which for\n", | |
| " // our purposes (turning an active figure into a static one), is too late.\n", | |
| " var cells = IPython.notebook.get_cells();\n", | |
| " var ncells = cells.length;\n", | |
| " for (var i=0; i<ncells; i++) {\n", | |
| " var cell = cells[i];\n", | |
| " if (cell.cell_type === 'code'){\n", | |
| " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
| " var data = cell.output_area.outputs[j];\n", | |
| " if (data.data) {\n", | |
| " // IPython >= 3 moved mimebundle to data attribute of output\n", | |
| " data = data.data;\n", | |
| " }\n", | |
| " if (data['text/html'] == html_output) {\n", | |
| " return [cell, data, j];\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "// Register the function which deals with the matplotlib target/channel.\n", | |
| "// The kernel may be null if the page has been refreshed.\n", | |
| "if (IPython.notebook.kernel != null) {\n", | |
| " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
| "}\n" | |
| ], | |
| "text/plain": [ | |
| "<IPython.core.display.Javascript object>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdd3hU1doF8FdKQhdQpFrAAlJVrgXxYkHUiwUU60XFjyviNSAGQQWvQholhNA7iKB0BASB0EOTXqRDqGkkECCVtJmzvj8OxJA6yTln9mSyfs8zj8zMmb2XJGRWTtkjQkRERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERCXAERFJzHZLERFNRDrdeL6liGwWkWQRiRSRQXmM4SMiUSKSJCKhItLM0sREREREZKreInJJRDxEpIqIRIuI/437zUUkQkT6ZNu+v4hcEJGmIuIpIkNEL4qVnBeZiIiIiIw4JnqJExHpJiIxIlIm2/NfikhYtvtnRaRXtvtlRSRWRLpamJGIiIiITPKCiGSKyD037geLyOoc27QREbvoeweriX64+Mkc26wRkSDrYhIRERGRWRaJyIps96eLyLwc2zQRvQDWE5EGohfAxjm2mS8iU/OZ4zYRqS96eeSNN95444033krOrb7o7+PkRuqKSIaIvJLtsWAxfw9gfREBb7zxxhtvvPFWIm/1hdzKYBE5neOxjyX3OYB9pPBzAC9J/ucAVhMRREREICEhgTfFNy8vL+UZeOPXwhVv/Hq4zo1fC9e4RURE3CyA1YpfNcjVlBX9yt1+OR6vIvryLn4iUkFEWohIuNx6FXA/ETkv+tIvFUVkqOhXCud3FXA1EUFCQgJIPW9vb9UR6AZ+LVwLvx6ug18L15CQkMAC6IbeEpHrIlIzj+eai8gW0dcHjBaRH/LYZrCIXBR9rcBQKXgdQBZAF8IfrK6DXwvXwq+H6+DXwjWwAJJRLIAuJCQkRHUEuoFfC9fCr4fr4NfCNbAAklEsgERERCUMCyAZxQJIRERUwrAAklEsgEREZKrU1FTlV8m6wy01NTXfv2MWQDKKBZCIiEyT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\">" | |
| ], | |
| "text/plain": [ | |
| "<IPython.core.display.HTML object>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "sys.initial_conditions[theta] = np.deg2rad(90)\n", | |
| "sys.initial_conditions[phi] = np.deg2rad(0.5)\n", | |
| "x = sys.integrate()\n", | |
| "plot()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "First note that the plate behaves wildly. What happens when the initial plate angle is altered slightly." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 34, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "application/javascript": [ | |
| "/* Put everything inside the global mpl namespace */\n", | |
| "window.mpl = {};\n", | |
| "\n", | |
| "mpl.get_websocket_type = function() {\n", | |
| " if (typeof(WebSocket) !== 'undefined') {\n", | |
| " return WebSocket;\n", | |
| " } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
| " return MozWebSocket;\n", | |
| " } else {\n", | |
| " alert('Your browser does not have WebSocket support.' +\n", | |
| " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
| " 'Firefox 4 and 5 are also supported but you ' +\n", | |
| " 'have to enable WebSockets in about:config.');\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
| " this.id = figure_id;\n", | |
| "\n", | |
| " this.ws = websocket;\n", | |
| "\n", | |
| " this.supports_binary = (this.ws.binaryType != undefined);\n", | |
| "\n", | |
| " if (!this.supports_binary) {\n", | |
| " var warnings = document.getElementById(\"mpl-warnings\");\n", | |
| " if (warnings) {\n", | |
| " warnings.style.display = 'block';\n", | |
| " warnings.textContent = (\n", | |
| " \"This browser does not support binary websocket messages. \" +\n", | |
| " \"Performance may be slow.\");\n", | |
| " }\n", | |
| " }\n", | |
| "\n", | |
| " this.imageObj = new Image();\n", | |
| "\n", | |
| " this.context = undefined;\n", | |
| " this.message = undefined;\n", | |
| " this.canvas = undefined;\n", | |
| " this.rubberband_canvas = undefined;\n", | |
| " this.rubberband_context = undefined;\n", | |
| " this.format_dropdown = undefined;\n", | |
| "\n", | |
| " this.image_mode = 'full';\n", | |
| "\n", | |
| " this.root = $('<div/>');\n", | |
| " this._root_extra_style(this.root)\n", | |
| " this.root.attr('style', 'display: inline-block');\n", | |
| "\n", | |
| " $(parent_element).append(this.root);\n", | |
| "\n", | |
| " this._init_header(this);\n", | |
| " this._init_canvas(this);\n", | |
| " this._init_toolbar(this);\n", | |
| "\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " this.waiting = false;\n", | |
| "\n", | |
| " this.ws.onopen = function () {\n", | |
| " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
| " fig.send_message(\"send_image_mode\", {});\n", | |
| " fig.send_message(\"refresh\", {});\n", | |
| " }\n", | |
| "\n", | |
| " this.imageObj.onload = function() {\n", | |
| " if (fig.image_mode == 'full') {\n", | |
| " // Full images could contain transparency (where diff images\n", | |
| " // almost always do), so we need to clear the canvas so that\n", | |
| " // there is no ghosting.\n", | |
| " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
| " }\n", | |
| " fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
| " };\n", | |
| "\n", | |
| " this.imageObj.onunload = function() {\n", | |
| " this.ws.close();\n", | |
| " }\n", | |
| "\n", | |
| " this.ws.onmessage = this._make_on_message_function(this);\n", | |
| "\n", | |
| " this.ondownload = ondownload;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_header = function() {\n", | |
| " var titlebar = $(\n", | |
| " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", | |
| " 'ui-helper-clearfix\"/>');\n", | |
| " var titletext = $(\n", | |
| " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", | |
| " 'text-align: center; padding: 3px;\"/>');\n", | |
| " titlebar.append(titletext)\n", | |
| " this.root.append(titlebar);\n", | |
| " this.header = titletext[0];\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_canvas = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var canvas_div = $('<div/>');\n", | |
| "\n", | |
| " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
| "\n", | |
| " function canvas_keyboard_event(event) {\n", | |
| " return fig.key_event(event, event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
| " canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
| " this.canvas_div = canvas_div\n", | |
| " this._canvas_extra_style(canvas_div)\n", | |
| " this.root.append(canvas_div);\n", | |
| "\n", | |
| " var canvas = $('<canvas/>');\n", | |
| " canvas.addClass('mpl-canvas');\n", | |
| " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
| "\n", | |
| " this.canvas = canvas[0];\n", | |
| " this.context = canvas[0].getContext(\"2d\");\n", | |
| "\n", | |
| " var rubberband = $('<canvas/>');\n", | |
| " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
| "\n", | |
| " var pass_mouse_events = true;\n", | |
| "\n", | |
| " canvas_div.resizable({\n", | |
| " start: function(event, ui) {\n", | |
| " pass_mouse_events = false;\n", | |
| " },\n", | |
| " resize: function(event, ui) {\n", | |
| " fig.request_resize(ui.size.width, ui.size.height);\n", | |
| " },\n", | |
| " stop: function(event, ui) {\n", | |
| " pass_mouse_events = true;\n", | |
| " fig.request_resize(ui.size.width, ui.size.height);\n", | |
| " },\n", | |
| " });\n", | |
| "\n", | |
| " function mouse_event_fn(event) {\n", | |
| " if (pass_mouse_events)\n", | |
| " return fig.mouse_event(event, event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " rubberband.mousedown('button_press', mouse_event_fn);\n", | |
| " rubberband.mouseup('button_release', mouse_event_fn);\n", | |
| " // Throttle sequential mouse events to 1 every 20ms.\n", | |
| " rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
| "\n", | |
| " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
| " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
| "\n", | |
| " canvas_div.on(\"wheel\", function (event) {\n", | |
| " event = event.originalEvent;\n", | |
| " event['data'] = 'scroll'\n", | |
| " if (event.deltaY < 0) {\n", | |
| " event.step = 1;\n", | |
| " } else {\n", | |
| " event.step = -1;\n", | |
| " }\n", | |
| " mouse_event_fn(event);\n", | |
| " });\n", | |
| "\n", | |
| " canvas_div.append(canvas);\n", | |
| " canvas_div.append(rubberband);\n", | |
| "\n", | |
| " this.rubberband = rubberband;\n", | |
| " this.rubberband_canvas = rubberband[0];\n", | |
| " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
| " this.rubberband_context.strokeStyle = \"#000000\";\n", | |
| "\n", | |
| " this._resize_canvas = function(width, height) {\n", | |
| " // Keep the size of the canvas, canvas container, and rubber band\n", | |
| " // canvas in synch.\n", | |
| " canvas_div.css('width', width)\n", | |
| " canvas_div.css('height', height)\n", | |
| "\n", | |
| " canvas.attr('width', width);\n", | |
| " canvas.attr('height', height);\n", | |
| "\n", | |
| " rubberband.attr('width', width);\n", | |
| " rubberband.attr('height', height);\n", | |
| " }\n", | |
| "\n", | |
| " // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
| " // upon first draw.\n", | |
| " this._resize_canvas(600, 600);\n", | |
| "\n", | |
| " // Disable right mouse context menu.\n", | |
| " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
| " return false;\n", | |
| " });\n", | |
| "\n", | |
| " function set_focus () {\n", | |
| " canvas.focus();\n", | |
| " canvas_div.focus();\n", | |
| " }\n", | |
| "\n", | |
| " window.setTimeout(set_focus, 100);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_toolbar = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var nav_element = $('<div/>')\n", | |
| " nav_element.attr('style', 'width: 100%');\n", | |
| " this.root.append(nav_element);\n", | |
| "\n", | |
| " // Define a callback function for later on.\n", | |
| " function toolbar_event(event) {\n", | |
| " return fig.toolbar_button_onclick(event['data']);\n", | |
| " }\n", | |
| " function toolbar_mouse_event(event) {\n", | |
| " return fig.toolbar_button_onmouseover(event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " for(var toolbar_ind in mpl.toolbar_items) {\n", | |
| " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
| " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
| " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
| " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
| "\n", | |
| " if (!name) {\n", | |
| " // put a spacer in here.\n", | |
| " continue;\n", | |
| " }\n", | |
| " var button = $('<button/>');\n", | |
| " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
| " 'ui-button-icon-only');\n", | |
| " button.attr('role', 'button');\n", | |
| " button.attr('aria-disabled', 'false');\n", | |
| " button.click(method_name, toolbar_event);\n", | |
| " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
| "\n", | |
| " var icon_img = $('<span/>');\n", | |
| " icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
| " icon_img.addClass(image);\n", | |
| " icon_img.addClass('ui-corner-all');\n", | |
| "\n", | |
| " var tooltip_span = $('<span/>');\n", | |
| " tooltip_span.addClass('ui-button-text');\n", | |
| " tooltip_span.html(tooltip);\n", | |
| "\n", | |
| " button.append(icon_img);\n", | |
| " button.append(tooltip_span);\n", | |
| "\n", | |
| " nav_element.append(button);\n", | |
| " }\n", | |
| "\n", | |
| " var fmt_picker_span = $('<span/>');\n", | |
| "\n", | |
| " var fmt_picker = $('<select/>');\n", | |
| " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
| " fmt_picker_span.append(fmt_picker);\n", | |
| " nav_element.append(fmt_picker_span);\n", | |
| " this.format_dropdown = fmt_picker[0];\n", | |
| "\n", | |
| " for (var ind in mpl.extensions) {\n", | |
| " var fmt = mpl.extensions[ind];\n", | |
| " var option = $(\n", | |
| " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
| " fmt_picker.append(option)\n", | |
| " }\n", | |
| "\n", | |
| " // Add hover states to the ui-buttons\n", | |
| " $( \".ui-button\" ).hover(\n", | |
| " function() { $(this).addClass(\"ui-state-hover\");},\n", | |
| " function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
| " );\n", | |
| "\n", | |
| " var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
| " nav_element.append(status_bar);\n", | |
| " this.message = status_bar[0];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
| " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
| " // which will in turn request a refresh of the image.\n", | |
| " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.send_message = function(type, properties) {\n", | |
| " properties['type'] = type;\n", | |
| " properties['figure_id'] = this.id;\n", | |
| " this.ws.send(JSON.stringify(properties));\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.send_draw_message = function() {\n", | |
| " if (!this.waiting) {\n", | |
| " this.waiting = true;\n", | |
| " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
| " var format_dropdown = fig.format_dropdown;\n", | |
| " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
| " fig.ondownload(fig, format);\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
| " var size = msg['size'];\n", | |
| " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
| " fig._resize_canvas(size[0], size[1]);\n", | |
| " fig.send_message(\"refresh\", {});\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
| " var x0 = msg['x0'];\n", | |
| " var y0 = fig.canvas.height - msg['y0'];\n", | |
| " var x1 = msg['x1'];\n", | |
| " var y1 = fig.canvas.height - msg['y1'];\n", | |
| " x0 = Math.floor(x0) + 0.5;\n", | |
| " y0 = Math.floor(y0) + 0.5;\n", | |
| " x1 = Math.floor(x1) + 0.5;\n", | |
| " y1 = Math.floor(y1) + 0.5;\n", | |
| " var min_x = Math.min(x0, x1);\n", | |
| " var min_y = Math.min(y0, y1);\n", | |
| " var width = Math.abs(x1 - x0);\n", | |
| " var height = Math.abs(y1 - y0);\n", | |
| "\n", | |
| " fig.rubberband_context.clearRect(\n", | |
| " 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
| "\n", | |
| " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
| " // Updates the figure title.\n", | |
| " fig.header.textContent = msg['label'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
| " var cursor = msg['cursor'];\n", | |
| " switch(cursor)\n", | |
| " {\n", | |
| " case 0:\n", | |
| " cursor = 'pointer';\n", | |
| " break;\n", | |
| " case 1:\n", | |
| " cursor = 'default';\n", | |
| " break;\n", | |
| " case 2:\n", | |
| " cursor = 'crosshair';\n", | |
| " break;\n", | |
| " case 3:\n", | |
| " cursor = 'move';\n", | |
| " break;\n", | |
| " }\n", | |
| " fig.rubberband_canvas.style.cursor = cursor;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
| " fig.message.textContent = msg['message'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
| " // Request the server to send over a new figure.\n", | |
| " fig.send_draw_message();\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
| " fig.image_mode = msg['mode'];\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
| " // Called whenever the canvas gets updated.\n", | |
| " this.send_message(\"ack\", {});\n", | |
| "}\n", | |
| "\n", | |
| "// A function to construct a web socket function for onmessage handling.\n", | |
| "// Called in the figure constructor.\n", | |
| "mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
| " return function socket_on_message(evt) {\n", | |
| " if (evt.data instanceof Blob) {\n", | |
| " /* FIXME: We get \"Resource interpreted as Image but\n", | |
| " * transferred with MIME type text/plain:\" errors on\n", | |
| " * Chrome. But how to set the MIME type? It doesn't seem\n", | |
| " * to be part of the websocket stream */\n", | |
| " evt.data.type = \"image/png\";\n", | |
| "\n", | |
| " /* Free the memory for the previous frames */\n", | |
| " if (fig.imageObj.src) {\n", | |
| " (window.URL || window.webkitURL).revokeObjectURL(\n", | |
| " fig.imageObj.src);\n", | |
| " }\n", | |
| "\n", | |
| " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
| " evt.data);\n", | |
| " fig.updated_canvas_event();\n", | |
| " fig.waiting = false;\n", | |
| " return;\n", | |
| " }\n", | |
| " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", | |
| " fig.imageObj.src = evt.data;\n", | |
| " fig.updated_canvas_event();\n", | |
| " fig.waiting = false;\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " var msg = JSON.parse(evt.data);\n", | |
| " var msg_type = msg['type'];\n", | |
| "\n", | |
| " // Call the \"handle_{type}\" callback, which takes\n", | |
| " // the figure and JSON message as its only arguments.\n", | |
| " try {\n", | |
| " var callback = fig[\"handle_\" + msg_type];\n", | |
| " } catch (e) {\n", | |
| " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " if (callback) {\n", | |
| " try {\n", | |
| " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", | |
| " callback(fig, msg);\n", | |
| " } catch (e) {\n", | |
| " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", | |
| " }\n", | |
| " }\n", | |
| " };\n", | |
| "}\n", | |
| "\n", | |
| "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", | |
| "mpl.findpos = function(e) {\n", | |
| " //this section is from http://www.quirksmode.org/js/events_properties.html\n", | |
| " var targ;\n", | |
| " if (!e)\n", | |
| " e = window.event;\n", | |
| " if (e.target)\n", | |
| " targ = e.target;\n", | |
| " else if (e.srcElement)\n", | |
| " targ = e.srcElement;\n", | |
| " if (targ.nodeType == 3) // defeat Safari bug\n", | |
| " targ = targ.parentNode;\n", | |
| "\n", | |
| " // jQuery normalizes the pageX and pageY\n", | |
| " // pageX,Y are the mouse positions relative to the document\n", | |
| " // offset() returns the position of the element relative to the document\n", | |
| " var x = e.pageX - $(targ).offset().left;\n", | |
| " var y = e.pageY - $(targ).offset().top;\n", | |
| "\n", | |
| " return {\"x\": x, \"y\": y};\n", | |
| "};\n", | |
| "\n", | |
| "/*\n", | |
| " * return a copy of an object with only non-object keys\n", | |
| " * we need this to avoid circular references\n", | |
| " * http://stackoverflow.com/a/24161582/3208463\n", | |
| " */\n", | |
| "function simpleKeys (original) {\n", | |
| " return Object.keys(original).reduce(function (obj, key) {\n", | |
| " if (typeof original[key] !== 'object')\n", | |
| " obj[key] = original[key]\n", | |
| " return obj;\n", | |
| " }, {});\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.mouse_event = function(event, name) {\n", | |
| " var canvas_pos = mpl.findpos(event)\n", | |
| "\n", | |
| " if (name === 'button_press')\n", | |
| " {\n", | |
| " this.canvas.focus();\n", | |
| " this.canvas_div.focus();\n", | |
| " }\n", | |
| "\n", | |
| " var x = canvas_pos.x;\n", | |
| " var y = canvas_pos.y;\n", | |
| "\n", | |
| " this.send_message(name, {x: x, y: y, button: event.button,\n", | |
| " step: event.step,\n", | |
| " guiEvent: simpleKeys(event)});\n", | |
| "\n", | |
| " /* This prevents the web browser from automatically changing to\n", | |
| " * the text insertion cursor when the button is pressed. We want\n", | |
| " * to control all of the cursor setting manually through the\n", | |
| " * 'cursor' event from matplotlib */\n", | |
| " event.preventDefault();\n", | |
| " return false;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
| " // Handle any extra behaviour associated with a key event\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.key_event = function(event, name) {\n", | |
| "\n", | |
| " // Prevent repeat events\n", | |
| " if (name == 'key_press')\n", | |
| " {\n", | |
| " if (event.which === this._key)\n", | |
| " return;\n", | |
| " else\n", | |
| " this._key = event.which;\n", | |
| " }\n", | |
| " if (name == 'key_release')\n", | |
| " this._key = null;\n", | |
| "\n", | |
| " var value = '';\n", | |
| " if (event.ctrlKey && event.which != 17)\n", | |
| " value += \"ctrl+\";\n", | |
| " if (event.altKey && event.which != 18)\n", | |
| " value += \"alt+\";\n", | |
| " if (event.shiftKey && event.which != 16)\n", | |
| " value += \"shift+\";\n", | |
| "\n", | |
| " value += 'k';\n", | |
| " value += event.which.toString();\n", | |
| "\n", | |
| " this._key_event_extra(event, name);\n", | |
| "\n", | |
| " this.send_message(name, {key: value,\n", | |
| " guiEvent: simpleKeys(event)});\n", | |
| " return false;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
| " if (name == 'download') {\n", | |
| " this.handle_save(this, null);\n", | |
| " } else {\n", | |
| " this.send_message(\"toolbar_button\", {name: name});\n", | |
| " }\n", | |
| "};\n", | |
| "\n", | |
| "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
| " this.message.textContent = tooltip;\n", | |
| "};\n", | |
| "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
| "\n", | |
| "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", | |
| "\n", | |
| "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
| " // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
| " // object with the appropriate methods. Currently this is a non binary\n", | |
| " // socket, so there is still some room for performance tuning.\n", | |
| " var ws = {};\n", | |
| "\n", | |
| " ws.close = function() {\n", | |
| " comm.close()\n", | |
| " };\n", | |
| " ws.send = function(m) {\n", | |
| " //console.log('sending', m);\n", | |
| " comm.send(m);\n", | |
| " };\n", | |
| " // Register the callback with on_msg.\n", | |
| " comm.on_msg(function(msg) {\n", | |
| " //console.log('receiving', msg['content']['data'], msg);\n", | |
| " // Pass the mpl event to the overriden (by mpl) onmessage function.\n", | |
| " ws.onmessage(msg['content']['data'])\n", | |
| " });\n", | |
| " return ws;\n", | |
| "}\n", | |
| "\n", | |
| "mpl.mpl_figure_comm = function(comm, msg) {\n", | |
| " // This is the function which gets called when the mpl process\n", | |
| " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
| "\n", | |
| " var id = msg.content.data.id;\n", | |
| " // Get hold of the div created by the display call when the Comm\n", | |
| " // socket was opened in Python.\n", | |
| " var element = $(\"#\" + id);\n", | |
| " var ws_proxy = comm_websocket_adapter(comm)\n", | |
| "\n", | |
| " function ondownload(figure, format) {\n", | |
| " window.open(figure.imageObj.src);\n", | |
| " }\n", | |
| "\n", | |
| " var fig = new mpl.figure(id, ws_proxy,\n", | |
| " ondownload,\n", | |
| " element.get(0));\n", | |
| "\n", | |
| " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
| " // web socket which is closed, not our websocket->open comm proxy.\n", | |
| " ws_proxy.onopen();\n", | |
| "\n", | |
| " fig.parent_element = element.get(0);\n", | |
| " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
| " if (!fig.cell_info) {\n", | |
| " console.error(\"Failed to find cell for figure\", id, fig);\n", | |
| " return;\n", | |
| " }\n", | |
| "\n", | |
| " var output_index = fig.cell_info[2]\n", | |
| " var cell = fig.cell_info[0];\n", | |
| "\n", | |
| "};\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
| " fig.root.unbind('remove')\n", | |
| "\n", | |
| " // Update the output cell to use the data from the current canvas.\n", | |
| " fig.push_to_output();\n", | |
| " var dataURL = fig.canvas.toDataURL();\n", | |
| " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", | |
| " // the notebook keyboard shortcuts fail.\n", | |
| " IPython.keyboard_manager.enable()\n", | |
| " $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n", | |
| " fig.close_ws(fig, msg);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.close_ws = function(fig, msg){\n", | |
| " fig.send_message('closing', msg);\n", | |
| " // fig.ws.close()\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", | |
| " // Turn the data on the canvas into data in the output cell.\n", | |
| " var dataURL = this.canvas.toDataURL();\n", | |
| " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.updated_canvas_event = function() {\n", | |
| " // Tell IPython that the notebook contents must change.\n", | |
| " IPython.notebook.set_dirty(true);\n", | |
| " this.send_message(\"ack\", {});\n", | |
| " var fig = this;\n", | |
| " // Wait a second, then push the new image to the DOM so\n", | |
| " // that it is saved nicely (might be nice to debounce this).\n", | |
| " setTimeout(function () { fig.push_to_output() }, 1000);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._init_toolbar = function() {\n", | |
| " var fig = this;\n", | |
| "\n", | |
| " var nav_element = $('<div/>')\n", | |
| " nav_element.attr('style', 'width: 100%');\n", | |
| " this.root.append(nav_element);\n", | |
| "\n", | |
| " // Define a callback function for later on.\n", | |
| " function toolbar_event(event) {\n", | |
| " return fig.toolbar_button_onclick(event['data']);\n", | |
| " }\n", | |
| " function toolbar_mouse_event(event) {\n", | |
| " return fig.toolbar_button_onmouseover(event['data']);\n", | |
| " }\n", | |
| "\n", | |
| " for(var toolbar_ind in mpl.toolbar_items){\n", | |
| " var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
| " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
| " var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
| " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
| "\n", | |
| " if (!name) { continue; };\n", | |
| "\n", | |
| " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", | |
| " button.click(method_name, toolbar_event);\n", | |
| " button.mouseover(tooltip, toolbar_mouse_event);\n", | |
| " nav_element.append(button);\n", | |
| " }\n", | |
| "\n", | |
| " // Add the status bar.\n", | |
| " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", | |
| " nav_element.append(status_bar);\n", | |
| " this.message = status_bar[0];\n", | |
| "\n", | |
| " // Add the close button to the window.\n", | |
| " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", | |
| " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", | |
| " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", | |
| " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", | |
| " buttongrp.append(button);\n", | |
| " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", | |
| " titlebar.prepend(buttongrp);\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._root_extra_style = function(el){\n", | |
| " var fig = this\n", | |
| " el.on(\"remove\", function(){\n", | |
| "\tfig.close_ws(fig, {});\n", | |
| " });\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
| " // this is important to make the div 'focusable\n", | |
| " el.attr('tabindex', 0)\n", | |
| " // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
| " // off when our div gets focus\n", | |
| "\n", | |
| " // location in version 3\n", | |
| " if (IPython.notebook.keyboard_manager) {\n", | |
| " IPython.notebook.keyboard_manager.register_events(el);\n", | |
| " }\n", | |
| " else {\n", | |
| " // location in version 2\n", | |
| " IPython.keyboard_manager.register_events(el);\n", | |
| " }\n", | |
| "\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
| " var manager = IPython.notebook.keyboard_manager;\n", | |
| " if (!manager)\n", | |
| " manager = IPython.keyboard_manager;\n", | |
| "\n", | |
| " // Check for shift+enter\n", | |
| " if (event.shiftKey && event.which == 13) {\n", | |
| " this.canvas_div.blur();\n", | |
| " event.shiftKey = false;\n", | |
| " // Send a \"J\" for go to next cell\n", | |
| " event.which = 74;\n", | |
| " event.keyCode = 74;\n", | |
| " manager.command_mode();\n", | |
| " manager.handle_keydown(event);\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
| " fig.ondownload(fig, null);\n", | |
| "}\n", | |
| "\n", | |
| "\n", | |
| "mpl.find_output_cell = function(html_output) {\n", | |
| " // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
| " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
| " // IPython event is triggered only after the cells have been serialised, which for\n", | |
| " // our purposes (turning an active figure into a static one), is too late.\n", | |
| " var cells = IPython.notebook.get_cells();\n", | |
| " var ncells = cells.length;\n", | |
| " for (var i=0; i<ncells; i++) {\n", | |
| " var cell = cells[i];\n", | |
| " if (cell.cell_type === 'code'){\n", | |
| " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
| " var data = cell.output_area.outputs[j];\n", | |
| " if (data.data) {\n", | |
| " // IPython >= 3 moved mimebundle to data attribute of output\n", | |
| " data = data.data;\n", | |
| " }\n", | |
| " if (data['text/html'] == html_output) {\n", | |
| " return [cell, data, j];\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| "}\n", | |
| "\n", | |
| "// Register the function which deals with the matplotlib target/channel.\n", | |
| "// The kernel may be null if the page has been refreshed.\n", | |
| "if (IPython.notebook.kernel != null) {\n", | |
| " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
| "}\n" | |
| ], | |
| "text/plain": [ | |
| "<IPython.core.display.Javascript object>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<img src=\"data:image/png;base64,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A8Do8CF0lq645L+BR3oZP9MIwAEAQ/y+1hPAkTIeexTA/5V8vA9A34Dv9wOwp5yx1QYgWVlZkpuby8Plo3///q6PgQdfCy8efD28c/C18MaRlZXFADAKxEDz9co7agU8/ucAMgEkBXy9ohnAB0s+DncG8DroLxAPHjx48ODBI/qO60CXhaYAsgG8Usb3GkNnEf1zAJuVfM0/B3BuwM9VlANYBfrLU5sHDx48ePDgEVXHddD3cYpyd0FLwAyo4DGLACwF8EMA9aG7gD/x+34cdJawE4BqALpCy8GUtwuYiIiIiFyUDqAIWvrlTMmRB+Blv8fUBfARtA7gKQBToXcB/rpC6wCeA7ADWhKGiIiIiIiIiIiIKqMhAA5DZxv/CeBmV0dTOSUB2AogF/pazMClnE5y1yfQnfr3uj2QSqwlgJXQ1ZBT0G5J5LwG0GvTUWgXqq8B3O3aAT3eAAADWklEQVTqiCqP7gC+hL5HFAOoGvD9pgBWAcgHcAjAG46OjqLSCwC+A9AEQA0Aw6G/PDFuDqoSSgRwOzRnsza01d8mV0dEAPAoNN+2GAwA3dISGvQ9Ar1GVQXwG1dHVHnNgwYZsdBNB89Bg/K6bg6qkmgLDQIfQ+kA8GroxtE3AVwB3SSaBe0kRlSuTABP+33+AwDHoBdbco9vZ3dgj2dyzvUADpb8lzOA7vkSwGi3B0EAgM0A/ur3eU3o3wYDcufcg9IBYG/orKz/1wYA2OvguCjK1Ib+8cYFfH0ZgDHOD4f8vAgNzsk9ywD8qeRjBoDuuAq6KW4kgHUA/g1gA7S/OTmvB3Sj4o8BVIfWm90DnZklZ5QVAI4D8FnA41qWPO5qh8ZFUcY3s3FjwNdnAZjg/HCoxH3QfMy2bg+kEvsLNAD0YQDojuug/++PQMtYVQXwEIAClL5xJfs1BrAE+poUQmedWro6osqnrABwIoCZAY+7qeRxDR0aF0UZzgB6TwdovlNHtwdSif0PNJ+mkd/XGAC6w3eNGh7w9aUo3SWJ7FUFwH4Ak6CpKVWh16nT0A0I5AzOAJJlysoBzAFzAN3wCDT4u8/tgVRyvaGtFXMAHC85DOhr876L46qs9oIBoBfEQv8OmgV8/VvoZkJyRlkB4KMonQP4DJgDSEE8D010vxmab5ME3T3EXcDOehpaVqGV2wMhXAldNvE/DAAPg7sd3TAAOiPbDDoL1RFa4P7Xbg6qkvoXND2oFvS16ADgPIA2bg6qkqgKzbW8HxoAxpR8XgU6y3cYwDDo9etWAN+Du4ApBAnQHJt8sA6gWwxoXlMeLnWByQMDQq9gGRh3vQR9Q8sFkAENPMh5P4PWxTwGXfrdhksbpchevaHvE8Ulh+9jXx3GW6A75s9Cb5hed2GMREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREVCn9P7T8g2qzc+mpAAAAAElFTkSuQmCC\">" | |
| ], | |
| "text/plain": [ | |
| "<IPython.core.display.HTML object>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "sys.initial_conditions[phi] = np.deg2rad(1.0)\n", | |
| "x = sys.integrate()\n", | |
| "plot()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The behavior does not look similar to the previous simulation. This is an example of chaotic behavior. The plate angle can not be reliably predicted because slight changes in the initial conditions cause the behavior of the system to vary widely." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Visualization\n", | |
| "\n", | |
| "Finally, the system can be animated by attached a cylinder and a plane shape to the rigid bodies. To properly align the coordinate axes of the shapes with the bodies, simple rotations are used." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 35, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "rod_shape = Cylinder(2 * lA, 0.005, color='red')\n", | |
| "plate_shape = Plane(h, w, color='blue')\n", | |
| "\n", | |
| "v1 = VisualizationFrame('rod',\n", | |
| " A.orientnew('rod', 'Axis', (sym.pi / 2, A.x)),\n", | |
| " Ao,\n", | |
| " rod_shape)\n", | |
| "\n", | |
| "v2 = VisualizationFrame('plate',\n", | |
| " B.orientnew('plate', 'Body', (sym.pi / 2, sym.pi / 2, 0), 'XZX'),\n", | |
| " Bo,\n", | |
| " plate_shape)\n", | |
| "\n", | |
| "scene = Scene(N, No, v1, v2, system=sys)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The following method opens up a simple gui that shows a 3D animatoin of the system." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 36, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "scene.display_ipython()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 37, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "application/json": { | |
| "Software versions": [ | |
| { | |
| "module": "Python", | |
| "version": "3.5.1 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]" | |
| }, | |
| { | |
| "module": "IPython", | |
| "version": "4.1.2" | |
| }, | |
| { | |
| "module": "OS", | |
| "version": "Linux 4.2.0 30 generic x86_64 with debian jessie sid" | |
| }, | |
| { | |
| "module": "numpy", | |
| "version": "1.10.4" | |
| }, | |
| { | |
| "module": "sympy", | |
| "version": "0.7.6.1" | |
| }, | |
| { | |
| "module": "scipy", | |
| "version": "0.17.0" | |
| }, | |
| { | |
| "module": "matplotlib", | |
| "version": "1.5.1" | |
| }, | |
| { | |
| "module": "pydy", | |
| "version": "0.3.1" | |
| } | |
| ] | |
| }, | |
| "text/html": [ | |
| "<table><tr><th>Software</th><th>Version</th></tr><tr><td>Python</td><td>3.5.1 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]</td></tr><tr><td>IPython</td><td>4.1.2</td></tr><tr><td>OS</td><td>Linux 4.2.0 30 generic x86_64 with debian jessie sid</td></tr><tr><td>numpy</td><td>1.10.4</td></tr><tr><td>sympy</td><td>0.7.6.1</td></tr><tr><td>scipy</td><td>0.17.0</td></tr><tr><td>matplotlib</td><td>1.5.1</td></tr><tr><td>pydy</td><td>0.3.1</td></tr><tr><td colspan='2'>Sat Mar 05 18:34:33 2016 PST</td></tr></table>" | |
| ], | |
| "text/latex": [ | |
| "\\begin{tabular}{|l|l|}\\hline\n", | |
| "{\\bf Software} & {\\bf Version} \\\\ \\hline\\hline\n", | |
| "Python & 3.5.1 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] \\\\ \\hline\n", | |
| "IPython & 4.1.2 \\\\ \\hline\n", | |
| "OS & Linux 4.2.0 30 generic x86\\_64 with debian jessie sid \\\\ \\hline\n", | |
| "numpy & 1.10.4 \\\\ \\hline\n", | |
| "sympy & 0.7.6.1 \\\\ \\hline\n", | |
| "scipy & 0.17.0 \\\\ \\hline\n", | |
| "matplotlib & 1.5.1 \\\\ \\hline\n", | |
| "pydy & 0.3.1 \\\\ \\hline\n", | |
| "\\hline \\multicolumn{2}{|l|}{Sat Mar 05 18:34:33 2016 PST} \\\\ \\hline\n", | |
| "\\end{tabular}\n" | |
| ], | |
| "text/plain": [ | |
| "Software versions\n", | |
| "Python 3.5.1 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]\n", | |
| "IPython 4.1.2\n", | |
| "OS Linux 4.2.0 30 generic x86_64 with debian jessie sid\n", | |
| "numpy 1.10.4\n", | |
| "sympy 0.7.6.1\n", | |
| "scipy 0.17.0\n", | |
| "matplotlib 1.5.1\n", | |
| "pydy 0.3.1\n", | |
| "Sat Mar 05 18:34:33 2016 PST" | |
| ] | |
| }, | |
| "execution_count": 37, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "%load_ext version_information\n", | |
| "%version_information numpy, sympy, scipy, matplotlib, pydy" | |
| ] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.5.1" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 0 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment