{
“cells”: [
{

“cell_type”: “markdown”, “metadata”: {}, “source”: [

“# Using multiple blocksn”, “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 notebookn”, “import numpy as npn”, “import matplotlib.pyplot as pltn”, “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 imagesn”, “ // almost always do), so we need to clear the canvas so thatn”, “ // 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_divn”, “ 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 bandn”, “ // 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 updatedn”, “ // 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-buttonsn”, “ $( ".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 butn”, “ * transferred with MIME type text/plain:" errors onn”, “ * Chrome. But how to set the MIME type? It doesn’t seemn”, “ * 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 takesn”, “ // 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-canvasn”, “mpl.findpos = function(e) {n”, “ //this section is from http://www.quirksmode.org/js/events_properties.htmln”, “ 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 bugn”, “ targ = targ.parentNode;n”, “n”, “ // jQuery normalizes the pageX and pageYn”, “ // pageX,Y are the mouse positions relative to the documentn”, “ // offset() returns the position of the element relative to the documentn”, “ 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 keysn”, “ * we need this to avoid circular referencesn”, “ * http://stackoverflow.com/a/24161582/3208463n”, “ /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 ton”, “ * the text insertion cursor when the button is pressed. We wantn”, “ * to control all of the cursor setting manually through then”, “ * ‘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 eventn”, “}n”, “n”, “mpl.figure.prototype.key_event = function(event, name) {n”, “n”, “ // Prevent repeat eventsn”, “ if (name == ‘key_press’)n”, “ {n”, “ if (event.which === this._key)n”, “ return;n”, “ elsen”, “ 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 commn”, “ // object with the appropriate methods. Currently this is a non binaryn”, “ // 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 processn”, “ // 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 Commn”, “ // 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 realn”, “ // 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.ration”, “ 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.ration”, “ 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 son”, “ // 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 = thisn”, “ 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 ‘focusablen”, “ el.attr(‘tabindex’, 0)n”, “ // reach out to IPython and tell the keyboard manager to turn it’s selfn”, “ // off when our div gets focusn”, “n”, “ // location in version 3n”, “ if (IPython.notebook.keyboard_manager) {n”, “ IPython.notebook.keyboard_manager.register_events(el);n”, “ }n”, “ else {n”, “ // location in version 2n”, “ 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+entern”, “ if (event.shiftKey && event.which == 13) {n”, “ this.canvas_div.blur();n”, “ event.shiftKey = false;n”, “ // Send a "J" for go to next celln”, “ 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 forn”, “ // 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 outputn”, “ 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+/eveURojPPPFMcW7p0qTxSujVr1ohRw9GjR8sjPnfffTel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" width="640">”

], “text/plain”: [

“<IPython.core.display.HTML object>”

]

}, “metadata”: {}, “output_type”: “display_data”

}

], “source”: [

“# standard matplotlib stuffn”, “# create the different plotting axesn”, “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 stuffn”, “# now we make our blocksn”, “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=1n”, “)n”, “plt.colorbar(pcolormesh_block.quad)n”, “timeline = amp.Timeline(t, fps=10)n”, “n”, “# now to contruct the animationn”, “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

}