{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Polarization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib notebook\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import animatplot as amp"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's create the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "E0 = np.array([1, 2])\n",
    "E0 = E0 / np.linalg.norm(E0)\n",
    "\n",
    "phi = np.array([0, np.pi / 7])\n",
    "\n",
    "f = 3\n",
    "t = np.linspace(0, 2 * np.pi, 50)\n",
    "\n",
    "# The Electric Field\n",
    "E = E0[:, np.newaxis] * np.exp(\n",
    "    1j * (t + phi[:, np.newaxis])\n",
    ")  # fancy array boardcasting\n",
    "\n",
    "# Converting the Electric field into animatable arrows.\n",
    "X = np.zeros(3)  # x location of the arrow tails\n",
    "Y = np.zeros(3)  # y location of the arrow tails\n",
    "\n",
    "zeros = np.zeros_like(E[0, :])  # padding\n",
    "U = np.array([E[0, :], zeros, E[0, :]]).real\n",
    "V = np.array([zeros, E[1, :], E[1, :]]).real"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now to animate it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydB3hNWffG3yQSRB29RQ+jlyBCRItu1MHoDINPZ4oyo/cyemfU0YbB6F2CRO81eu8tQkj/P3vP/2aURG5u7rn33HPe8zyebz7ZZa3f2pbXPmevbRcVFRUFPiRAAiRAAiRAAiRAArohYEcBqJtY01ESIAESIAESIAESkAQoALkQSIAESIAESIAESEBnBCgAdRZwuksCJEACJEACJEACFIBcAyRAAiRAAiRAAiSgMwIUgDoLON0lARIgARIgARIgAQpArgESIAESIAESIAES0BkBCkCdBZzukgAJkAAJkAAJkAAFINcACZAACZAACZAACeiMAAWgzgJOd0mABEiABEiABEiAApBrgARIgARIgARIgAR0RoACUGcBp7skQAIkQAIkQAIkQAHINUACJEACJEACJEACOiNAAaizgNNdEiABEiABEiABEqAA5BogARIgARIgARIgAZ0RoADUWcDpLgmQAAmQAAmQAAlQAHINkAAJkAAJkAAJkIDOCFAA6izgdJcESIAESIAESIAEKAC5BkiABEiABEiABEhAZwQoAHUWcLpLAiRAAiRAAiRAAhSAXAMkQAIkQAIkQAIkoDMCFIA6CzjdJQESIAESIAESIAEKQK4BEiABEiABEiABEtAZAQpAnQWc7pIACZAACZAACZAABSDXAAmQAAmQAAmQAAnojAAFoM4CTndJgARIgARIgARIgAKQa4AESIAESIAESIAEdEaAAlBnAae7JEACJEACJEACJEAByDVAAiRAAiRAAiRAAjojQAGos4DTXRIgARIgARIgARKgAOQaIAESIAESIAESIAGdEaAA1FnA6S4JkAAJkAAJkAAJUAByDZAACZAACZAACZCAzghQAOos4HSXBEiABEiABEiABCgAuQZIgARIgARIgARIQGcEKAB1FnC6SwIkQAIkQAIkQAIUgFwDJEACJEACJEACJKAzAhSAOgs43SUBEiABEiABEiABCkCuARIgARIgARIgARLQGQEKQJ0FnO6SAAmQAAmQAAmQAAUg1wAJkAAJkAAJkAAJ6IwABaDOAk53SYAESIAESIAESIACkGuABEiABEiABEiABHRGgAJQZwGnuyRAAiRAAiRAAiRAAcg1QAIkQAIkQAIkQAI6I0ABqLOA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tKTZWGkSIAESIAESIAES0E+AAlA/O6YkARIgARIgARIgAUsSoAC0pNlYaRIgARIgARIgARLQT4ACUD87piQBEiABEiABEiABSxKgALSk2VhpEiABEiABEiABEtBPgAJQPzumJAESIAESIAESIAFLEqAAtKTZWGkSIAESIAESIAES0E+AAlA/O6YkARIgARIgARIgAUsSoAC0pNlYaRIgARIgARIgARLQT4ACUD87piQBEiABEiABEiABSxKgALSk2VhpEiABEiABEiABEtBPgAJQPzumJAESIAESIAESIAFLEqAAtKTZWGkSIAESIAESIAES0E+AAlA/O6YkARIgARIgARIgAUsSoAC0pNlYaRIgARIgARIgARLQT4ACUD87piQBEiABEiCBoBNISEhATEwMQkNDkSFDhqDXx+gKJCYm4vbt2yhWrBhCQkKMLt6y5VEAWtZ0rDgJkAAJkAAJAOfPn0fJkiUdj+LcuXMoUaKE4zloBUABqJUU45EACZAACZCACQncvHkTefPmxfbt25ErVy4T1jCwVbpz5w6eeeYZ3LhxA3ny5AlsYTbKnQLQRsZkU0iABEiABJxH4NatW0r47N+/37ECsFatWhAhnDt3bud1AJ0tpgDUCY7JSIAESIAESMAMBCgA74AC0PueSAHoPTOmIAESIAESIAHTEKAApADU0xkpAPVQYxoSIAESIAESMAkBCkAKQD1dkQJQDzWmIQESIAESIAGTEKAApADU0xUpAPVQYxoSIAESIAESMAkBCkAKQD1dkQJQDzWmIQESIAESIAGTEKAApADU0xUpAPVQM2Eap58Eb0KTsEokQAIGEXD6TRAUgBSAer5qFIB6qKWR5vTp0yhbtix+/vlnVK9e3Y85e86KJ8F7ZsQYJEAC9ibg1JsgjBSAUVFReP311xEdHW2aM/fkIGgeA+P9d5sCUCMzT/crdunSBQsWLMCVK1dQoEABZMqUSWPO/onmOgn+3IYNyN2ggX8yZS4kQAIkYAECIoDkKjRPN0HMnj0bkyZNwsWLF1GlShVMnToVjRo1SrOFX3/9NUaMGIGTJ0+ifPnyGDduHNq1a+eOLyOPY8aMwbx583D9+nXUqVMHs2bNUnkbGfwtAIcMGYLVq1erJsizrEiRInj++efx9ttv47fffqMANNK4ASyLAlAj3EuXLrljfvXVVxg5ciSOHTvm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pTEyUiprH1MeCaO5oWlEpADUR5ACUB8306WiADSdSVghEiABgwhoFYAGVcfwYvwtAAPVANlBLVPDIqr9GSgA9dGkANTHzXSpKABNZxJWiARIwCACFIC31PSrXDAgS4XMFmSUUI7gef/999X6RtcRaP6qJwWgPpIUgPq4mS4V7wI2nUlYIRIgAYMIiADUchewQdUxvBizjwA+++yz6paQPn36uM9D9CckCkB9NCkA9XEzXSpZP5LWETGmqywrRAIkQAIBICDHqZQoUSIAOZs7S7MLwEDTowDUR5gCUB8306WSrfdyIKlcQO6Pk9VN10BWiARIgATSICCbMWTTgdzIERIS4jhOFIB31BE/MsooG2kYtBGgANTGibFIgARIgARIwJQEKAApAPV0TApAPdSYhgRIgARIgARMQoACkAJQT1ekANRDjWlIgARIgARIwCQEKAApAPV0RQpAPdSYhgRIgARIgARMQoACkAJQT1ekANRDjWlIgARIgARIwCQEKAApAPV0RQpAPdSYhgRIgARIgARMQoACkAJQT1ekANRDjWlIgARIgARIwCQEKAApAPV0RQpAPdSYhgRIgARIgARMQsB1E9T27dtNeRVcoDHJQdDPPPMM5Mo5uRKPQRsBCkBtnBiLBEiABEiABExJgDdB/ccsTr0JRm+npADUS47pSIAESIAESMAEBJx+E5TTb4LR2wUpAPWSYzoSIAESIAESIAESsCgBCkCLGo7VJgESIAESIAESIAG9BCgA9ZJjOhIgARIgARIgARKwKAEKQIsajtUmARIgARIgARIgAb0EKAD1kmM6EiABEiABEiABErAoAQpAixqO1SYBEiABEiABEiABvQQoAPWSYzoSIAESIAESIAESsCgBCkCLGo7VJgESIAESIAESIAG9BCgA9ZJjOhIgARIgARIgARKwKAEKQIsajtUmARIgARIgARIgAb0EKAD1kmM6EiABEiABEiABErAoAQpAixqO1SYBEiABEiABEiABvQT+D64zJ05L9/3iAAAAAElFTkSuQmCC\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(E[0].real, E.real[1])\n",
    "\n",
    "timeline = amp.Timeline(t, units=\"ns\", fps=20)\n",
    "block = amp.blocks.Quiver(X, Y, U, V, t_axis=1, scale_units=\"xy\", scale=1)\n",
    "anim = amp.Animation([block], timeline)\n",
    "\n",
    "block.ax.set_aspect(\"equal\")\n",
    "block.ax.set_xlim([-1, 1])\n",
    "block.ax.set_ylim([-1, 1])\n",
    "\n",
    "anim.controls()\n",
    "anim.save_gif(\"polarization\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {
    "raw_mimetype": "text/restructuredtext"
   },
   "source": [
    ".. image:: polarization.gif"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Raw Cell Format",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
