{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Using multiple blocks\n",
    "\n",
    "Here we are going to use 2 different blocks in our animation.\n",
    "\n",
    "First we need some imports:"
   ]
  },
  {
   "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": [
    "We are going to plot a pcolormesh and a line on 2 different axes.\n",
    "\n",
    "Let's use: $z = \\sin(x^2+y^2-t)$ for the pcolormesh, and a cross-section of $y=0$: $z = \\sin(x^2-t)$ for the line.\n",
    "\n",
    "First, we generate the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.linspace(-2, 2, 41)\n",
    "y = np.linspace(-2, 2, 41)\n",
    "t = np.linspace(0, 2 * np.pi, 30)\n",
    "\n",
    "X, Y, T = np.meshgrid(x, y, t)\n",
    "\n",
    "pcolormesh_data = np.sin(X * X + Y * Y - T)\n",
    "line_data = pcolormesh_data[20, :, :]  # the slice where y=0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We need to be careful here. Our time axis is the last axis of our data, but animatplot assumes it is the first axis by default. Fortunately, we can use the ```t_axis``` argument.\n",
    "\n",
    "We use the ```ax``` argument to attached the data to a specific subplot."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": false
   },
   "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,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hBFAAIAqhN/UUlJS5CUIFo9OrlmzRoxE+ePLS5culZegIvBrlwXy+jUq7hxMA/MQAAIAVBE7duyg1157jcaOHSuPQLAyMjLI4XBQvXr15BEPvow9mysOTybed999dPbZZ1Pnzp3l0VL4T+eWpYFpCAABAMrZE088IabxSmurV6+WZ3scOHCAhgwZInLrbr31Vnk0dMpyn6syvr/+OEDRHoPyc/fdd9P69evp448/lkdKZ3Gaa2AeAkAAgHLGb4abNm0qtfmPknDwN3DgQOrTpw/997//lUdDK9j7XFWlpqaS1WrVjfalp6frRgWhfNxzzz30zTff0Pz586lx48by6CloR/SCbWAaAkAAgHLGQUj79u1LbVyehO3fv58GDBggFi28++67FBVVOX+Wg7nPVVlMTIwo+8KrUv3xZS5dA+WHR1X5g8NXX31Fv/32myi7A+EDASAAQCXhkT8O/po0aUIvvPCCWEXJI1dVPVeNy6msW7dO/Mv5dtznlpOTI8+oXJyLNmPGDJo5c6YYuRw/fry4r1U5t5KfO+/zyHbu3HnyOa6quATMBx98QB999JGoBeh97ebn58szSsGDeGYamIYyMAAAlYTLqNx8883ykqoq/2keNWoUzZo1S17y4SlADmirAi4E/dxzz9HBgwfF1DXXWCypNElVsGDBApEGoHXTTTeJ10lVVFJOJY9k82vEiLcMzMAeD5sqAzN/9RSUgTEJASAAAACExMkAsPsEcwHgmqkIAE3CFDAAAACEFg898WresjQMW5ULBIAAAAAAEQYBIAAAAISUxeUy1cA8BIAAAAAQWhzDcSBXpua5CTAHASAAAACElmFgF0QD0xAAAgAAAEQYBIAAAAAQWkare4NpFSQrK4tuuOEGUaqGG/ePHTsmr9XbtWuXqIdo1D7//HN5lqdmora9+eab8trKgQAQAAAAQspoYUcwraKMHDlS7MAyd+5c0bjPQWBJeBcfLjbu35588klKTEykoUOHyrM8uEC2/3lc5LsyIQAEAACA0OIgzkyrALxtIAd9vI1gnz59RHv77bfpu+++oy1btsizVFarlerXr6+0OXPm0IgRIygpKUme5VGrVi3lvPj4eHlN5UAACAAAAKFlFNQF09x4VxH/VlhYKI6X1bJly8S0b+/eveURojPPPFMcW7p0qTxSujVr1ohRw9GjR8sjPnfffTelpqZSz549xfSv01mBc9kBQAAIAADVxpEjR8ToypQpU+QRohUrVlBMTAz9/PPP8ghUBzz96s3V4zZ16lR5TdkcOnSI0tLS5CUfPsbXBeKdd96hDh06UN++feURj6eeekrkBP7yyy90zTXX0P/93/8pr9HKgAAQAACqjbp169LMmTPpiSeeoNWrV1NOTg5df/31dOedd9LgwYPlWVDpjEb1gmlue/fuFfsBe9uECRPEcS1+LRgtwvBv/Fph3Ndyub+f0XGt/Px8+uijjwxH/x555BExpdytWzcR/E2aNImef/55eW3lQAAIAADVyoUXXkhjxoyh6667jsaOHUtxcXH0zDPPyGuhStCu6g22udWoUUNpsbGxnis0eOqV8/tKa507dxYjx4cPH5Zf5cOjyvXq1ZOXSvbFF19QXl4e3XjjjfJIyXhqmaetjb5fqFjcka0nlAYAAKgmeDSG39R5lIhHd7p06SKvgcrEQQ9P1w5qex/ZrMYB26nYHYX0y9aXxKgfB37lhQPBjh07ipSBXr16iWPc52Bt8+bN1K5dO3GsJAMGDBA5fhwInsrrr79O//73v0WJmZIC14qGEUAAAKh2/vnnHzpw4IBItN+9e7c8ClAyzt0bMmSIGD1evny5aNwfNmzYyeBv//791L59e1q5cqW47LV9+3ZatGgR3XrrrfKIz7fffitWE2/YsIF27NghVhlPnDiRbrvttkoL/hgCQAAAqFaKiorE9C+X4nj66adFTlZlTrWBAf98vrK0CvLhhx/SaaedJvJFufHI8ezZs+W1RMXFxaIkDE/1+uO800aNGhnmmUZHR9P06dNFDiDf3iuvvCJyAF988UV5RuXAFDAAAFQrPLXG03B//vmnqMU2cOBASk5OFvXcoHKdnAJuNc7cFPCOaeU+BRxpMAIIAADVxoIFC2jatGli1IaDg6ioKNFfsmQJvfHGG/IsqHTaEb1gG5iGEUAAAAAIiZMjgC3vJVtUGUcAnYX0yz+vYgTQJIwAAgAAAEQYBIAAAAAQWtop3WAbmIYAEAAAAELL6Q7izDQwDQEgAAAAhJbLaa6BaQgAAQAAILSMpnWDaWAaAkAAAACACIMAEAAAAELLKK8vmAamIQAEAACA0DKa1g2mgWkIAAEAACC0OIYzCuwCap6bAHMQAAIAAABEGASAAAAAEFqGI3tBNDANASAAAACEltNproFpCAABAAAgtIxG9YJpYBoCQAAAAAgto6AumAamIQAEAAAAiDAIAAEAACC0jIo7B9PANASAAAAAEFIul9NUA/MQAAIAAEBocR6f0cheIA05gOUCASAAAACElv+CjrI0MA0BIAAAAECEQQAIAAAAoWVU3DmYBqYhAAQAAIDQMprWDaaBaQgAAQAAIKRcTqepBuYhAAQAAACIMAgAAQAAILSMpnWDaWAaAkAAAAAILaP6fsE0MA0BIAAAAISWGMlzlrEhACwPCAABAAAgpFxOl6kG5iEABAAAAHCbPHky9e3blxISEqhWrVryaOlcLhc98cQT1LBhQ4qPj6cBAwbQxo0b5bUeWVlZdMMNN1DNmjVF4/6xY8fktZUDASAAAACEluHUbhCtghQVFdFVV11Fd9xxhzxyas899xy99NJL9Prrr9OqVauofv36dP7551N2drY8g2jkyJG0bt06mjt3rmjc5yCwMlnckSvGUgEAAKDCnThxQoyADbBcRjZLtDwaHLurmBa45tDx48epRo0a8mj5eu+992jcuHGnHKXjEIpH/vjcBx98UBwrLCykevXq0bPPPku33347bdq0iTp27EjLly+n3r17i3O436dPH9q8eTO1a9dOHAs1jAACAABASNldhWR3lrG5v5ZxMOnfOPAKtZ07d9KhQ4do8ODB8ghRbGws9e/fn5YuXSouL1u2TAS93uCPnXnmmeKY95zKgAAQAAAAQiImJkZMkS6hH2gB/a9Mjb82KSmJmjRpcjKnjtvUqVPldwkdDv4Yj/j548ve6/jftLQ00ffHx7znVAYEgAAAABAScXFxYtSMp2/NtH379umOTZgwQX4XFS/QsFgspbbVq1fLs8uGb8MfTw37H9Nez7TnhBoCQAAAAAgZDgI5d89M4xE/7TGeejVy9913izy80lrnzp3l2cHh0UymHclLT08/OSrI5xw+fFj0/R05ckQ3chhKCAABAACg2kpNTaX27duX2jgoLYsWLVqIAG/evHnyiGcl8cKFC0U5GcaLPXiEcuXKleIyW7FihTjmPacyIAAEAAAAcNuzZ48o0cL/OhwO0eeWk5MjzyARMM6ZM0f0eQqXVwBPmTJFHNuwYQONGjVK1BHk0i+sQ4cONGTIEBozZoxY/cuN+8OGDau0FcAMZWAAAAAA3Dh4mzVrlrzkM3/+fFHgmXHQ9+6774pzGYdRTz75JL311lui4DOv9v3Pf/6jTCtnZmbSvffeS9988424fPHFF4u6gYEWm64ICAABAAAAIgymgAEAAAAiDAJAAAAAgAiDABAAAAAgwiAABAAAAIgwCAABAAAAIgwCQAAAAIAIgwAQAAAAIMIgAAQAAACIMAgAAQAAACIMAkAAAACACIMAEAAAACDCIAAEAAAAiDAIAAEAAAAiDAJAAAAAgAiDABAAAAAgwiAABAAAAIgwCAABAAAAIgwCQAAAAIAIgwAQAAAAIMIgAAQAAACIMAgAAQAAACIMAkAAAACACIMAEAAAACDCIAAEAAAAiDAIAAEAAAAiDAJAAAAAgAiDABAAAAAgwiAABAAAAIgwCAABAAAAIgwCQAAAAIAIgwAQAAAAIMIgAAQAAACIMAgAAQAAACIMAkAAAACACIMAEAAAACDCIAAEAAAAiDAIAAEAAAAiDAJAAAAAgAiDABAAAAAgwiAABAAAAIgwFpeb7AMAAECYcTqddODAAUpOTiaLxSKPRg4OY7Kzs6lhw4YUFYVxrUAhAAQAAAhj+/btoyZNmshLkWvv3r3UuHFjeQlOBQEgAABAGDt+/DjVqlWLFi5cSElJSfJo5MjJyaH+/fvTsWPHqGbNmvIonAoCQAAAgDB24sQJEfisWbMmYgPA7t27i0C4Ro0a8iicCibLAQAAACIMAkAAAACACIMAEAAAACDCIAAEAAAAiDAIAAEAAAAiDAJAAAAAgAiDMjDVRKRXggeAyMVvY5G8EwTKwKAMTFkgACxHu3btohYtWtDatWupW7du8mhooBI8AES6SN0JIpQB4IoVK+jGG2+kVatWVZlgCwFg2SAADNCpRtVuuukmeuedd+jIkSOUmppKNptNXhMa3krwA698grY37iiPRqYNT14gewAQCTgA4g/Ape0EsWjRInr++edFkHTw4EGaM2cOXXrppfJavSVLltCDDz5Imzdvpry8PGrWrBndfvvtNH78eHmGx/Tp08Xt8m126tSJpk2bRv369ZPXhkZ5B4APPfSQeH4Yv5fVr1+fBg8eTPfccw/99ddfCACrCQSAATp06JDsEX366af02GOP0ZYtW+QRovj4+BL/8ISC9w/A+dc+Q1ubdpZHI9OuZy6SPQCIBN6/f6UFAD/++CP9/vvvdMYZZ9AVV1xxygCQZ3I4+OvSpQslJiaKgJADwJdffpluu+02cQ6/F9xwww0iCDzrrLPorbfeohkzZtDff/9NTZs2FeeEQkUEgBkZGTR16lSy2+20evVqeuSRR8TzdeGFFyIArCawCCRA/AnI2/gXjUcEtcd4CpiPr1u3TnzNggULxOWffvqJTj/9dBEknnvuuZSeni7+GHXo0EG8WK+99lrxCdOLY/LnnnuOWrZsKb6ma9eu9MUXX8hrAQAgWEOHDqWnn36aLr/8cnmkdPw3m/8286he8+bN6frrr6cLLriAFi9eLM8geumll2j06NF06623ir/nPPrHI5FvvPGGPCN8xcTEUN26dalBgwY0fPhw0X799Vd5rU9WVhbdd999dM4554j3Kj7vu+++k9cSff3119S7d28qKiqSRzx4NPGBBx6Ql6AyIAAMgSeeeIJef/11Wrp0qchRufrqq8Ufio8++oi+//57mjdvHr322mvybBKftN59913xR2Tjxo1iyoH/+PBG3wAAEHo8Ish/w/v37y8uc0DDI248NeqPL/N51U1cXBwVFxfLSz78PHCQzKOfHPjx+xsHdn/++ae4fsiQIeRwOJTgMTMzk+bPnx9wMA4VAwFgCPCnTp4e4E+U/GmRAzkO7vgy54pceeWV4peB5ebmik+VM2fOFJ82eRRw1KhRIgDkXzAAAAgdXlQSGxtLPXr0oLvuukuM9jGeIuXApl69euKyF1/2TxmqDtavX0/ffvst9enTRx7x4cfL72s8AsqjnzwlfvbZZ9PcuXPF9Rw4Dhs2jL766itxmfFt8cwZjwxC5UEAGAKcQ+LFvywJCQkisPPiYzwtzDh3pKCggM4//3yRy+Ft77//Pu3YsUOcAwAAocFTvpwD9+abb4qZm48//lhe46FdIMgpPKdaNBgOOIWJBylOO+00GjFiBPXs2ZMeffRRea0PB8E8oMFTvxzQ8ddwriWXJfPiUUE+dvjwYXGZg8HLLrusWjxP4QwBYAhER0fLnuePhf9lxse4jh/z/stTw5xL6G0cGCIPEAAgtLi0FwdBY8aMEek4nNLDuNqD1WrVjfbxh3ntqGA44mCO8/d4JI9HADmNqU6dOvJaH56teu+998TI6KxZs8TX8Aig/3Rxx44dqX379uI6TmvaunUrpn+rAASAVQz/ovB0w549e6h169ZKQ50/AIDKw6N7hYWFos+LJHjlKedw++PLffv2lZfCFy9A5NI3jRo10g1a+OM8yPPOO48uueQSEeTx+xQviNTiVCce+fvyyy/F88OLS6ByIQCsYngnj/vvv1980uRPUzzty8nH//nPf8RlAAAIHpcK8c6osJ07d4o+f9hmEyZMEOVNvPhvLueqbdu2TTRemPfCCy+IfGwvXv3KZV94FGzTpk3i7zbf3tixY+UZ1R+Xu+FFL3/88Yd4v+ISaZwfqXXxxReLKeDPPvtMlOGByocAsAp66qmnxC8R12DixFpeDMJ/iHgqAgAAgsd5fJyfxo1x8MZ9/lvLuJCzNxhknI7DQSHv6sQLQLhSwzPPPEOTJk2SZ5DIjeO8QD7G53Gx6R9++EGMnEWKO++8U8xc8UIQXgDCU+ODBg2S1/pwLjuvkOaaikbXQ+ihEHQ1gULQPigEDRBZAikEXZ2VdyHoinLzzTdTq1atRKmz8oRC0GWDEUAAAACoMLxFHy9sXL58OY0cOVIehcqGEcBqgj/5YC9gD+wFDBBZeATsVHsBV2dVfQSQd8Di9yieLuap4vKGEcCyQQBYTezbtw+rhAEgovFOS1y4OdKEyxRwRUEAWDYIAKsJTljmwpu8ihjFNQEgkvDbWHZ2NjVs2JCioiIvswkBIALAskAACAAAEMYQACIALAssAgEAAACIMAgAAQAAACIMAkAAAACACIMAEAAAACDCIAAEAAAAiDAIAAEAAAAiDMrAAAAAhDEuf8I7QS1cuDBiy8D0798/YneCKSsEgAAAAGEMO0F5ROpOMGWFABAAACCMRfpOUBzGRPJOMGWFABAAAAAgwiBUBgAAAIgwCAABAAAAIgwCQAAAAIAIgwAQAAAAIMIgAAQAAACIMAgAAQAAACIMAkAAAACACIMAEAAAACDCIAAEAAAAiDAIAAEAAAAiDAJAAAAAgIhC9P/p/UUdyNEDIAAAAABJRU5ErkJggg==\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# standard matplotlib stuff\n",
    "# create the different plotting axes\n",
    "fig, (ax1, ax2) = plt.subplots(1, 2)\n",
    "\n",
    "for ax in [ax1, ax2]:\n",
    "    ax.set_aspect(\"equal\")\n",
    "    ax.set_xlabel(\"x\")\n",
    "\n",
    "ax2.set_ylabel(\"y\", labelpad=-5)\n",
    "ax1.set_ylabel(\"z\")\n",
    "ax1.set_ylim([-1.1, 1.1])\n",
    "\n",
    "fig.suptitle(\"Multiple blocks\")\n",
    "ax1.set_title(\"Cross Section: $y=0$\")\n",
    "ax2.set_title(r\"$z=\\sin(x^2+y^2-t)$\")\n",
    "\n",
    "# animatplot stuff\n",
    "# now we make our blocks\n",
    "line_block = amp.blocks.Line(X[0, :, :], line_data, ax=ax1, t_axis=1)\n",
    "pcolormesh_block = amp.blocks.Pcolormesh(\n",
    "    X[:, :, 0], Y[:, :, 0], pcolormesh_data, ax=ax2, t_axis=2, vmin=-1, vmax=1\n",
    ")\n",
    "plt.colorbar(pcolormesh_block.quad)\n",
    "timeline = amp.Timeline(t, fps=10)\n",
    "\n",
    "# now to contruct the animation\n",
    "anim = amp.Animation([pcolormesh_block, line_block], timeline)\n",
    "anim.controls()\n",
    "\n",
    "anim.save_gif(\"images/multiblock\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There is a lot going on here so lets break it down.\n",
    "\n",
    "Firstly, the ```standard matplotlib stuff``` is creating, and labeling all of our axes for our subplot. This is exactly how one might do a static, non-animated plot.\n",
    "\n",
    "When we make the Line block, we pass in the data for our lines as 2D arrays (```X[0,:,:]``` and ```line_data```). We attached that line to the first matplotlib axes ```ax=ax1```. We also specifify that the time axis is the last axis of the data ```t_axis=1```.\n",
    "\n",
    "When we make the Pcolormesh block, we pass in the x, y data as 2D arrays (```X[:,:,0]``` and ```Y[:,:,0]```), and the z data as a 3D array. We attached the pcolormesh to the second matplotlib axes ```ax=ax2```. We also specifify that the time axis is the last axis of the data ```t_axis=2```.\n",
    "\n",
    "Additional, we told the Pcolormesh blocks what the minimum and maximum values will be (```vmin=-1``` and ```vmax=1```), so that the colorscale will be proper. The keywords ```vmin```, and ```vmax``` get passed to the underlaying called to matplotlib's pcolormesh.\n",
    "\n",
    "```plt.colorbar``` does not recognize the Pcolormesh block as a mappable, so we pass in a mappable from the block to get the colorbar to work. In the future, animatplot may have a wrapper around this.\n",
    "\n",
    "The rest simply brings all of the blocks, and the timeline together into an animation."
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {
    "raw_mimetype": "text/restructuredtext"
   },
   "source": [
    ".. image:: images/multiblock.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.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
