From f7e57f04697e405dd950b255a4ee404d598d6d48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20M=C3=BCller?= <muellerl@mv.uni-kl.de> Date: Thu, 22 Apr 2021 18:00:16 +0200 Subject: [PATCH] added basic script --- Faltung.ipynb | 4242 ++++++++++++++++++++++++++++++++++++++++++++++++- lti.svg | 226 +++ 2 files changed, 4464 insertions(+), 4 deletions(-) create mode 100644 lti.svg diff --git a/Faltung.ipynb b/Faltung.ipynb index d3a6c71..b3a7dc8 100644 --- a/Faltung.ipynb +++ b/Faltung.ipynb @@ -5,16 +5,4250 @@ "id": "e12ef12a", "metadata": {}, "source": [ - "# Inhalt folgt in Kürze" + "# Faltung\n", + "Wir können mit Hilfe der Faltung die Antwort $y(t)$ eines kausalen, linear und zeitinvarianten Systems auf ein beliebiges\n", + "Signal $x(t)$ berechnen.\n", + "\n", + "\n", + "\n", + "$$\n", + "y(t)=x(t)*g(t)=\\int_{0}^{t}x(\\tau)g(t-\\tau)\\,\\mathrm{d}t\n", + "$$\n", + "$g(t)$ ist die Gewichtsfunktion, welche das System charakterisiert.\n", + "\n", + "Um ein besseres Verständnis für die Faltung zu erhalten schauen wir uns diese im Detail an. Zunächst betrachten wir\n", + "wie die Antwort $y(t)$ des Systems zustande kommt.\n", + "\n", + "Wir definieren zunächst die Gewichtsfunktion $g(t)$ und ein beliebiges Eingangssignal $x(t)$:\n", + "\n", + "$$\n", + "g(t) = \\begin{cases} \\mathrm{e}^{-t}, & t > 0\\\\ 0, & \\text{sonst}\\end{cases}\n", + "\\qquad x(t) = \\begin{cases}\n", + " 0.25\\cdot\\cos(\\frac{t}{\\pi})+0.75, & t > 0\\\\\n", + " 0, & \\text{sonst}\n", + " \\end{cases}\n", + "$$" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "528130f9", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "/* global mpl */\n", + "window.mpl = {};\n", + "\n", + "mpl.get_websocket_type = function () {\n", + " if (typeof WebSocket !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof MozWebSocket !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert(\n", + " '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", + "\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 = document.createElement('div');\n", + " this.root.setAttribute('style', 'display: inline-block');\n", + " this._root_extra_style(this.root);\n", + "\n", + " parent_element.appendChild(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 (fig.ratio !== 1) {\n", + " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.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 = document.createElement('div');\n", + " titlebar.classList =\n", + " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", + " var titletext = document.createElement('div');\n", + " titletext.classList = 'ui-dialog-title';\n", + " titletext.setAttribute(\n", + " 'style',\n", + " 'width: 100%; text-align: center; padding: 3px;'\n", + " );\n", + " titlebar.appendChild(titletext);\n", + " this.root.appendChild(titlebar);\n", + " this.header = titletext;\n", + "};\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", + "\n", + "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", + "\n", + "mpl.figure.prototype._init_canvas = function () {\n", + " var fig = this;\n", + "\n", + " var canvas_div = (this.canvas_div = document.createElement('div'));\n", + " canvas_div.setAttribute(\n", + " 'style',\n", + " 'border: 1px solid #ddd;' +\n", + " 'box-sizing: content-box;' +\n", + " 'clear: both;' +\n", + " 'min-height: 1px;' +\n", + " 'min-width: 1px;' +\n", + " 'outline: 0;' +\n", + " 'overflow: hidden;' +\n", + " 'position: relative;' +\n", + " 'resize: both;'\n", + " );\n", + "\n", + " function on_keyboard_event_closure(name) {\n", + " return function (event) {\n", + " return fig.key_event(event, name);\n", + " };\n", + " }\n", + "\n", + " canvas_div.addEventListener(\n", + " 'keydown',\n", + " on_keyboard_event_closure('key_press')\n", + " );\n", + " canvas_div.addEventListener(\n", + " 'keyup',\n", + " on_keyboard_event_closure('key_release')\n", + " );\n", + "\n", + " this._canvas_extra_style(canvas_div);\n", + " this.root.appendChild(canvas_div);\n", + "\n", + " var canvas = (this.canvas = document.createElement('canvas'));\n", + " canvas.classList.add('mpl-canvas');\n", + " canvas.setAttribute('style', 'box-sizing: content-box;');\n", + "\n", + " this.context = canvas.getContext('2d');\n", + "\n", + " var backingStore =\n", + " this.context.backingStorePixelRatio ||\n", + " this.context.webkitBackingStorePixelRatio ||\n", + " this.context.mozBackingStorePixelRatio ||\n", + " this.context.msBackingStorePixelRatio ||\n", + " this.context.oBackingStorePixelRatio ||\n", + " this.context.backingStorePixelRatio ||\n", + " 1;\n", + "\n", + " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", + " 'canvas'\n", + " ));\n", + " rubberband_canvas.setAttribute(\n", + " 'style',\n", + " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", + " );\n", + "\n", + " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", + " if (this.ResizeObserver === undefined) {\n", + " if (window.ResizeObserver !== undefined) {\n", + " this.ResizeObserver = window.ResizeObserver;\n", + " } else {\n", + " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", + " this.ResizeObserver = obs.ResizeObserver;\n", + " }\n", + " }\n", + "\n", + " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", + " var nentries = entries.length;\n", + " for (var i = 0; i < nentries; i++) {\n", + " var entry = entries[i];\n", + " var width, height;\n", + " if (entry.contentBoxSize) {\n", + " if (entry.contentBoxSize instanceof Array) {\n", + " // Chrome 84 implements new version of spec.\n", + " width = entry.contentBoxSize[0].inlineSize;\n", + " height = entry.contentBoxSize[0].blockSize;\n", + " } else {\n", + " // Firefox implements old version of spec.\n", + " width = entry.contentBoxSize.inlineSize;\n", + " height = entry.contentBoxSize.blockSize;\n", + " }\n", + " } else {\n", + " // Chrome <84 implements even older version of spec.\n", + " width = entry.contentRect.width;\n", + " height = entry.contentRect.height;\n", + " }\n", + "\n", + " // Keep the size of the canvas and rubber band canvas in sync with\n", + " // the canvas container.\n", + " if (entry.devicePixelContentBoxSize) {\n", + " // Chrome 84 implements new version of spec.\n", + " canvas.setAttribute(\n", + " 'width',\n", + " entry.devicePixelContentBoxSize[0].inlineSize\n", + " );\n", + " canvas.setAttribute(\n", + " 'height',\n", + " entry.devicePixelContentBoxSize[0].blockSize\n", + " );\n", + " } else {\n", + " canvas.setAttribute('width', width * fig.ratio);\n", + " canvas.setAttribute('height', height * fig.ratio);\n", + " }\n", + " canvas.setAttribute(\n", + " 'style',\n", + " 'width: ' + width + 'px; height: ' + height + 'px;'\n", + " );\n", + "\n", + " rubberband_canvas.setAttribute('width', width);\n", + " rubberband_canvas.setAttribute('height', height);\n", + "\n", + " // And update the size in Python. We ignore the initial 0/0 size\n", + " // that occurs as the element is placed into the DOM, which should\n", + " // otherwise not happen due to the minimum size styling.\n", + " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", + " fig.request_resize(width, height);\n", + " }\n", + " }\n", + " });\n", + " this.resizeObserverInstance.observe(canvas_div);\n", + "\n", + " function on_mouse_event_closure(name) {\n", + " return function (event) {\n", + " return fig.mouse_event(event, name);\n", + " };\n", + " }\n", + "\n", + " rubberband_canvas.addEventListener(\n", + " 'mousedown',\n", + " on_mouse_event_closure('button_press')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseup',\n", + " on_mouse_event_closure('button_release')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'dblclick',\n", + " on_mouse_event_closure('dblclick')\n", + " );\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband_canvas.addEventListener(\n", + " 'mousemove',\n", + " on_mouse_event_closure('motion_notify')\n", + " );\n", + "\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseenter',\n", + " on_mouse_event_closure('figure_enter')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseleave',\n", + " on_mouse_event_closure('figure_leave')\n", + " );\n", + "\n", + " canvas_div.addEventListener('wheel', function (event) {\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " on_mouse_event_closure('scroll')(event);\n", + " });\n", + "\n", + " canvas_div.appendChild(canvas);\n", + " canvas_div.appendChild(rubberband_canvas);\n", + "\n", + " this.rubberband_context = rubberband_canvas.getContext('2d');\n", + " this.rubberband_context.strokeStyle = '#000000';\n", + "\n", + " this._resize_canvas = function (width, height, forward) {\n", + " if (forward) {\n", + " canvas_div.style.width = width + 'px';\n", + " canvas_div.style.height = height + 'px';\n", + " }\n", + " };\n", + "\n", + " // Disable right mouse context menu.\n", + " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", + " event.preventDefault();\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 toolbar = document.createElement('div');\n", + " toolbar.classList = 'mpl-toolbar';\n", + " this.root.appendChild(toolbar);\n", + "\n", + " function on_click_closure(name) {\n", + " return function (_event) {\n", + " return fig.toolbar_button_onclick(name);\n", + " };\n", + " }\n", + "\n", + " function on_mouseover_closure(tooltip) {\n", + " return function (event) {\n", + " if (!event.currentTarget.disabled) {\n", + " return fig.toolbar_button_onmouseover(tooltip);\n", + " }\n", + " };\n", + " }\n", + "\n", + " fig.buttons = {};\n", + " var buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'mpl-button-group';\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", + " /* Instead of a spacer, we start a new button group. */\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + " buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'mpl-button-group';\n", + " continue;\n", + " }\n", + "\n", + " var button = (fig.buttons[name] = document.createElement('button'));\n", + " button.classList = 'mpl-widget';\n", + " button.setAttribute('role', 'button');\n", + " button.setAttribute('aria-disabled', 'false');\n", + " button.addEventListener('click', on_click_closure(method_name));\n", + " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", + "\n", + " var icon_img = document.createElement('img');\n", + " icon_img.src = '_images/' + image + '.png';\n", + " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", + " icon_img.alt = tooltip;\n", + " button.appendChild(icon_img);\n", + "\n", + " buttonGroup.appendChild(button);\n", + " }\n", + "\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + "\n", + " var fmt_picker = document.createElement('select');\n", + " fmt_picker.classList = 'mpl-widget';\n", + " toolbar.appendChild(fmt_picker);\n", + " this.format_dropdown = fmt_picker;\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = document.createElement('option');\n", + " option.selected = fmt === mpl.default_extension;\n", + " option.innerHTML = fmt;\n", + " fmt_picker.appendChild(option);\n", + " }\n", + "\n", + " var status_bar = document.createElement('span');\n", + " status_bar.classList = 'mpl-message';\n", + " toolbar.appendChild(status_bar);\n", + " this.message = status_bar;\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", + "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", + "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], msg['forward']);\n", + " fig.send_message('refresh', {});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", + " var x0 = msg['x0'] / fig.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", + " var x1 = msg['x1'] / fig.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / fig.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,\n", + " 0,\n", + " fig.canvas.width / fig.ratio,\n", + " fig.canvas.height / fig.ratio\n", + " );\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", + " 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.handle_history_buttons = function (fig, msg) {\n", + " for (var key in msg) {\n", + " if (!(key in fig.buttons)) {\n", + " continue;\n", + " }\n", + " fig.buttons[key].disabled = !msg[key];\n", + " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", + " if (msg['mode'] === 'PAN') {\n", + " fig.buttons['Pan'].classList.add('active');\n", + " fig.buttons['Zoom'].classList.remove('active');\n", + " } else if (msg['mode'] === 'ZOOM') {\n", + " fig.buttons['Pan'].classList.remove('active');\n", + " fig.buttons['Zoom'].classList.add('active');\n", + " } else {\n", + " fig.buttons['Pan'].classList.remove('active');\n", + " fig.buttons['Zoom'].classList.remove('active');\n", + " }\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", + " var img = evt.data;\n", + " if (img.type !== 'image/png') {\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", + " img.type = 'image/png';\n", + " }\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", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " img\n", + " );\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " } else if (\n", + " typeof evt.data === 'string' &&\n", + " evt.data.slice(0, 21) === 'data:image/png;base64'\n", + " ) {\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(\n", + " \"No handler for the '\" + msg_type + \"' message type: \",\n", + " msg\n", + " );\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(\n", + " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", + " e,\n", + " e.stack,\n", + " msg\n", + " );\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", + " }\n", + " if (e.target) {\n", + " targ = e.target;\n", + " } else if (e.srcElement) {\n", + " targ = e.srcElement;\n", + " }\n", + " if (targ.nodeType === 3) {\n", + " // defeat Safari bug\n", + " targ = targ.parentNode;\n", + " }\n", + "\n", + " // pageX,Y are the mouse positions relative to the document\n", + " var boundingRect = targ.getBoundingClientRect();\n", + " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", + " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\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", + " }\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", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * this.ratio;\n", + " var y = canvas_pos.y * this.ratio;\n", + "\n", + " this.send_message(name, {\n", + " x: x,\n", + " y: y,\n", + " button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event),\n", + " });\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", + " // Prevent repeat events\n", + " if (name === 'key_press') {\n", + " if (event.key === this._key) {\n", + " return;\n", + " } else {\n", + " this._key = event.key;\n", + " }\n", + " }\n", + " if (name === 'key_release') {\n", + " this._key = null;\n", + " }\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.key !== 'Control') {\n", + " value += 'ctrl+';\n", + " }\n", + " else if (event.altKey && event.key !== 'Alt') {\n", + " value += 'alt+';\n", + " }\n", + " else if (event.shiftKey && event.key !== 'Shift') {\n", + " value += 'shift+';\n", + " }\n", + "\n", + " value += 'k' + event.key;\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, { key: value, 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", + "\n", + "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", + "// prettier-ignore\n", + "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\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\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", + "\n", + "mpl.default_extension = \"png\";/* global mpl */\n", + "\n", + "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.binaryType = comm.kernel.ws.binaryType;\n", + " ws.readyState = comm.kernel.ws.readyState;\n", + " function updateReadyState(_event) {\n", + " if (comm.kernel.ws) {\n", + " ws.readyState = comm.kernel.ws.readyState;\n", + " } else {\n", + " ws.readyState = 3; // Closed state.\n", + " }\n", + " }\n", + " comm.kernel.ws.addEventListener('open', updateReadyState);\n", + " comm.kernel.ws.addEventListener('close', updateReadyState);\n", + " comm.kernel.ws.addEventListener('error', updateReadyState);\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", + " var data = msg['content']['data'];\n", + " if (data['blob'] !== undefined) {\n", + " data = {\n", + " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", + " };\n", + " }\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(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 = document.getElementById(id);\n", + " var ws_proxy = comm_websocket_adapter(comm);\n", + "\n", + " function ondownload(figure, _format) {\n", + " window.open(figure.canvas.toDataURL());\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\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;\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", + " fig.cell_info[0].output_area.element.on(\n", + " 'cleared',\n", + " { fig: fig },\n", + " fig._remove_fig_handler\n", + " );\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function (fig, msg) {\n", + " var width = fig.canvas.width / fig.ratio;\n", + " fig.cell_info[0].output_area.element.off(\n", + " 'cleared',\n", + " fig._remove_fig_handler\n", + " );\n", + " fig.resizeObserverInstance.unobserve(fig.canvas_div);\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.innerHTML =\n", + " '<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 / this.ratio;\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] =\n", + " '<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 () {\n", + " fig.push_to_output();\n", + " }, 1000);\n", + "};\n", + "\n", + "mpl.figure.prototype._init_toolbar = function () {\n", + " var fig = this;\n", + "\n", + " var toolbar = document.createElement('div');\n", + " toolbar.classList = 'btn-toolbar';\n", + " this.root.appendChild(toolbar);\n", + "\n", + " function on_click_closure(name) {\n", + " return function (_event) {\n", + " return fig.toolbar_button_onclick(name);\n", + " };\n", + " }\n", + "\n", + " function on_mouseover_closure(tooltip) {\n", + " return function (event) {\n", + " if (!event.currentTarget.disabled) {\n", + " return fig.toolbar_button_onmouseover(tooltip);\n", + " }\n", + " };\n", + " }\n", + "\n", + " fig.buttons = {};\n", + " var buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'btn-group';\n", + " var button;\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", + " /* Instead of a spacer, we start a new button group. */\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + " buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'btn-group';\n", + " continue;\n", + " }\n", + "\n", + " button = fig.buttons[name] = document.createElement('button');\n", + " button.classList = 'btn btn-default';\n", + " button.href = '#';\n", + " button.title = name;\n", + " button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n", + " button.addEventListener('click', on_click_closure(method_name));\n", + " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", + " buttonGroup.appendChild(button);\n", + " }\n", + "\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = document.createElement('span');\n", + " status_bar.classList = 'mpl-message pull-right';\n", + " toolbar.appendChild(status_bar);\n", + " this.message = status_bar;\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = document.createElement('div');\n", + " buttongrp.classList = 'btn-group inline pull-right';\n", + " button = document.createElement('button');\n", + " button.classList = 'btn btn-mini btn-primary';\n", + " button.href = '#';\n", + " button.title = 'Stop Interaction';\n", + " button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n", + " button.addEventListener('click', function (_evt) {\n", + " fig.handle_close(fig, {});\n", + " });\n", + " button.addEventListener(\n", + " 'mouseover',\n", + " on_mouseover_closure('Stop Interaction')\n", + " );\n", + " buttongrp.appendChild(button);\n", + " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", + " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", + "};\n", + "\n", + "mpl.figure.prototype._remove_fig_handler = function (event) {\n", + " var fig = event.data.fig;\n", + " if (event.target !== this) {\n", + " // Ignore bubbled events from children.\n", + " return;\n", + " }\n", + " fig.close_ws(fig, {});\n", + "};\n", + "\n", + "mpl.figure.prototype._root_extra_style = function (el) {\n", + " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", + "};\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function (el) {\n", + " // this is important to make the div 'focusable\n", + " el.setAttribute('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", + " } else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\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", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which === 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", + " fig.ondownload(fig, null);\n", + "};\n", + "\n", + "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(\n", + " 'matplotlib',\n", + " mpl.mpl_figure_comm\n", + " );\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,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\" width=\"950\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot # for plotting\n", + "import numpy # for math operations\n", + "from numpy import exp, cos, pi # importing some functions for direct usage instead of numpy.exp\n", + "from ipywidgets import FloatSlider, Checkbox\n", + "from IPython.display import display\n", + "%matplotlib notebook\n", + "pyplot.rcParams[\"figure.figsize\"] = (9.5, 5) # standard figure size\n", + "\n", + "# we need data to plot, we therefore create a time \"scale\"\n", + "t0 = -0.5\n", + "t1 = 10\n", + "N = 1000\n", + "t = numpy.linspace(t0, t1, N) # from t0 to t1 with N values\n", + "\n", + "### defining the functions g(t) and x(t)\n", + "\n", + "def g(t):\n", + " if t < 0:\n", + " return 0\n", + " else:\n", + " return exp(-t)\n", + "\n", + "\n", + "def x(t):\n", + " if t < 0:\n", + " return 0\n", + " else:\n", + " return cos(1 / (pi) * t) * 0.25 + 0.75\n", + "\n", + "\n", + "### plotting both functions\n", + "# layouting\n", + "figure, (axis1, axis2) = pyplot.subplots(1, 2)\n", + "figure.tight_layout(pad=2.5)\n", + "axis1.set_xlabel('$t$')\n", + "axis1.set_ylabel('$g(t)$')\n", + "axis2.set_xlabel('$t$')\n", + "axis2.set_ylabel('$x(t)$')\n", + "# plotting\n", + "axis1.plot(t, list(map(g, t))) # calling map to process function g on each value in t\n", + "axis2.plot(t, list(map(x, t))) # + converting the return of map to a list, for plotting\n", + "pyplot.show()" + ] + }, + { + "cell_type": "markdown", + "id": "480a49b8", + "metadata": {}, + "source": [ + "## Approximation\n", + "\n", + "Wir approximieren unser Eingangssignal $x(t)$ mit Hilfe einer Treppenfunktion $\\Delta$ mit der Breite $\\Delta t$:\n", + "\n", + "\n", + "$$\n", + "\\Delta (t-k\\Delta t) =\n", + "\\begin{cases}\n", + "1, & \\text{für }\\, k \\, \\Delta t \\leq t \\leq (k+1) \\, \\Delta t\\\\\n", + "0, & \\text{sonst}\\\\\n", + "\\end{cases}\n", + "$$\n", + "\n", + "Wir plotten diese für z.B. $k=0$ und nehmen an, dass das System auf diese Treppenfunktion mit $g_{\\Delta}(t-k\\Delta t)$ antwortet." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "3e8447bd", + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "/* global mpl */\n", + "window.mpl = {};\n", + "\n", + "mpl.get_websocket_type = function () {\n", + " if (typeof WebSocket !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof MozWebSocket !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert(\n", + " '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", + "\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 = document.createElement('div');\n", + " this.root.setAttribute('style', 'display: inline-block');\n", + " this._root_extra_style(this.root);\n", + "\n", + " parent_element.appendChild(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 (fig.ratio !== 1) {\n", + " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.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 = document.createElement('div');\n", + " titlebar.classList =\n", + " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", + " var titletext = document.createElement('div');\n", + " titletext.classList = 'ui-dialog-title';\n", + " titletext.setAttribute(\n", + " 'style',\n", + " 'width: 100%; text-align: center; padding: 3px;'\n", + " );\n", + " titlebar.appendChild(titletext);\n", + " this.root.appendChild(titlebar);\n", + " this.header = titletext;\n", + "};\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", + "\n", + "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", + "\n", + "mpl.figure.prototype._init_canvas = function () {\n", + " var fig = this;\n", + "\n", + " var canvas_div = (this.canvas_div = document.createElement('div'));\n", + " canvas_div.setAttribute(\n", + " 'style',\n", + " 'border: 1px solid #ddd;' +\n", + " 'box-sizing: content-box;' +\n", + " 'clear: both;' +\n", + " 'min-height: 1px;' +\n", + " 'min-width: 1px;' +\n", + " 'outline: 0;' +\n", + " 'overflow: hidden;' +\n", + " 'position: relative;' +\n", + " 'resize: both;'\n", + " );\n", + "\n", + " function on_keyboard_event_closure(name) {\n", + " return function (event) {\n", + " return fig.key_event(event, name);\n", + " };\n", + " }\n", + "\n", + " canvas_div.addEventListener(\n", + " 'keydown',\n", + " on_keyboard_event_closure('key_press')\n", + " );\n", + " canvas_div.addEventListener(\n", + " 'keyup',\n", + " on_keyboard_event_closure('key_release')\n", + " );\n", + "\n", + " this._canvas_extra_style(canvas_div);\n", + " this.root.appendChild(canvas_div);\n", + "\n", + " var canvas = (this.canvas = document.createElement('canvas'));\n", + " canvas.classList.add('mpl-canvas');\n", + " canvas.setAttribute('style', 'box-sizing: content-box;');\n", + "\n", + " this.context = canvas.getContext('2d');\n", + "\n", + " var backingStore =\n", + " this.context.backingStorePixelRatio ||\n", + " this.context.webkitBackingStorePixelRatio ||\n", + " this.context.mozBackingStorePixelRatio ||\n", + " this.context.msBackingStorePixelRatio ||\n", + " this.context.oBackingStorePixelRatio ||\n", + " this.context.backingStorePixelRatio ||\n", + " 1;\n", + "\n", + " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", + " 'canvas'\n", + " ));\n", + " rubberband_canvas.setAttribute(\n", + " 'style',\n", + " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", + " );\n", + "\n", + " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", + " if (this.ResizeObserver === undefined) {\n", + " if (window.ResizeObserver !== undefined) {\n", + " this.ResizeObserver = window.ResizeObserver;\n", + " } else {\n", + " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", + " this.ResizeObserver = obs.ResizeObserver;\n", + " }\n", + " }\n", + "\n", + " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", + " var nentries = entries.length;\n", + " for (var i = 0; i < nentries; i++) {\n", + " var entry = entries[i];\n", + " var width, height;\n", + " if (entry.contentBoxSize) {\n", + " if (entry.contentBoxSize instanceof Array) {\n", + " // Chrome 84 implements new version of spec.\n", + " width = entry.contentBoxSize[0].inlineSize;\n", + " height = entry.contentBoxSize[0].blockSize;\n", + " } else {\n", + " // Firefox implements old version of spec.\n", + " width = entry.contentBoxSize.inlineSize;\n", + " height = entry.contentBoxSize.blockSize;\n", + " }\n", + " } else {\n", + " // Chrome <84 implements even older version of spec.\n", + " width = entry.contentRect.width;\n", + " height = entry.contentRect.height;\n", + " }\n", + "\n", + " // Keep the size of the canvas and rubber band canvas in sync with\n", + " // the canvas container.\n", + " if (entry.devicePixelContentBoxSize) {\n", + " // Chrome 84 implements new version of spec.\n", + " canvas.setAttribute(\n", + " 'width',\n", + " entry.devicePixelContentBoxSize[0].inlineSize\n", + " );\n", + " canvas.setAttribute(\n", + " 'height',\n", + " entry.devicePixelContentBoxSize[0].blockSize\n", + " );\n", + " } else {\n", + " canvas.setAttribute('width', width * fig.ratio);\n", + " canvas.setAttribute('height', height * fig.ratio);\n", + " }\n", + " canvas.setAttribute(\n", + " 'style',\n", + " 'width: ' + width + 'px; height: ' + height + 'px;'\n", + " );\n", + "\n", + " rubberband_canvas.setAttribute('width', width);\n", + " rubberband_canvas.setAttribute('height', height);\n", + "\n", + " // And update the size in Python. We ignore the initial 0/0 size\n", + " // that occurs as the element is placed into the DOM, which should\n", + " // otherwise not happen due to the minimum size styling.\n", + " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", + " fig.request_resize(width, height);\n", + " }\n", + " }\n", + " });\n", + " this.resizeObserverInstance.observe(canvas_div);\n", + "\n", + " function on_mouse_event_closure(name) {\n", + " return function (event) {\n", + " return fig.mouse_event(event, name);\n", + " };\n", + " }\n", + "\n", + " rubberband_canvas.addEventListener(\n", + " 'mousedown',\n", + " on_mouse_event_closure('button_press')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseup',\n", + " on_mouse_event_closure('button_release')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'dblclick',\n", + " on_mouse_event_closure('dblclick')\n", + " );\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband_canvas.addEventListener(\n", + " 'mousemove',\n", + " on_mouse_event_closure('motion_notify')\n", + " );\n", + "\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseenter',\n", + " on_mouse_event_closure('figure_enter')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseleave',\n", + " on_mouse_event_closure('figure_leave')\n", + " );\n", + "\n", + " canvas_div.addEventListener('wheel', function (event) {\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " on_mouse_event_closure('scroll')(event);\n", + " });\n", + "\n", + " canvas_div.appendChild(canvas);\n", + " canvas_div.appendChild(rubberband_canvas);\n", + "\n", + " this.rubberband_context = rubberband_canvas.getContext('2d');\n", + " this.rubberband_context.strokeStyle = '#000000';\n", + "\n", + " this._resize_canvas = function (width, height, forward) {\n", + " if (forward) {\n", + " canvas_div.style.width = width + 'px';\n", + " canvas_div.style.height = height + 'px';\n", + " }\n", + " };\n", + "\n", + " // Disable right mouse context menu.\n", + " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", + " event.preventDefault();\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 toolbar = document.createElement('div');\n", + " toolbar.classList = 'mpl-toolbar';\n", + " this.root.appendChild(toolbar);\n", + "\n", + " function on_click_closure(name) {\n", + " return function (_event) {\n", + " return fig.toolbar_button_onclick(name);\n", + " };\n", + " }\n", + "\n", + " function on_mouseover_closure(tooltip) {\n", + " return function (event) {\n", + " if (!event.currentTarget.disabled) {\n", + " return fig.toolbar_button_onmouseover(tooltip);\n", + " }\n", + " };\n", + " }\n", + "\n", + " fig.buttons = {};\n", + " var buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'mpl-button-group';\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", + " /* Instead of a spacer, we start a new button group. */\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + " buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'mpl-button-group';\n", + " continue;\n", + " }\n", + "\n", + " var button = (fig.buttons[name] = document.createElement('button'));\n", + " button.classList = 'mpl-widget';\n", + " button.setAttribute('role', 'button');\n", + " button.setAttribute('aria-disabled', 'false');\n", + " button.addEventListener('click', on_click_closure(method_name));\n", + " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", + "\n", + " var icon_img = document.createElement('img');\n", + " icon_img.src = '_images/' + image + '.png';\n", + " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", + " icon_img.alt = tooltip;\n", + " button.appendChild(icon_img);\n", + "\n", + " buttonGroup.appendChild(button);\n", + " }\n", + "\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + "\n", + " var fmt_picker = document.createElement('select');\n", + " fmt_picker.classList = 'mpl-widget';\n", + " toolbar.appendChild(fmt_picker);\n", + " this.format_dropdown = fmt_picker;\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = document.createElement('option');\n", + " option.selected = fmt === mpl.default_extension;\n", + " option.innerHTML = fmt;\n", + " fmt_picker.appendChild(option);\n", + " }\n", + "\n", + " var status_bar = document.createElement('span');\n", + " status_bar.classList = 'mpl-message';\n", + " toolbar.appendChild(status_bar);\n", + " this.message = status_bar;\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", + "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", + "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], msg['forward']);\n", + " fig.send_message('refresh', {});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", + " var x0 = msg['x0'] / fig.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", + " var x1 = msg['x1'] / fig.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / fig.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,\n", + " 0,\n", + " fig.canvas.width / fig.ratio,\n", + " fig.canvas.height / fig.ratio\n", + " );\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", + " 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.handle_history_buttons = function (fig, msg) {\n", + " for (var key in msg) {\n", + " if (!(key in fig.buttons)) {\n", + " continue;\n", + " }\n", + " fig.buttons[key].disabled = !msg[key];\n", + " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", + " if (msg['mode'] === 'PAN') {\n", + " fig.buttons['Pan'].classList.add('active');\n", + " fig.buttons['Zoom'].classList.remove('active');\n", + " } else if (msg['mode'] === 'ZOOM') {\n", + " fig.buttons['Pan'].classList.remove('active');\n", + " fig.buttons['Zoom'].classList.add('active');\n", + " } else {\n", + " fig.buttons['Pan'].classList.remove('active');\n", + " fig.buttons['Zoom'].classList.remove('active');\n", + " }\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", + " var img = evt.data;\n", + " if (img.type !== 'image/png') {\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", + " img.type = 'image/png';\n", + " }\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", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " img\n", + " );\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " } else if (\n", + " typeof evt.data === 'string' &&\n", + " evt.data.slice(0, 21) === 'data:image/png;base64'\n", + " ) {\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(\n", + " \"No handler for the '\" + msg_type + \"' message type: \",\n", + " msg\n", + " );\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(\n", + " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", + " e,\n", + " e.stack,\n", + " msg\n", + " );\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", + " }\n", + " if (e.target) {\n", + " targ = e.target;\n", + " } else if (e.srcElement) {\n", + " targ = e.srcElement;\n", + " }\n", + " if (targ.nodeType === 3) {\n", + " // defeat Safari bug\n", + " targ = targ.parentNode;\n", + " }\n", + "\n", + " // pageX,Y are the mouse positions relative to the document\n", + " var boundingRect = targ.getBoundingClientRect();\n", + " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", + " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\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", + " }\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", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * this.ratio;\n", + " var y = canvas_pos.y * this.ratio;\n", + "\n", + " this.send_message(name, {\n", + " x: x,\n", + " y: y,\n", + " button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event),\n", + " });\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", + " // Prevent repeat events\n", + " if (name === 'key_press') {\n", + " if (event.key === this._key) {\n", + " return;\n", + " } else {\n", + " this._key = event.key;\n", + " }\n", + " }\n", + " if (name === 'key_release') {\n", + " this._key = null;\n", + " }\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.key !== 'Control') {\n", + " value += 'ctrl+';\n", + " }\n", + " else if (event.altKey && event.key !== 'Alt') {\n", + " value += 'alt+';\n", + " }\n", + " else if (event.shiftKey && event.key !== 'Shift') {\n", + " value += 'shift+';\n", + " }\n", + "\n", + " value += 'k' + event.key;\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, { key: value, 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", + "\n", + "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", + "// prettier-ignore\n", + "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\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\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", + "\n", + "mpl.default_extension = \"png\";/* global mpl */\n", + "\n", + "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.binaryType = comm.kernel.ws.binaryType;\n", + " ws.readyState = comm.kernel.ws.readyState;\n", + " function updateReadyState(_event) {\n", + " if (comm.kernel.ws) {\n", + " ws.readyState = comm.kernel.ws.readyState;\n", + " } else {\n", + " ws.readyState = 3; // Closed state.\n", + " }\n", + " }\n", + " comm.kernel.ws.addEventListener('open', updateReadyState);\n", + " comm.kernel.ws.addEventListener('close', updateReadyState);\n", + " comm.kernel.ws.addEventListener('error', updateReadyState);\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", + " var data = msg['content']['data'];\n", + " if (data['blob'] !== undefined) {\n", + " data = {\n", + " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", + " };\n", + " }\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(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 = document.getElementById(id);\n", + " var ws_proxy = comm_websocket_adapter(comm);\n", + "\n", + " function ondownload(figure, _format) {\n", + " window.open(figure.canvas.toDataURL());\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\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;\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", + " fig.cell_info[0].output_area.element.on(\n", + " 'cleared',\n", + " { fig: fig },\n", + " fig._remove_fig_handler\n", + " );\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function (fig, msg) {\n", + " var width = fig.canvas.width / fig.ratio;\n", + " fig.cell_info[0].output_area.element.off(\n", + " 'cleared',\n", + " fig._remove_fig_handler\n", + " );\n", + " fig.resizeObserverInstance.unobserve(fig.canvas_div);\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.innerHTML =\n", + " '<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 / this.ratio;\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] =\n", + " '<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 () {\n", + " fig.push_to_output();\n", + " }, 1000);\n", + "};\n", + "\n", + "mpl.figure.prototype._init_toolbar = function () {\n", + " var fig = this;\n", + "\n", + " var toolbar = document.createElement('div');\n", + " toolbar.classList = 'btn-toolbar';\n", + " this.root.appendChild(toolbar);\n", + "\n", + " function on_click_closure(name) {\n", + " return function (_event) {\n", + " return fig.toolbar_button_onclick(name);\n", + " };\n", + " }\n", + "\n", + " function on_mouseover_closure(tooltip) {\n", + " return function (event) {\n", + " if (!event.currentTarget.disabled) {\n", + " return fig.toolbar_button_onmouseover(tooltip);\n", + " }\n", + " };\n", + " }\n", + "\n", + " fig.buttons = {};\n", + " var buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'btn-group';\n", + " var button;\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", + " /* Instead of a spacer, we start a new button group. */\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + " buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'btn-group';\n", + " continue;\n", + " }\n", + "\n", + " button = fig.buttons[name] = document.createElement('button');\n", + " button.classList = 'btn btn-default';\n", + " button.href = '#';\n", + " button.title = name;\n", + " button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n", + " button.addEventListener('click', on_click_closure(method_name));\n", + " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", + " buttonGroup.appendChild(button);\n", + " }\n", + "\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = document.createElement('span');\n", + " status_bar.classList = 'mpl-message pull-right';\n", + " toolbar.appendChild(status_bar);\n", + " this.message = status_bar;\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = document.createElement('div');\n", + " buttongrp.classList = 'btn-group inline pull-right';\n", + " button = document.createElement('button');\n", + " button.classList = 'btn btn-mini btn-primary';\n", + " button.href = '#';\n", + " button.title = 'Stop Interaction';\n", + " button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n", + " button.addEventListener('click', function (_evt) {\n", + " fig.handle_close(fig, {});\n", + " });\n", + " button.addEventListener(\n", + " 'mouseover',\n", + " on_mouseover_closure('Stop Interaction')\n", + " );\n", + " buttongrp.appendChild(button);\n", + " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", + " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", + "};\n", + "\n", + "mpl.figure.prototype._remove_fig_handler = function (event) {\n", + " var fig = event.data.fig;\n", + " if (event.target !== this) {\n", + " // Ignore bubbled events from children.\n", + " return;\n", + " }\n", + " fig.close_ws(fig, {});\n", + "};\n", + "\n", + "mpl.figure.prototype._root_extra_style = function (el) {\n", + " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", + "};\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function (el) {\n", + " // this is important to make the div 'focusable\n", + " el.setAttribute('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", + " } else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\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", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which === 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", + " fig.ondownload(fig, null);\n", + "};\n", + "\n", + "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(\n", + " 'matplotlib',\n", + " mpl.mpl_figure_comm\n", + " );\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,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\" width=\"950\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "/* global mpl */\n", + "window.mpl = {};\n", + "\n", + "mpl.get_websocket_type = function () {\n", + " if (typeof WebSocket !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof MozWebSocket !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert(\n", + " '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", + "\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 = document.createElement('div');\n", + " this.root.setAttribute('style', 'display: inline-block');\n", + " this._root_extra_style(this.root);\n", + "\n", + " parent_element.appendChild(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 (fig.ratio !== 1) {\n", + " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.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 = document.createElement('div');\n", + " titlebar.classList =\n", + " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", + " var titletext = document.createElement('div');\n", + " titletext.classList = 'ui-dialog-title';\n", + " titletext.setAttribute(\n", + " 'style',\n", + " 'width: 100%; text-align: center; padding: 3px;'\n", + " );\n", + " titlebar.appendChild(titletext);\n", + " this.root.appendChild(titlebar);\n", + " this.header = titletext;\n", + "};\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", + "\n", + "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", + "\n", + "mpl.figure.prototype._init_canvas = function () {\n", + " var fig = this;\n", + "\n", + " var canvas_div = (this.canvas_div = document.createElement('div'));\n", + " canvas_div.setAttribute(\n", + " 'style',\n", + " 'border: 1px solid #ddd;' +\n", + " 'box-sizing: content-box;' +\n", + " 'clear: both;' +\n", + " 'min-height: 1px;' +\n", + " 'min-width: 1px;' +\n", + " 'outline: 0;' +\n", + " 'overflow: hidden;' +\n", + " 'position: relative;' +\n", + " 'resize: both;'\n", + " );\n", + "\n", + " function on_keyboard_event_closure(name) {\n", + " return function (event) {\n", + " return fig.key_event(event, name);\n", + " };\n", + " }\n", + "\n", + " canvas_div.addEventListener(\n", + " 'keydown',\n", + " on_keyboard_event_closure('key_press')\n", + " );\n", + " canvas_div.addEventListener(\n", + " 'keyup',\n", + " on_keyboard_event_closure('key_release')\n", + " );\n", + "\n", + " this._canvas_extra_style(canvas_div);\n", + " this.root.appendChild(canvas_div);\n", + "\n", + " var canvas = (this.canvas = document.createElement('canvas'));\n", + " canvas.classList.add('mpl-canvas');\n", + " canvas.setAttribute('style', 'box-sizing: content-box;');\n", + "\n", + " this.context = canvas.getContext('2d');\n", + "\n", + " var backingStore =\n", + " this.context.backingStorePixelRatio ||\n", + " this.context.webkitBackingStorePixelRatio ||\n", + " this.context.mozBackingStorePixelRatio ||\n", + " this.context.msBackingStorePixelRatio ||\n", + " this.context.oBackingStorePixelRatio ||\n", + " this.context.backingStorePixelRatio ||\n", + " 1;\n", + "\n", + " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", + " 'canvas'\n", + " ));\n", + " rubberband_canvas.setAttribute(\n", + " 'style',\n", + " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", + " );\n", + "\n", + " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", + " if (this.ResizeObserver === undefined) {\n", + " if (window.ResizeObserver !== undefined) {\n", + " this.ResizeObserver = window.ResizeObserver;\n", + " } else {\n", + " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", + " this.ResizeObserver = obs.ResizeObserver;\n", + " }\n", + " }\n", + "\n", + " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", + " var nentries = entries.length;\n", + " for (var i = 0; i < nentries; i++) {\n", + " var entry = entries[i];\n", + " var width, height;\n", + " if (entry.contentBoxSize) {\n", + " if (entry.contentBoxSize instanceof Array) {\n", + " // Chrome 84 implements new version of spec.\n", + " width = entry.contentBoxSize[0].inlineSize;\n", + " height = entry.contentBoxSize[0].blockSize;\n", + " } else {\n", + " // Firefox implements old version of spec.\n", + " width = entry.contentBoxSize.inlineSize;\n", + " height = entry.contentBoxSize.blockSize;\n", + " }\n", + " } else {\n", + " // Chrome <84 implements even older version of spec.\n", + " width = entry.contentRect.width;\n", + " height = entry.contentRect.height;\n", + " }\n", + "\n", + " // Keep the size of the canvas and rubber band canvas in sync with\n", + " // the canvas container.\n", + " if (entry.devicePixelContentBoxSize) {\n", + " // Chrome 84 implements new version of spec.\n", + " canvas.setAttribute(\n", + " 'width',\n", + " entry.devicePixelContentBoxSize[0].inlineSize\n", + " );\n", + " canvas.setAttribute(\n", + " 'height',\n", + " entry.devicePixelContentBoxSize[0].blockSize\n", + " );\n", + " } else {\n", + " canvas.setAttribute('width', width * fig.ratio);\n", + " canvas.setAttribute('height', height * fig.ratio);\n", + " }\n", + " canvas.setAttribute(\n", + " 'style',\n", + " 'width: ' + width + 'px; height: ' + height + 'px;'\n", + " );\n", + "\n", + " rubberband_canvas.setAttribute('width', width);\n", + " rubberband_canvas.setAttribute('height', height);\n", + "\n", + " // And update the size in Python. We ignore the initial 0/0 size\n", + " // that occurs as the element is placed into the DOM, which should\n", + " // otherwise not happen due to the minimum size styling.\n", + " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", + " fig.request_resize(width, height);\n", + " }\n", + " }\n", + " });\n", + " this.resizeObserverInstance.observe(canvas_div);\n", + "\n", + " function on_mouse_event_closure(name) {\n", + " return function (event) {\n", + " return fig.mouse_event(event, name);\n", + " };\n", + " }\n", + "\n", + " rubberband_canvas.addEventListener(\n", + " 'mousedown',\n", + " on_mouse_event_closure('button_press')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseup',\n", + " on_mouse_event_closure('button_release')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'dblclick',\n", + " on_mouse_event_closure('dblclick')\n", + " );\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband_canvas.addEventListener(\n", + " 'mousemove',\n", + " on_mouse_event_closure('motion_notify')\n", + " );\n", + "\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseenter',\n", + " on_mouse_event_closure('figure_enter')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseleave',\n", + " on_mouse_event_closure('figure_leave')\n", + " );\n", + "\n", + " canvas_div.addEventListener('wheel', function (event) {\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " on_mouse_event_closure('scroll')(event);\n", + " });\n", + "\n", + " canvas_div.appendChild(canvas);\n", + " canvas_div.appendChild(rubberband_canvas);\n", + "\n", + " this.rubberband_context = rubberband_canvas.getContext('2d');\n", + " this.rubberband_context.strokeStyle = '#000000';\n", + "\n", + " this._resize_canvas = function (width, height, forward) {\n", + " if (forward) {\n", + " canvas_div.style.width = width + 'px';\n", + " canvas_div.style.height = height + 'px';\n", + " }\n", + " };\n", + "\n", + " // Disable right mouse context menu.\n", + " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", + " event.preventDefault();\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 toolbar = document.createElement('div');\n", + " toolbar.classList = 'mpl-toolbar';\n", + " this.root.appendChild(toolbar);\n", + "\n", + " function on_click_closure(name) {\n", + " return function (_event) {\n", + " return fig.toolbar_button_onclick(name);\n", + " };\n", + " }\n", + "\n", + " function on_mouseover_closure(tooltip) {\n", + " return function (event) {\n", + " if (!event.currentTarget.disabled) {\n", + " return fig.toolbar_button_onmouseover(tooltip);\n", + " }\n", + " };\n", + " }\n", + "\n", + " fig.buttons = {};\n", + " var buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'mpl-button-group';\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", + " /* Instead of a spacer, we start a new button group. */\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + " buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'mpl-button-group';\n", + " continue;\n", + " }\n", + "\n", + " var button = (fig.buttons[name] = document.createElement('button'));\n", + " button.classList = 'mpl-widget';\n", + " button.setAttribute('role', 'button');\n", + " button.setAttribute('aria-disabled', 'false');\n", + " button.addEventListener('click', on_click_closure(method_name));\n", + " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", + "\n", + " var icon_img = document.createElement('img');\n", + " icon_img.src = '_images/' + image + '.png';\n", + " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", + " icon_img.alt = tooltip;\n", + " button.appendChild(icon_img);\n", + "\n", + " buttonGroup.appendChild(button);\n", + " }\n", + "\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + "\n", + " var fmt_picker = document.createElement('select');\n", + " fmt_picker.classList = 'mpl-widget';\n", + " toolbar.appendChild(fmt_picker);\n", + " this.format_dropdown = fmt_picker;\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = document.createElement('option');\n", + " option.selected = fmt === mpl.default_extension;\n", + " option.innerHTML = fmt;\n", + " fmt_picker.appendChild(option);\n", + " }\n", + "\n", + " var status_bar = document.createElement('span');\n", + " status_bar.classList = 'mpl-message';\n", + " toolbar.appendChild(status_bar);\n", + " this.message = status_bar;\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", + "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", + "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], msg['forward']);\n", + " fig.send_message('refresh', {});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", + " var x0 = msg['x0'] / fig.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", + " var x1 = msg['x1'] / fig.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / fig.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,\n", + " 0,\n", + " fig.canvas.width / fig.ratio,\n", + " fig.canvas.height / fig.ratio\n", + " );\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", + " 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.handle_history_buttons = function (fig, msg) {\n", + " for (var key in msg) {\n", + " if (!(key in fig.buttons)) {\n", + " continue;\n", + " }\n", + " fig.buttons[key].disabled = !msg[key];\n", + " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", + " if (msg['mode'] === 'PAN') {\n", + " fig.buttons['Pan'].classList.add('active');\n", + " fig.buttons['Zoom'].classList.remove('active');\n", + " } else if (msg['mode'] === 'ZOOM') {\n", + " fig.buttons['Pan'].classList.remove('active');\n", + " fig.buttons['Zoom'].classList.add('active');\n", + " } else {\n", + " fig.buttons['Pan'].classList.remove('active');\n", + " fig.buttons['Zoom'].classList.remove('active');\n", + " }\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", + " var img = evt.data;\n", + " if (img.type !== 'image/png') {\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", + " img.type = 'image/png';\n", + " }\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", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " img\n", + " );\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " } else if (\n", + " typeof evt.data === 'string' &&\n", + " evt.data.slice(0, 21) === 'data:image/png;base64'\n", + " ) {\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(\n", + " \"No handler for the '\" + msg_type + \"' message type: \",\n", + " msg\n", + " );\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(\n", + " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", + " e,\n", + " e.stack,\n", + " msg\n", + " );\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", + " }\n", + " if (e.target) {\n", + " targ = e.target;\n", + " } else if (e.srcElement) {\n", + " targ = e.srcElement;\n", + " }\n", + " if (targ.nodeType === 3) {\n", + " // defeat Safari bug\n", + " targ = targ.parentNode;\n", + " }\n", + "\n", + " // pageX,Y are the mouse positions relative to the document\n", + " var boundingRect = targ.getBoundingClientRect();\n", + " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", + " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\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", + " }\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", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * this.ratio;\n", + " var y = canvas_pos.y * this.ratio;\n", + "\n", + " this.send_message(name, {\n", + " x: x,\n", + " y: y,\n", + " button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event),\n", + " });\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", + " // Prevent repeat events\n", + " if (name === 'key_press') {\n", + " if (event.key === this._key) {\n", + " return;\n", + " } else {\n", + " this._key = event.key;\n", + " }\n", + " }\n", + " if (name === 'key_release') {\n", + " this._key = null;\n", + " }\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.key !== 'Control') {\n", + " value += 'ctrl+';\n", + " }\n", + " else if (event.altKey && event.key !== 'Alt') {\n", + " value += 'alt+';\n", + " }\n", + " else if (event.shiftKey && event.key !== 'Shift') {\n", + " value += 'shift+';\n", + " }\n", + "\n", + " value += 'k' + event.key;\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, { key: value, 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", + "\n", + "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", + "// prettier-ignore\n", + "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\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\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", + "\n", + "mpl.default_extension = \"png\";/* global mpl */\n", + "\n", + "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.binaryType = comm.kernel.ws.binaryType;\n", + " ws.readyState = comm.kernel.ws.readyState;\n", + " function updateReadyState(_event) {\n", + " if (comm.kernel.ws) {\n", + " ws.readyState = comm.kernel.ws.readyState;\n", + " } else {\n", + " ws.readyState = 3; // Closed state.\n", + " }\n", + " }\n", + " comm.kernel.ws.addEventListener('open', updateReadyState);\n", + " comm.kernel.ws.addEventListener('close', updateReadyState);\n", + " comm.kernel.ws.addEventListener('error', updateReadyState);\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", + " var data = msg['content']['data'];\n", + " if (data['blob'] !== undefined) {\n", + " data = {\n", + " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", + " };\n", + " }\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(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 = document.getElementById(id);\n", + " var ws_proxy = comm_websocket_adapter(comm);\n", + "\n", + " function ondownload(figure, _format) {\n", + " window.open(figure.canvas.toDataURL());\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\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;\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", + " fig.cell_info[0].output_area.element.on(\n", + " 'cleared',\n", + " { fig: fig },\n", + " fig._remove_fig_handler\n", + " );\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function (fig, msg) {\n", + " var width = fig.canvas.width / fig.ratio;\n", + " fig.cell_info[0].output_area.element.off(\n", + " 'cleared',\n", + " fig._remove_fig_handler\n", + " );\n", + " fig.resizeObserverInstance.unobserve(fig.canvas_div);\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.innerHTML =\n", + " '<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 / this.ratio;\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] =\n", + " '<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 () {\n", + " fig.push_to_output();\n", + " }, 1000);\n", + "};\n", + "\n", + "mpl.figure.prototype._init_toolbar = function () {\n", + " var fig = this;\n", + "\n", + " var toolbar = document.createElement('div');\n", + " toolbar.classList = 'btn-toolbar';\n", + " this.root.appendChild(toolbar);\n", + "\n", + " function on_click_closure(name) {\n", + " return function (_event) {\n", + " return fig.toolbar_button_onclick(name);\n", + " };\n", + " }\n", + "\n", + " function on_mouseover_closure(tooltip) {\n", + " return function (event) {\n", + " if (!event.currentTarget.disabled) {\n", + " return fig.toolbar_button_onmouseover(tooltip);\n", + " }\n", + " };\n", + " }\n", + "\n", + " fig.buttons = {};\n", + " var buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'btn-group';\n", + " var button;\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", + " /* Instead of a spacer, we start a new button group. */\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + " buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'btn-group';\n", + " continue;\n", + " }\n", + "\n", + " button = fig.buttons[name] = document.createElement('button');\n", + " button.classList = 'btn btn-default';\n", + " button.href = '#';\n", + " button.title = name;\n", + " button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n", + " button.addEventListener('click', on_click_closure(method_name));\n", + " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", + " buttonGroup.appendChild(button);\n", + " }\n", + "\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = document.createElement('span');\n", + " status_bar.classList = 'mpl-message pull-right';\n", + " toolbar.appendChild(status_bar);\n", + " this.message = status_bar;\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = document.createElement('div');\n", + " buttongrp.classList = 'btn-group inline pull-right';\n", + " button = document.createElement('button');\n", + " button.classList = 'btn btn-mini btn-primary';\n", + " button.href = '#';\n", + " button.title = 'Stop Interaction';\n", + " button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n", + " button.addEventListener('click', function (_evt) {\n", + " fig.handle_close(fig, {});\n", + " });\n", + " button.addEventListener(\n", + " 'mouseover',\n", + " on_mouseover_closure('Stop Interaction')\n", + " );\n", + " buttongrp.appendChild(button);\n", + " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", + " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", + "};\n", + "\n", + "mpl.figure.prototype._remove_fig_handler = function (event) {\n", + " var fig = event.data.fig;\n", + " if (event.target !== this) {\n", + " // Ignore bubbled events from children.\n", + " return;\n", + " }\n", + " fig.close_ws(fig, {});\n", + "};\n", + "\n", + "mpl.figure.prototype._root_extra_style = function (el) {\n", + " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", + "};\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function (el) {\n", + " // this is important to make the div 'focusable\n", + " el.setAttribute('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", + " } else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\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", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which === 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", + " fig.ondownload(fig, null);\n", + "};\n", + "\n", + "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(\n", + " 'matplotlib',\n", + " mpl.mpl_figure_comm\n", + " );\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA7YAAAH0CAYAAAAJ9bHWAAAgAElEQVR4nOzdfZyU8/7H8Wt3a3dLNyt0f59yhCKnRaJ+uSkOycHBiUpHualQdOMmxYk4PyJFhESljrvclNvcFDqFI+lXpDuVKDm1lWq33Zn374/vqbW625vZ/V6fmdfz8bj+2Gl25j3zuWZ932bmugIBAAAAAGBY4DsAAAAAAAAlQbEFAAAAAJhGsQUAAAAAmEaxBQAAAACYRrEFAAAAAJhGsQUAAAAAmEaxBQAAAACYRrEFAAAAAJhGsQUAAAAAmEaxBQAAAACYRrEFAAAAAJhGsQUAAAAAmEaxBQAAAACYRrEFAAAAAJhGsQUAAAAAmEaxBQAAAACYRrEFAAAAAJhGsQUAIKTuv/9+HXXUUYpEIge97rhx41SvXj1lZ2eXQTIAAMKFYgsAQAht2bJF1apV04QJEwpcHo1Gddddd2nOnDkFLt+5c6dq1Kih0aNHl2VMAABCgWILAEAIPfTQQ6pSpYp27txZ4PJvv/1WQRDon//8516/M2jQIDVo0EDRaLSsYgIAEAoUWwAAQqhFixa64oor9rp8ypQpCoJAy5Yt2+vfvvjiCwVBoPfff78sIgIAEBoUWwAAYmjixIk67rjjlJ6erlatWmnu3Lm65JJL1KJFi0LfxsqVKxUEgSZOnFjg8tatWysIggJb1apVC1ynWrVquuGGG2LyWAAAsIJiCwBAjNx7770KgkAXXnihxo8fr+uvv16HH364mjRpoq5duxb6diZPnqwgCPT1118XuPyll17Sscceq6ZNm2rSpEmaNGmS3njjjQLXOfPMM3XiiSfG5PEAAGAFxRYAgBj497//rZSUFN16660FLv/b3/6mIAg0cuTIQt/WHXfcoSAItG3btr3+rX79+urRo8d+f7d3796qUKFC4YMDABAHKLYAAMTARRddpLp162rXrl0FLp84caKCINCMGTMKfVvXXXedypUrt9flWVlZCoJAo0aN2u/vDh48WEEQaPv27YUPDwCAcRRbAABKKDs7WxUrVtTNN9+817+NHTtWQRBo9erVBS5v1qyZTjjhhH3e3v6K7Zw5cxQEgWbNmrXfLIMGDVIQBNqxY0cRHwUAAHZRbAEAKKHFixcrCAI999xze/3bgAEDVKVKlQKXzZ8/X82bN1fdunW1ZMmSvX5n90eRt27dWuDy3SV548aN+83Sq1cvVaxYsZiPBAAAmyi2AACU0O7T7EyePLnA5dnZ2apVq5batGlT4PJ+/frp7rvv1oABA/b6Tq6Uf/CohQsXFri8d+/eqlWr1gGzcPAoAEAiotgCAFBCGzduVBAEuvbaawtcPnz4cAVBoN69e++5LDc3V9WrV9e3336r+fPnq0GDBopGowV+b8WKFQqCQE8//XSByzt16qTWrVsfMEu1atXUr1+/Ej4iAABsodgCABADnTp1UnJysvr27avx48frL3/5i5o0aaIgCDRmzJg915s5c6Zatmy55+dGjRpp9uzZe93escceq8svv7zAZdddd51SU1N1//33a9KkSfriiy8K/Pvud44P9B1cAADiEcUWAIAY2LBhg7p06aIqVaqoVq1auvHGGzV9+nQFQaB58+btud7ll1+ue++9d8/PgwcPVq9evfa6vVGjRqlSpUoFDgK1bt06dezYUZUqVVIQBHrkkUcK/M7gwYNVv379vd4BBgAg3lFsAQAoJX369NHhhx+u3NxcSdK2bdt0yCGHaPny5Xuus2DBAh166KHKzs4u8LtZWVmqVq2annrqqULdV3Z2tmrWrKmHH344dg8AAAAjKLYAAJRQdnb2Xu+Szp49W+XKldMdd9yx57Jnn31Wxx9/vHbu3FlgO/LII/Xyyy/vdbv33XefjjrqKEUikYNmGDdunOrVq7dXQQYAIBFQbAEAKKHXXntNJ554okaOHKlx48apV69eKleunFq3bl3go8RnnXWWgiDY53bhhRd6fAQAANhGsQUAoIQ+/vhjnXLKKapatarKly+vpk2b6vbbb9evv/7qOxoAAAmBYgsAAAAAMI1iCwAAAAAwjWILAAAAADCNYispEolo7dq1ysrK0pYtW9jY2NjY2NjY2NjY2BJuy8rK0tq1awt1NP6wodhKWrt27X6PUsnGxsbGxsbGxsbGxpZI29q1a31XtCKj2ErKysraM0Df/5eEjY2NjY2NjY2NjY3Nx7b7Db+srCzfFa3IKLaStmzZoiAItGXLFt9RAAAAAMALy72IYivbAwQAAACAWLDciyi2sj1AAAAAAIgFy72IYivbAwQAAACAWLDciyi2sj1AAAAAAIgFy72IYivbAwQAAACAWLDciyi2sj1AAAAAAIgFy72IYivbAwQAAACAWLDciyi2sj1AAAAAAIgF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AACIO5Z7UbG/Y7tjxw69+OKLuvHGG9WlSxd17NhRXbt21QMPPLDPc9uGmeUB4nd2f0w0NVXats13GsSrbdukSpXcvvbRR77TAAAAxITlXsTBo2R7gPidf/zDlY2OHX0nQbzr1cvta1dc4TsJAABATFjuRaVabDds2KBHH320NO8iJiwPEL9z2mmubIwZ4zsJ4t38+W5fS0+XNm3ynQYAAKDELPeimBfb//znPxo/frw6dOigunXrqmLFirG+i5izPED8xi+/SMnJrmx8/73vNIh30ajUooXb30aN8p0GAACgxCz3opgU26ysLD3zzDPq2LGj6tWrp379+mn27NmKRCJq2LBhLO6iVFkeIH5j8mRXMo47zncSJIrHH3f7XNOmnFoKAACYZ7kXxaTYpqamqnXr1po9e7aivztCaKNGjWJxF6XK8gDxG5de6krGrbf6ToJEsW2bVKWK2+/efdd3GgAAgBKx3ItiUmwnTpyoc889V40aNdKNN96oTz75ZM+/UWxRJnbtkqpWdQVj7lzfaZBI+vVz+12XLr6TAAAAlIjlXhTT79hu2rRJTz31lM466yzVr19f/fr10xFHHBHLuygVlgeI//rgA1cujjhCysvznQaJZPcpppKTpdWrfacBAAAoNsu9qETFdvHixYrs53tlGzZs0GOPPab27duX5C7KhOUB4r/693flont330mQiP7nf9z+d/vtvpMAAAAUm+VeVKJim5SUpAoVKujEE09Uz549NXr0aH300UfavHlzrPKVCcsDxH81a+aKxUsv+U6CRPTSS27/q15dysnxnQYAAKBYLPeiEhXbOXPmqEaNGurcubMuueQSHXvssUpKSlJycrKaNWumO+64o9gld+zYsWrQoIHS0tKUmZmp+fPnF+r3pk6dqiAIdMEFFxT6viwPEJJWrHClolw5iRnCh127pNq13X44darvNAAAAMViuReVqNiecMIJeuWVVwpcNmvWLDVp0kR33323Tj/9dDVs2FA///xzkW532rRpSk1N1YQJE7R48WL16tVLGRkZ2rBhwwF/b9WqVapTp45OO+00im0iGTvWFYp27XwnQSIbPtzth23b+k4CAABQLJZ7UYmKbYUKFbR06dK9Ln/99dd10UUXKRqN6uKLL9bVV19dpNvNzMxUnz599vwciURUu3ZtjRw5cr+/k5eXpzZt2uipp55S9+7dKbaJ5LzzXKE4wP4BlLp169ynBoJAWrjQdxoAAIAis9yLSlRs27ZtqzvvvHOvy1euXKnKlStLkubPn6+GDRsW+jZzcnKUkpKi6dOnF7i8W7du6ty5835/784771SX/55u42DFNjs7W1u2bNmzrV271uwAE97OnVLFiq5MfPWV7zRIdJdc4vbFa67xnQQAAKDIErbYzps3T5UqVdIVV1yhb775RpIrpv369VODBg0kuZJboUKFQt/munXrFASB5v7uXKQDBw5UZmbmPn/n448/Vp06dbRx40ZJBy+2w4YNUxAEe20WB5jw3n3XFYlataRo1HcaJLqPPnL7Y4UK0i+/+E4DAABQJAlbbCVp0aJF6tChg5KSkpSenq5y5copPT1dU/97AJWXX35ZTZo0KfTtFbXYbt26VQ0bNtSbb7655zLesU0gu0/zc9VVvpMA7n+unHCC2yfvvdd3GgAAgCJJ6GK72+rVq/Xaa69pxowZ+umnn/ZcPmfOHL344ouFvp2ifhR5wYIFCoJAKSkpe7akpCQlJSUpJSVFy5cvP+h9Wh5gwjv6aFciXnjBdxLAee45t0/Wrs2pfwAAgCmWe1HMim0sZWZmqm/fvnt+jkQiqlOnzj4PHrVz504tWrSowHbBBReoQ4cOWrRokXIKsbC0PMCE9v33rkCkpEjGzp2MOJaT4z4aHwTSpEm+0wAAABSa5V4UymI7bdo0paWlaeLEiVqyZIl69+6tjIwMrV+/XpJ05ZVXasiQIfv9fY6KnCDGjeP0KginESPcvtmqFd/9BgAAZljuRaEstpI0ZswY1a9fX6mpqcrMzNS8efP2/Fu7du3UvXv3/f4uxTZBXHCBKw8jRvhOAhS0caOUnu72z9mzfacBAAAoFMu9KLTFtixZHmDCysmRKlVyxeHf//adBthb795u//zvacgAAADCznIvotjK9gAT1vvvu9JQo4YUifhOA+xtyRK3jyYlSYU4iB0AAIBvlnsRxVa2B5iwBg50peEAH0kHvOvUye2nN9zgOwkAAMBBWe5FFFvZHmDCatnSFYbnn/edBNi/d95x+2mlShy5GwAAhJ7lXkSxle0BJqT1611ZCAJpwwbfaYD9i0alY45x++o+TlcGAAAQJpZ7EcVWtgeYkKZMcUXh+ON9JwEO7tln878PvmOH7zQAAAD7ZbkXUWxle4AJqUcPVxQGDvSdBDi4Xbuk+vXdPvvYY77TAAAA7JflXkSxle0BJpxoVKpTx5WEd9/1nQYonEcecftso0ZSbq7vNAAAAPtkuRdRbGV7gAln9ylU0tL4WCfs2L5dOvxwt+9OmeI7DQAAwD5Z7kUUW9keYMIZPdqVgzPP9J0EKJq//93tu8cd5z55AAAAEDKWexHFVrYHmHDOO8+Vg/vv950EKJpNm9xpf4JAmjHDdxoAAIC9WO5FFFvZHmBC2bUrvxh8+aXvNEDR3XKL239PPdV3EgAAgL1Y7kUUW9keYEKZM8eVgiOOkCIR32mAolu3TkpNdfvxxx/7TgMAAFCA5V5EsZXtASaUoUNdIbjsMt9JgOLr1cvtx+ec4zsJAABAAZZ7EcVWtgeYUE4+2RWCp5/2nQQovmXLpJQUty9/9pnvNAAAAHtY7kUUW9keYMLYvFlKTnZlYM0a32mAkune3e3L557rOwkAAMAelnsRxVa2B5gwXnnFFYGjjvKdBCi5375rO3++7zQAAACSbPciiq1sDzBh9OnjSkCfPr6TALHBu7YAACBkLPciiq1sDzBhNG/uSsDLL/tOAsTGb9+1nTfPdxoAAADTvYhiK9sDTAg//eQW/0lJ0i+/+E4DxE6PHhwhGQAAhIblXkSxle0BJoSpU93i//jjfScBYmv5ct61BQAAoWG5F1FsZXuACWH3eT/79/edBIi9q65y+3enTr6TAACABGe5F1FsZXuACeHII93C/403fCcBYu+379rOnes7DQAASGCWexHFVrYHGPfWrHEL/uRkKSvLdxqgdPTs6fbz9u2laNR3GgAAkKAs9yKKrWwPMO49+6xb8Gdm+k4ClJ7Vq6XUVLevv/227zQAACBBWe5FFFvZHmDc232uz8GDfScBSlf//vkHSYtEfKcBAAAJyHIvotjK9gDjWjQq1a/vFvvvvOM7DVC6Nm6UqlRx+/vzz/tOAwAAEpDlXkSxle0BxrXly90iv3x56ddffacBSt/f/+72+caNpZwc32kAAECCsdyLKLayPcC49uSTbpHftq3vJEDZ2LZNqlHD7fePPuo7DQAASDCWexHFVrYHGNf++le3wB861HcSoOyMHev2+xo1XNEFAAAoI5Z7EcVWtgcYt6JRqWZNt8D/8EPfaYCyk5PjPoocBO6jyQAAAGXEci+i2Mr2AOPWN9+4hX1amrRzp+80QNmaMsXt/5UrS+vX+04DAAAShOVeRLGV7QHGrccfdwv79u19JwHKXiQitWrlXgO9e/tOAwAAEoTlXkSxle0Bxq3d368dNsx3EsCPOXPcayA5WVq40HcaAACQACz3IoqtbA8wLkWjUp06blH//vu+0wD+XHyxex2ccYZ7XQAAAJQiy72IYivbA4xLK1e6xXy5ctL27b7TAP6sXCmlprrXw+uv+04DAADinOVeRLGV7QHGpYkT3UL+lFN8JwH8GzzYvR6aNnVHTAYAACgllnsRxVa2BxiXevZ0C/nBg30nAfzbskWqXt29Jh56yHcaAAAQxyz3IoqtbA8wLh15pFvEz5zpOwkQDk8+6V4TGRnSL7/4TgMAAOKU5V5EsZXtAcaddevcAj4pScrK8p0GCIe8PKllS/fauPZa32kAAECcstyLKLayPcC4M22aW7yfcILvJEC4fPRR/v/0+fxz32kAAEAcstyLKLayPcC4c/31bvF+002+kwDh07Wre320bu3exQUAAIghy72IYivbA4w7xxzjFu6vvOI7CRA+P/0kVaniXiOPP+47DQAAiDOWexHFVrYHGFc2bnQL9iCQfv7ZdxognEaPdq+RQw/ldQIAAGLKci+i2Mr2AOPK9Oluwd68ue8kQHjl5krHH+9eKz17+k4DAADiiOVeRLGV7QHGlf79OeorUBhz5+Z/uuHTT32nAQAAccJyL6LYyvYA48qJJ7qF+vPP+04ChF/Pnu710rKlexcXAACghCz3IoqtbA8wbmzdKiUnu4X62rW+0wDht3GjVK2ae83cf7/vNAAAIA5Y7kUUW9keYNx49123QG/Y0HcSwI5nnnGvm/R06bvvfKcBAADGWe5FFFvZHmDcGDbMLdC7dvWdBLAjGpXOOsu9dtq1kyIR34kAAIBhlnsRxVa2Bxg3zjzTLc4fe8x3EsCWlSulihXd6+eJJ3ynAQAAhlnuRRRb2R5gXMjNlSpVcgvzhQt9pwHsGTXKvX6qVJF++MF3GgAAYJTlXkSxle0BxoUvv8xflOfl+U4D2JOXJ2VmutfRBRe4jygDAAAUkeVeRLGV7QHGhTFj3IK8Y0ffSQC7Fi2Sypd3r6UXXvCdBgAAGGS5F1FsZXuAceGyy9xi/K67fCcBbLvzTvdaOvxwaf1632kAAIAxlnsRxVa2BxgX6tVzi/FZs3wnAWzLyZFatnSvp/PP5yPJAACgSCz3IoqtbA/QvDVr3CI8JUXats13GsC+hQul1FT3upowwXcaAABgiOVeRLGV7QGaN3WqW4C3auU7CRA/7r/fva4qV5ZWrfKdBgAAGGG5F1FsZXuA5vXt6xbg/fr5TgLEj7w86dRT3WurXTspEvGdCAAAGGC5F1FsZXuA5p1wglt8T5vmOwkQX5Yvlw45xL2+Ro3ynQYAABhguRdRbGV7gKZt3SolJ7uF99q1vtMA8eeJJ9zrKy3NnQ4IAADgACz3IoqtbA/QtFmz3KK7fn3fSYD4FI1K557rXmfNm0vbt/tOBAAAQsxyL6LYyvYATbvrLrfgvvxy30mA+LVhg1Szpnut9e7tOw0AAAgxy72IYivbAzTt7LPdYnvsWN9JgPj23ntSUpJ7vb3wgu80AAAgpCz3IoqtbA/QrEhEqlLFLbS//NJ3GiD+3Xqre71VrcopgAAAwD5Z7kUUW9keoFmLF7tFdsWKUm6u7zRA/Nu1Szr5ZPe6O/lk9zMAAMBvWO5FFFvZHqBZTz+df45NAGVj1Sr3jm0QSEOG+E4DAABCxnIvotjK9gDN6tXLLa4HD/adBEgsL77oXntBIL32mu80AAAgRCz3IoqtbA/QrOOOcwvr6dN9JwESzw035H/fdtky32kAAEBIWO5FFFvZHqBJW7fmH6H1xx99pwEST06O1KaNew22aMH5bQEAgCTbvYhiK9sDNOn9992CukED30mAxLVunVSjhnstXnGFFI36TgQAADyz3IsotrI9QJPuucctpi+91HcSILF99JGUkuJej48+6jsNAADwzHIvotjK9gBNOv98t5B+6CHfSQA88IB7PZYvL336qe80AADAI8u9iGIr2wM0JxqVqld3C+m5c32nARCNSpdc4l6T1atLq1f7TgQAADyx3ItCW2zHjh2rBg0aKC0tTZmZmZo/f/5+rzt+/Hi1bdtWGRkZysjI0BlnnHHA6/+e5QGas3Jl/rtDO3f6TgNAkrZtk1q2dK/Nli3dzwAAIOFY7kWhLLbTpk1TamqqJkyYoMWLF6tXr17KyMjQhg0b9nn9v/71r3r00Ue1YMECffPNN+rRo4eqVq2qH374oVD3Z3mA5jz/vFs8Z2b6TgLgt1avzv80xYUXSpGI70QAAKCMWe5FoSy2mZmZ6tOnz56fI5GIateurZEjRxbq9/Py8lS5cmU9++yzhbq+5QGas/v8mTfc4DsJgN+bO1dKTXWv0dtv950GAACUMcu9KHTFNicnRykpKZo+fXqBy7t166bOnTsX6ja2bt2q9PR0vfHGG4W6vuUBmpOZ6RbNzz/vOwmAfXn2WfcaDQJpyhTfaQAAQBmy3ItCV2zXrVunIAg093cHFho4cKAyC/nx1euuu06NGzfWzv18hzM7O1tbtmzZs61du9bsAE3ZudN9tzYI3HdtAYTToEHudZqWJs2Z4zsNAAAoIxTbGCppsR05cqQOPfRQLVy4cL/XGTZsmIIg2GuzOEBT5s7NP/JqNOo7DYD9ycuTunRxr9dDD5WWLPGdCAAAlAGKbQyV5KPI//u//6uqVavq888/P+D1eMfWk1Gj3EK5kB8pB+DR9u3SySe712yDBtKPP/pOBAAAShnFNsYyMzPVt2/fPT9HIhHVqVPngAePuv/++1WlShX961//KvL9WR6gKZde6hbJ99zjOwmAwti4UWra1L1ujz9e2rrVdyIAAFCKLPeiUBbbadOmKS0tTRMnTtSSJUvUu3dvZWRkaP369ZKkK6+8UkOGDNlz/fvuu0+pqal66aWX9NNPP+3ZthXyXIyWB2hKo0ZugTxrlu8kAAprxYr80wCdfba0a5fvRAAAoJRY7kWhLLaSNGbMGNWvX1+pqanKzMzUvHnz9vxbu3bt1L179z0/N2jQYJ/fmR02bFih7svyAM3YuDH/SKubN/tOA6AoPvtMqljRvX67duUctwAAxCnLvSi0xbYsWR6gGW+95RbFzZr5TgKgOGbOlMqVc6/ja6/lAHAAAMQhy72IYivbAzTj7rvz3+0BYNPUqVJSknstDx7sOw0AAIgxy72IYivbAzTj/PPdYvjhh30nAVASTzyR/7WCe+/1nQYAAMSQ5V5EsZXtAZoQjUo1a7qF8Kef+k4DoKQeeCC/3I4d6zsNAACIEcu9iGIr2wM0Ye1atwBOSXHnxgRg39Ch+eV2/HjfaQAAQAxY7kUUW9keoAkvv+wWvy1b+k4CIFaiUal///xy+8QTvhMBAIASstyLKLayPUAThgxxC9+rr/adBEAs/b7cPv6470QAAKAELPciiq1sD9CEM87gHR0gXkWj0oABlFsAAOKA5V5EsZXtAYZeJCJVreoWvF9+6TsNgNIQjUo335xfbh991HciAABQDJZ7EcVWtgcYekuXuoVuerq0a5fvNABKy+/L7ciRvhMBAIAistyLKLayPcDQmzzZLXJPPtl3EgClLRoteLTkwYPdZQAAwATLvYhiK9sDDL0bb3QL3H79fCcBUFZ+e57ba66R8vJ8JwIAAIVguRdRbGV7gKHXpo1b3D73nO8kAMrSU09Jycnu9X/ZZVJOju9EAADgICz3IoqtbA8w1HJzpQoV3ML2m298pwFQ1l54QSpf3v0N6NBB2rzZdyIAAHAAlnsRxVa2BxhqX33lFrRVqrijIwNIPO+8I1Wq5P4WHHOMtHq170QAAGA/LPciiq1sDzDUnnzSLWb/5398JwHg04IFUq1a7u9BrVqc+gsAgJCy3IsotrI9wFC79lq3kB040HcSAL6tXu3esQ0C9w7uW2/5TgQAAH7Hci+i2Mr2AEOtdWu3iJ02zXcSAGGwebP7rm0QSCkp0rhxvhMBAIDfsNyLKLayPcDQ2rVLSktzC9hly3ynARAWOTlSt275pwO69lqOmAwAQEhY7kUUW9keYGgtXMiBowDsWzQq3XuvlJTk/k60bStt2OA7FQAACc9yL6LYyvYAQ2vCBLdgbdfOdxIAYTVjhvufX0Eg1asn/fvfvhMBAJDQLPciiq1sDzC0+vZ1i9UBA3wnARBm33wjNWvm/l5UqCBNmeI7EQAACctyL6LYyvYAQ6tNG7dQnTzZdxIAYbd5s3TOOfnfu73uOmnnTt+pAABIOJZ7EcVWtgcYSnl5UsWKboG6ZInvNAAsyMuTbrstv9y2aiUtX+47FQAACcVyL6LYyvYAQ2nxYrcwPeQQt1gFgMJ66y3psMPyDz730ku+EwEAkDAs9yKKrWwPMJQmTXKL0lNP9Z0EgEVr17q/H7vfvb3hBik723cqAADinuVeRLGV7QGGUv/+bjHar5/vJACs2rVLGjQov9y2aCF9/bXvVAAAxDXLvYhiK9sDDKXTT3cL0YkTfScBYN2MGdIRR7i/Kamp0oMPcm5sAABKieVeRLGV7QGGTiQiVa7sFqG8uwIgFtavl847L//d2w4d3MeVAQBATFnuRRRb2R5g6Hz3nVt4pqdLubm+0wCIF9Go9Pjj+Udcz8hw3+ePRn0nAwAgbljuRRRb2R5g6Eyd6hadJ53kOwmAeLR0qdS6df67t3/6k7Rmje9UAADEBcu9iGIr2wMMnYED3WLzuut8JwEQr3btkkaMcN+5DQL39YfHH+e7twAAlJDlXkSxle0Bhs4ZZ7iF5pNP+k4CIN4tXiydfHL+u7ft20vLlvlOBQCAWZZ7EcVWtgcYKtGodOihboH55Ze+0wBIBHl50sMP53/3Ni1NGj5c2rnTdzIAAMyx3IsotrI9wFBZudItLMuXl3JyfKcBkEhWrJDOPDP/3dsmTaQ33/SdCgAAUyz3IoqtbA8wVF5+2S0oTzjBdxIAiSgalaZNk2rXzi+4F14orV7tOxkAACZY7kUUW9keYKgMHeoWkj17+k4CIJFt3SrdfLOUkuL+JlWoIN15p7Rtm+9kAACEmuVeRLGV7QGGJviQowAAGNNJREFUyvnnu0XkI4/4TgIA0qJF0umn5797W6uW9PTT7nu5AABgL5Z7EcVWtgcYKvXqucXjnDm+kwCAE41KL74oNW6cX3BbtJDee893MgAAQsdyL6LYyvYAQ+OXX/IXjVlZvtMAQEHZ2dIDD0gZGfl/q/70J2nhQt/JAAAIDcu9iGIr2wMMjfffdwvFxo19JwGA/fvlF+mGG6Ry5fIL7qWXSt984zsZAADeWe5FFFvZHmBojBqVfwRSAAi7pUtdod1dbpOTpW7dpOXLfScDAMAby72IYivbAwyNbt3c4vCuu3wnAYDCW7hQuuCC/IJbrpzUq5c7LzcAAAnGci+i2Mr2AEOjRQu3KHztNd9JAKDoPvtM6tQpv+CmpEhdu7ojKwMAkCAs9yKKrWwPMBSys/O/r7Z6te80AFB8n3winX12fsENAncqs7lzfScDAKDUWe5FFFvZHmAofPmlW/xlZLhTawCAdV98IV18sZSUlF9w27WTZsyQIhHf6QAAKBWWexHFVrYHGArPPOMWfe3b+04CALH17bdSz55S+fL5BbdpU+mRR6StW32nAwAgpiz3IoqtbA8wFG680S32brrJdxIAKB1r1kg33yxVrZpfcKtUcX/3VqzwnQ4AgJiw3IsotrI9wFBo184t8iZO9J0EAErXtm3So49KzZrlF9ykJOlPf3IHz8vN9Z0QAIBis9yLKLayPUDvotH8dzC++sp3GgAoG5GI9OabUseOBQ80Vbu2dMcd0qpVvhMCAFBklnsRxVa2B+jd99+7xVz58lJOju80AFD2vv1WuuUW6fDDC76L26mT9PLL/G0EAJhhuRdRbGV7gN69+qpbxLVs6TsJAPiVnS3985/SGWcUfBf3sMOk66+X/vUvjhwPAAg1y72IYivbA/Ru+HC3cOve3XcSAAiP5culIUOkmjULltwjj3R/N5cv950QAIC9WO5FFFvZHqB3Xbq4xdpDD/lOAgDhk5srvf22dMUVUsWKBUvuKadIDz/sjrgMAEAIWO5FFFvZHqB3DRu6BdqHH/pOAgDhtm2bNGmSdPbZUnJywZJ78snSgw+64xYAAOCJ5V5EsZXtAXqVlZW/KNu0yXcaALDjxx/du7WnneYONPXbktu6tXTffdKSJXwnFwBQpiz3IoqtbA/Qq48/douwunV9JwEAu9atk8aOldq33/ud3MaNpRtukN57j6MrAwBKneVeRLGV7QF69eijbuF17rm+kwBAfFi/Xho3zp0qKDW1YMmtXFm66CLpmWfc9QAAiDHLvYhiK9sD9Oraa91ia8gQ30kAIP5s2yZNny797W9SjRoFS24QSMcdJw0YIL31lvTrr77TAgDigOVeRLGV7QF6deqpbnE1ZYrvJAAQ3yIR6bPPpDvvlFq12rvkpqa6jzLfc480f747GjMAAEVkuRdRbGV7gN5Eo1KVKm5B9fXXvtMAQGL5+Wdp6lT3bm79+nsX3UqV3NGXR4yQZs+Wdu70nRgAYIDlXkSxle0BevP9927xVL48BzQBAJ+iUWnpUnfcgy5dpKpV9/2Obtu20q23Sm++6Y5qDwDA71juRRRb2R6gN2+8kf8dLwBAeOTlSV99JY0ZI11yiVSz5t5FNwikP/xB6t5deuwx6YsvpF27fCcHAHhmuRdRbGV7gN7cc49bGP31r76TAAAOJBqVli2Tnn5a6tFDatJk30U3PV1q00bq3999zPnbb913ewEACcNyL6LYyvYAvbnsMrcQuu8+30kAAEX188/SjBnS0KHuu7gZGfsuu4ccIp1yinT99dL48dLnn/N9XQCIY5Z7EcVWtgfozTHHuEXPzJm+kwAASioScd/Tfe45qU8f6aSTpAoV9l12U1KkY4+VrrjC/c/N11+XVqzg3V0AiAOWexHFVrYH6EV2tlvYBIG0Zo3vNACA0pCXJy1Z4k7pNnCgdOaZ0mGH7bvsBoErwq1aucI7cqT02mvS8uXudgAAJljuRRRb2R6gF1995RYxGRnuu1sAgMQQjUpr17oDCI4YIV1+udSypZSWtv/Cm57uPuXTpYsryOPHSx9+KP3wA/8NAYCQsdyLKLayPUAvJk1yi5XTTvOdBAAQBrm57qPM06e7wvvXvx688AaBVLGi1KKF9Oc/S4MHS08+Kb33njvYVXa270cFAAnHci+i2Mr2AL0YNMgtSK6/3ncSAECY5eW5jyO/9Zb0yCNSv35Sp07uyMy7v9Kyvy0pSapd2x2p+fLL3Tl4n3hCevttd8TmHTt8PzoAiDuWexHFVrYH6EWnTm7R8fjjvpMAAKzatUv67jt3EMKHH3YHrTr3XKl5c/dO7oFK7+7tsMPcO77nnCNdfbU0bJj7qPOMGdKCBe7oz3zcGQAKzXIvotjK9gC9qFPHLSg+/dR3EgBAPIpGpY0b3emFXnxR+t//dcX3vPPcEZkrVSpc8Q0CKTVVathQOvVU6aKL3KeNhg+Xxo2TXn5Z+uQTV7C3bKEEA0h4lnvR/7d378FVVecbxzfmclKKEglESCAHKIjWSLEyB1BbWqi1Cg2Do7QWDVYKSoMSreCF21QNOEhVJoijo4AgJo0d4i12qK1CaYCgJSHcBASUYwxQwYQAJjUnz++Pd5r+oqiJOWZn1e9n5v2DzdG8OXuFnGevtdcm2MrtE9jmjh7974cF3i8AgB8aGuz3UXm5LXN+6inp97+XJk+WRo2SBg2SunVrfvj9/xtdpaVJgwfb/+emm+ze3wULpKefll54Qfr736UdO6TKSqmuzu93AgCiyuVcRLCV2yewza1da7/8e/f2uxMAAL5Yba104ICtMCookHJzpVmzLACPGSMNGyb17duyGeBP15lnSsGgPeroJz+RfvELacoU+zoLF9qGWAUF0po10qZN0q5d0gcf2D3CzBADaGdczkUEW7l9Attcbq79Iv/5z/3uBACA6DlxQtq/38Lniy9aIH3gAem22+zZvFdeKQ0ZIvXrJ3XpYptbfdUw/J+Ki5O6drXNtL7/fenHP7bAnZlpG23NnGnPBM7NlZYts2XZf/6ztH693UO8d6/NHB8/LkUifr+DAP4HuJyL2m2wXbx4sYLBoAKBgEKhkEpKSr7w9QUFBRowYIACgYDS09NVVFTU7K/l8glsc5Mn2y/je+/1uxMAAPxTX2/LoffssTBcVCStWGEbYc2ebffyjh9vS5ovu0y68EJb5ty5c3RC8ec9Pik52WahBw60HaV/+lNp7Fh7BNPEidLUqfY84TlzLDQ/+qjtNr1ihQXnoiLp9deljRvtufW7d0sHD9o9zydOEKCB/3Eu56J2GWzz8/MVHx+vpUuXaseOHZo0aZISExN1+PDh076+uLhYMTExWrBggXbu3KlZs2YpLi5O27Zta9bXc/kEtrmhQ+2XZ36+350AAOCmSMT2qTh4UNq2zTawKiqSnnvONrV68EF7vNHUqdKvfy1de63NGP/gB9JFF0n9+0s9etgy6K8rJH/ZhlxnnWX3MaemWpA+/3x7dnEoZH2OHGm7XI8da8uzMzOlSZNsE7A77rDvb+5cad486Q9/kBYvth2tn3nGPmOsXi299JLNUP/1r3YrVHGxVFIibdli79uuXfY4qffekyoqbBfsY8ekmhpbhl5f7/eZBpzjci5ql8E2FAopKyur8c+RSEQpKSmaP3/+aV8/btw4jRo1qsmxIUOG6Oabb27W13P5BLapo0elQMB+qe3a5Xc3AACgoUE6eVI6fNiWUpeXSxs2SH/5i4XDFSssLD/8sJSTY8ub77jD7gO+8UYLnRkZ0uWX28zyxRfbI5f69JG6d7cZ5ri4tg/P0aoOHSyId+xo30tSkn1fvXrZ93juudIFF1gov/hiC+bDhtl7MXy4NGKEvTc/+5nNvmdkWFi/5hp77371K+mGG+y9nDjRVrZNmWIXJaZNs/d6+nTp7rvtvZ8zxzY6e+ABmzFfsMCC/aOP2pLzJUtsBv2pp6SlS6Xly+0crlwprVol5eVZ8C8okP70J9vZu7DQls+//LI96urVV+15z2vWSK+9Jv3tbzYLv3atbX62fr1dJNi40S4UbN4svfWWXTAoLZW2brULB9u3Szt32nOjd++2pe/79tl96+++axdm3n/fLipUVtoYPHJE+vBD+8x47Jj00UdSVZVVdbUtm6+psTpxwsbuqVPSxx9b1dbapmz//rfVJ5/YBYpIxIr70r92Lueidhds6+rqFBMTo8LCwibHMzMzlZGRcdr/plevXnrkkUeaHJszZ44GDhx42tfX1taqurq6scLhcPs8gUuX2kYU7aW+9z37JTFoEP+wAADwTVJfb2HkyBGbId2zx8LPP/9pQfqNNyxIvfSSLWletco+xzz+uLRokQW4+++3ZdozZljomzLFdp4eP96CYkaGdMUV0o9+ZMuoQyGbob7wQum88+xe5GBQSkmxJddnn20bfyUkSDEx/odoyp8LF2ecYec/NtYqLs4uZgQCVgkJ0re+ZRc3OnaUvv1tGzdnnmkrD846yy56JCbamDr7bLuPPinJ7oHv2tVWJyQnS+ecY9W9u62aSEmxVQupqVLPnnbBJC3NKhi0zVb79LHq29fG8He+Y/fq9+tnqy/efNPnH+6mCLZRVFFRIc/ztGHDhibHp0+frlAodNr/Ji4uTs8991yTY4899piSk5NP+/q5c+fK87zPVLs7gTNn+v8PxunqySf9fmcAAACaikRslu/kSZsd/PBDm0kMh202e/due1RTWZnNUG7caDOYr79uobyoyIJ5YaHNhv7xj7Y8fOVKmzl9+mn7DPT447Z0etEimwl/6CFbPp6TI913ny2xnjXLllvPmCH97ndSdrZtCPbb30o33yz95je2zDwz04L9L39pS86vvto2EBs92pZyX3mlhf3LL7dJhhEjLPgPH25Lvi+91C4CDB1qFwIGD7aZ54susgmJgQPt2c/f/a4tFx8wwMJUv34WtHr3thDWq5eFsx49LLQlJ1ugS0qyoNe5swXATp0sHCYkWGiMi7NQecYZ/n8+dbXWr/f7J6cJgm0UtUWwdWbGtqxMevbZ9lWvvMLGEQAAAPishgb7nPjJJ3aRoa7OqrbWlhqfOmUXHk6etKXINTW2PPn4cbsYUVVly5ePHbM6etQuUPzrX1ZHjtiS50OH7KJFZaU9PquiwpZFh8NWBw/ayoJ337U6cMAubuzbZ/dlv/OOLa3es8cueOzebUuud+2y5dc7dlht324rE8rLrbZutc/npaW2dHvLFlu18NZbNvO6ebNVSYltKrdxo9WGDVbFxVb/+Md/q53lD4JtFLXFUuRPc/kEAgAAAEA0uJyL2l2wlWzzqKlTpzb+ORKJKDU19Qs3jxo9enSTY8OGDWPzKAAAAABoJpdzUbsMtvn5+QoEAlq+fLl27typyZMnKzExUYcOHZIk3XDDDbr77rsbX19cXKzY2FgtXLhQu3bt0ty5c3ncDwAAAAC0gMu5qF0GW0nKzc1VWlqa4uPjFQqFtGnTpsa/Gz58uCZMmNDk9QUFBTr33HMVHx+vCy64QEVFRc3+Wi6fQAAAAACIBpdzUbsNtm3J5RMIAAAAANHgci4i2MrtEwgAAAAA0eByLiLYyu0TCAAAAADR4HIuItjK7RMIAAAAANHgci4i2MrtEwgAAAAA0eByLiLYyu0TCAAAAADR4HIuItjK7RMIAAAAANHgci4i2MrtEwgAAAAA0eByLiLYyu0TCAAAAADR4HIuItjK7RMIAAAAANHgci4i2MrtEwgAAAAA0eByLiLYyu0TCAAAAADR4HIuIthKqqqqkud5CofDqq6upiiKoiiKoiiK+sZVOByW53mqqqryO6K1GMFWajyBFEVRFEVRFEVR3/QKh8N+R7QWI9hKikQiCofDqqqq8v0qSXuv/1wEYHab+qrFGKJaW4whqrXFGKJaW4whqrXVXsdQVVWVwuGwIpGI3xGtxQi2aJHqanfX3aN9YAyhtRhDaC3GEFqLMYTWYgxFH8EWLcIPIVqLMYTWYgyhtRhDaC3GEFqLMRR9BFu0CD+EaC3GEFqLMYTWYgyhtRhDaC3GUPQRbNEitbW1mjt3rmpra/1uBY5iDKG1GENoLcYQWosxhNZiDEUfwRYAAAAA4DSCLQAAAADAaQRbAAAAAIDTCLYAAAAAAKcRbNFsixcvVjAYVCAQUCgUUklJid8twSHz5s3T4MGD1alTJ3Xr1k1jxozR22+/7XdbcNT8+fPleZ6mTZvmdytwzPvvv6/x48erS5cuSkhIUHp6ut58802/24Ij6uvrNWvWLPXu3VsJCQnq27ev7rvvPjU0NPjdGtqpdevWafTo0erRo4c8z1NhYWGTv29oaNDs2bPVvXt3JSQkaOTIkdqzZ49P3bqNYItmyc/PV3x8vJYuXaodO3Zo0qRJSkxM1OHDh/1uDY644oortGzZMm3fvl1lZWW66qqrlJaWphMnTvjdGhyzefNm9e7dWwMHDiTYokWOHTumYDCoG2+8USUlJdq/f7/WrFmjd955x+/W4IicnBwlJSXplVde0YEDB/T888+rU6dOWrRokd+toZ169dVXNXPmTK1evfq0wfbBBx9U586d9cILL2jr1q3KyMhQnz599PHHH/vUsbsItmiWUCikrKysxj9HIhGlpKRo/vz5PnYFlx05ckSe52ndunV+twKH1NTUqH///nrttdc0fPhwgi1a5K677tJll13mdxtw2KhRo3TTTTc1OXb11Vdr/PjxPnUEl3w62DY0NKh79+566KGHGo9VVVUpEAgoLy/PjxadRrDFl6qrq1NMTMxnrjBlZmYqIyPDp67gur1798rzPG3bts3vVuCQzMxMZWdnSxLBFi12/vnnKzs7W9dcc426deumQYMG6cknn/S7LTgkJydHwWBQu3fvliSVlZUpOTlZzz77rM+dwQWfDrb79u2T53kqLS1t8rof/vCHuu2229q6PecRbPGlKioq5HmeNmzY0OT49OnTFQqFfOoKLotEIho1apQuvfRSv1uBQ/Ly8pSent64PItgi5YKBAIKBAK65557tGXLFj3xxBNKSEjQ8uXL/W4NjohEIrrrrrvUoUMHxcbGqkOHDpo3b57fbcERnw62xcXF8jxPH3zwQZPXXXvttRo3blxbt+c8gi2+FMEW0XbLLbcoGAwqHA773QoccfDgQSUnJ2vr1q2Nxwi2aKm4uDgNGzasybFbb71VQ4cO9akjuCYvL089e/ZUXl6eysvLtWLFCnXp0oWLI2gWgu3Xi2CLL8VSZERTVlaWevbsqf379/vdChxSWFgoz/MUExPTWJ7nqUOHDoqJiVF9fb3fLcIBaWlpmjhxYpNjS5YsUUpKik8dwTU9e/bU4sWLmxy7//77NWDAAJ86gktYivz1ItiiWUKhkKZOndr450gkotTUVDaPQrM1NDQoKytLKSkpbGOPFjt+/Li2bdvWpAYPHqzrr7+e+7TRbNddd91nNo/Kzs7+zCwu8Hm6dOmiJUuWNDk2b9489e/f36eO4JLP2zxq4cKFjceqq6vZPOorItiiWfLz8xUIBLR8+XLt3LlTkydPVmJiog4dOuR3a3DElClT1LlzZ61du1aVlZWNderUKb9bg6NYioyW2rx5s2JjY5WTk6O9e/dq1apV6tixIxv/oNkmTJig1NTUxsf9rF69Wl27dtWMGTP8bg3tVE1NjUpLS1VaWirP8/Twww+rtLRU7733niR73E9iYqJefPFFlZeXa8yYMTzu5ysi2KLZcnNzlZaWpvj4eIVCIW3atMnvluAQz/NOW8uWLfO7NTiKYIuv4uWXX1Z6eroCgYDOO+88dkVGixw/flzTpk1TWlqaEhIS1LdvX82cOVN1dXV+t4Z26o033jjt558JEyZIslnb2bNn65xzzlEgENDIkSMbd91GyxBsAQAAAABOI9gCAAAAAJxGsAUAAAAAOI1gCwAAAABwGsEWAAAAAOA0gi0AAAAAwGkEWwAAAACA0wi2AAAAAACnEWwBAAAAAE4j2AIAAAAAnEawBQCgHcjOztbYsWP9bgMAACcRbAEAaAcuueQS5eTk+N0GAABOItgCAOCjuro6xcbGyvO8xhoyZIjfbQEA4BSCLQAAPopEIiopKZHneSorK1NlZaU++ugjv9sCAMApBFsAAHxWWFiopKQkv9sAAMBZBFsAAHw2Z84cjRgxwu82AABwFsEWAACfZWRk6Pbbb/e7DQAAnEWwBQDAZ3369NEzzzzjdxsAADiLYAsAgM+CwaDuvfdeVVRUqKqqyu92AABwDsEWAACfrVy5UikpKfI8T3feeaff7QAA4ByCLQAAAADAaQRbAAAAAIDTCLYAAAAAAKcRbAEAAAAATiPYAgAAAACcRrAFAAAAADiNYAsAAAAAcBrBFgAAAADgNIItAAAAAMBpBFsAAAAAgNMItgAAAAAApxFsAQAAAABOI9gCAAAAAJxGsAUAAAAAOI1gCwAAAABwGsEWAAAAAOA0gi0AAAAAwGkEWwAAAACA0/4PgKefCP6XktkAAAAASUVORK5CYII=\" width=\"950\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "delta_t = 2\n", + "\n", + "def delta(t):\n", + " if t < 0:\n", + " return 0\n", + " elif t < delta_t:\n", + " return 1\n", + " else: \n", + " return 0\n", + " \n", + "def g_delta(t):\n", + " if t < 0:\n", + " return 0\n", + " elif t < delta_t:\n", + " return (1-exp(-t))\n", + " else:\n", + " return (-exp(-t)+exp(-t+delta_t))\n", + "\n", + "# plotting delta\n", + "figure, axis3 = pyplot.subplots(1,1)\n", + "figure.tight_layout(pad=2.5)\n", + "axis3.set_title('$\\Delta(t)$')\n", + "axis3.set_xlabel('$t$')\n", + "axis3.set_ylabel('$\\Delta(t)$')\n", + "axis3.plot(t, list(map(delta, t)))\n", + "\n", + "# plotting g_delta\n", + "figure, axis4 = pyplot.subplots(1,1)\n", + "figure.tight_layout(pad=2.5)\n", + "axis4.set_title('$g_\\Delta(t)$')\n", + "axis4.set_xlabel('$t$')\n", + "axis4.set_ylabel('$g_\\Delta(t)$')\n", + "axis4.plot(t, list(map(g_delta, t)), 'red')\n", + "pyplot.show()" + ] + }, + { + "cell_type": "markdown", + "id": "1d74a1c8", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "Nun nutzen wir diese Treppenfunktion um unser Eingangssignal $x(t)$ zu approximieren:\n", + "$$\n", + " x_{\\text{app}}(t) = \\sum_{k=0}^{\\lfloor \\frac{t}{\\Delta t} \\rfloor} \\Delta (t-k \\, \\Delta t) \\cdot x(k \\, \\Delta t)\n", + "$$\n", + "\n", + "## Anwort auf die Approximation\n", + "Jede Treppenstufe $\\Delta(t)$ löst nun eine Antwort $g_\\Delta(t)$ aus! Diese Antworten überlagern wir um die Antwort $y_{\\text{app}}(t)$ auf den Eingang $x_{\\text{app}}$(t) zu erhalten.\n", + "$$\n", + " y_{app}(t) = \\sum_{k=0}^{\\lfloor \\frac{t}{\\Delta t} \\rfloor} x(k \\, \\Delta t) \\cdot \\frac{g_\\Delta (t-k \\, \\Delta t)}{\\Delta t} \\cdot \\Delta t\n", + " $$\n", + " \n", + "Anschließend vergleichen wir $y_{app}(t)$ mit dem tatsächlichen Ergebnis aus der Faltung $y(t)=g(t)*x(t)$. Mit Hilfe eines Sliders können wir die Breite von $\\Delta(t)$ variieren, um so die Approximation zu überprüfen." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "5ad21abd", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "/* global mpl */\n", + "window.mpl = {};\n", + "\n", + "mpl.get_websocket_type = function () {\n", + " if (typeof WebSocket !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof MozWebSocket !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert(\n", + " '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", + "\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 = document.createElement('div');\n", + " this.root.setAttribute('style', 'display: inline-block');\n", + " this._root_extra_style(this.root);\n", + "\n", + " parent_element.appendChild(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 (fig.ratio !== 1) {\n", + " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.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 = document.createElement('div');\n", + " titlebar.classList =\n", + " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", + " var titletext = document.createElement('div');\n", + " titletext.classList = 'ui-dialog-title';\n", + " titletext.setAttribute(\n", + " 'style',\n", + " 'width: 100%; text-align: center; padding: 3px;'\n", + " );\n", + " titlebar.appendChild(titletext);\n", + " this.root.appendChild(titlebar);\n", + " this.header = titletext;\n", + "};\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", + "\n", + "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", + "\n", + "mpl.figure.prototype._init_canvas = function () {\n", + " var fig = this;\n", + "\n", + " var canvas_div = (this.canvas_div = document.createElement('div'));\n", + " canvas_div.setAttribute(\n", + " 'style',\n", + " 'border: 1px solid #ddd;' +\n", + " 'box-sizing: content-box;' +\n", + " 'clear: both;' +\n", + " 'min-height: 1px;' +\n", + " 'min-width: 1px;' +\n", + " 'outline: 0;' +\n", + " 'overflow: hidden;' +\n", + " 'position: relative;' +\n", + " 'resize: both;'\n", + " );\n", + "\n", + " function on_keyboard_event_closure(name) {\n", + " return function (event) {\n", + " return fig.key_event(event, name);\n", + " };\n", + " }\n", + "\n", + " canvas_div.addEventListener(\n", + " 'keydown',\n", + " on_keyboard_event_closure('key_press')\n", + " );\n", + " canvas_div.addEventListener(\n", + " 'keyup',\n", + " on_keyboard_event_closure('key_release')\n", + " );\n", + "\n", + " this._canvas_extra_style(canvas_div);\n", + " this.root.appendChild(canvas_div);\n", + "\n", + " var canvas = (this.canvas = document.createElement('canvas'));\n", + " canvas.classList.add('mpl-canvas');\n", + " canvas.setAttribute('style', 'box-sizing: content-box;');\n", + "\n", + " this.context = canvas.getContext('2d');\n", + "\n", + " var backingStore =\n", + " this.context.backingStorePixelRatio ||\n", + " this.context.webkitBackingStorePixelRatio ||\n", + " this.context.mozBackingStorePixelRatio ||\n", + " this.context.msBackingStorePixelRatio ||\n", + " this.context.oBackingStorePixelRatio ||\n", + " this.context.backingStorePixelRatio ||\n", + " 1;\n", + "\n", + " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", + " 'canvas'\n", + " ));\n", + " rubberband_canvas.setAttribute(\n", + " 'style',\n", + " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", + " );\n", + "\n", + " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", + " if (this.ResizeObserver === undefined) {\n", + " if (window.ResizeObserver !== undefined) {\n", + " this.ResizeObserver = window.ResizeObserver;\n", + " } else {\n", + " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", + " this.ResizeObserver = obs.ResizeObserver;\n", + " }\n", + " }\n", + "\n", + " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", + " var nentries = entries.length;\n", + " for (var i = 0; i < nentries; i++) {\n", + " var entry = entries[i];\n", + " var width, height;\n", + " if (entry.contentBoxSize) {\n", + " if (entry.contentBoxSize instanceof Array) {\n", + " // Chrome 84 implements new version of spec.\n", + " width = entry.contentBoxSize[0].inlineSize;\n", + " height = entry.contentBoxSize[0].blockSize;\n", + " } else {\n", + " // Firefox implements old version of spec.\n", + " width = entry.contentBoxSize.inlineSize;\n", + " height = entry.contentBoxSize.blockSize;\n", + " }\n", + " } else {\n", + " // Chrome <84 implements even older version of spec.\n", + " width = entry.contentRect.width;\n", + " height = entry.contentRect.height;\n", + " }\n", + "\n", + " // Keep the size of the canvas and rubber band canvas in sync with\n", + " // the canvas container.\n", + " if (entry.devicePixelContentBoxSize) {\n", + " // Chrome 84 implements new version of spec.\n", + " canvas.setAttribute(\n", + " 'width',\n", + " entry.devicePixelContentBoxSize[0].inlineSize\n", + " );\n", + " canvas.setAttribute(\n", + " 'height',\n", + " entry.devicePixelContentBoxSize[0].blockSize\n", + " );\n", + " } else {\n", + " canvas.setAttribute('width', width * fig.ratio);\n", + " canvas.setAttribute('height', height * fig.ratio);\n", + " }\n", + " canvas.setAttribute(\n", + " 'style',\n", + " 'width: ' + width + 'px; height: ' + height + 'px;'\n", + " );\n", + "\n", + " rubberband_canvas.setAttribute('width', width);\n", + " rubberband_canvas.setAttribute('height', height);\n", + "\n", + " // And update the size in Python. We ignore the initial 0/0 size\n", + " // that occurs as the element is placed into the DOM, which should\n", + " // otherwise not happen due to the minimum size styling.\n", + " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", + " fig.request_resize(width, height);\n", + " }\n", + " }\n", + " });\n", + " this.resizeObserverInstance.observe(canvas_div);\n", + "\n", + " function on_mouse_event_closure(name) {\n", + " return function (event) {\n", + " return fig.mouse_event(event, name);\n", + " };\n", + " }\n", + "\n", + " rubberband_canvas.addEventListener(\n", + " 'mousedown',\n", + " on_mouse_event_closure('button_press')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseup',\n", + " on_mouse_event_closure('button_release')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'dblclick',\n", + " on_mouse_event_closure('dblclick')\n", + " );\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband_canvas.addEventListener(\n", + " 'mousemove',\n", + " on_mouse_event_closure('motion_notify')\n", + " );\n", + "\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseenter',\n", + " on_mouse_event_closure('figure_enter')\n", + " );\n", + " rubberband_canvas.addEventListener(\n", + " 'mouseleave',\n", + " on_mouse_event_closure('figure_leave')\n", + " );\n", + "\n", + " canvas_div.addEventListener('wheel', function (event) {\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " on_mouse_event_closure('scroll')(event);\n", + " });\n", + "\n", + " canvas_div.appendChild(canvas);\n", + " canvas_div.appendChild(rubberband_canvas);\n", + "\n", + " this.rubberband_context = rubberband_canvas.getContext('2d');\n", + " this.rubberband_context.strokeStyle = '#000000';\n", + "\n", + " this._resize_canvas = function (width, height, forward) {\n", + " if (forward) {\n", + " canvas_div.style.width = width + 'px';\n", + " canvas_div.style.height = height + 'px';\n", + " }\n", + " };\n", + "\n", + " // Disable right mouse context menu.\n", + " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", + " event.preventDefault();\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 toolbar = document.createElement('div');\n", + " toolbar.classList = 'mpl-toolbar';\n", + " this.root.appendChild(toolbar);\n", + "\n", + " function on_click_closure(name) {\n", + " return function (_event) {\n", + " return fig.toolbar_button_onclick(name);\n", + " };\n", + " }\n", + "\n", + " function on_mouseover_closure(tooltip) {\n", + " return function (event) {\n", + " if (!event.currentTarget.disabled) {\n", + " return fig.toolbar_button_onmouseover(tooltip);\n", + " }\n", + " };\n", + " }\n", + "\n", + " fig.buttons = {};\n", + " var buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'mpl-button-group';\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", + " /* Instead of a spacer, we start a new button group. */\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + " buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'mpl-button-group';\n", + " continue;\n", + " }\n", + "\n", + " var button = (fig.buttons[name] = document.createElement('button'));\n", + " button.classList = 'mpl-widget';\n", + " button.setAttribute('role', 'button');\n", + " button.setAttribute('aria-disabled', 'false');\n", + " button.addEventListener('click', on_click_closure(method_name));\n", + " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", + "\n", + " var icon_img = document.createElement('img');\n", + " icon_img.src = '_images/' + image + '.png';\n", + " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", + " icon_img.alt = tooltip;\n", + " button.appendChild(icon_img);\n", + "\n", + " buttonGroup.appendChild(button);\n", + " }\n", + "\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + "\n", + " var fmt_picker = document.createElement('select');\n", + " fmt_picker.classList = 'mpl-widget';\n", + " toolbar.appendChild(fmt_picker);\n", + " this.format_dropdown = fmt_picker;\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = document.createElement('option');\n", + " option.selected = fmt === mpl.default_extension;\n", + " option.innerHTML = fmt;\n", + " fmt_picker.appendChild(option);\n", + " }\n", + "\n", + " var status_bar = document.createElement('span');\n", + " status_bar.classList = 'mpl-message';\n", + " toolbar.appendChild(status_bar);\n", + " this.message = status_bar;\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", + "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", + "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], msg['forward']);\n", + " fig.send_message('refresh', {});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", + " var x0 = msg['x0'] / fig.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", + " var x1 = msg['x1'] / fig.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / fig.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,\n", + " 0,\n", + " fig.canvas.width / fig.ratio,\n", + " fig.canvas.height / fig.ratio\n", + " );\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", + " 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.handle_history_buttons = function (fig, msg) {\n", + " for (var key in msg) {\n", + " if (!(key in fig.buttons)) {\n", + " continue;\n", + " }\n", + " fig.buttons[key].disabled = !msg[key];\n", + " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", + " if (msg['mode'] === 'PAN') {\n", + " fig.buttons['Pan'].classList.add('active');\n", + " fig.buttons['Zoom'].classList.remove('active');\n", + " } else if (msg['mode'] === 'ZOOM') {\n", + " fig.buttons['Pan'].classList.remove('active');\n", + " fig.buttons['Zoom'].classList.add('active');\n", + " } else {\n", + " fig.buttons['Pan'].classList.remove('active');\n", + " fig.buttons['Zoom'].classList.remove('active');\n", + " }\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", + " var img = evt.data;\n", + " if (img.type !== 'image/png') {\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", + " img.type = 'image/png';\n", + " }\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", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " img\n", + " );\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " } else if (\n", + " typeof evt.data === 'string' &&\n", + " evt.data.slice(0, 21) === 'data:image/png;base64'\n", + " ) {\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(\n", + " \"No handler for the '\" + msg_type + \"' message type: \",\n", + " msg\n", + " );\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(\n", + " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", + " e,\n", + " e.stack,\n", + " msg\n", + " );\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", + " }\n", + " if (e.target) {\n", + " targ = e.target;\n", + " } else if (e.srcElement) {\n", + " targ = e.srcElement;\n", + " }\n", + " if (targ.nodeType === 3) {\n", + " // defeat Safari bug\n", + " targ = targ.parentNode;\n", + " }\n", + "\n", + " // pageX,Y are the mouse positions relative to the document\n", + " var boundingRect = targ.getBoundingClientRect();\n", + " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", + " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\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", + " }\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", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * this.ratio;\n", + " var y = canvas_pos.y * this.ratio;\n", + "\n", + " this.send_message(name, {\n", + " x: x,\n", + " y: y,\n", + " button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event),\n", + " });\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", + " // Prevent repeat events\n", + " if (name === 'key_press') {\n", + " if (event.key === this._key) {\n", + " return;\n", + " } else {\n", + " this._key = event.key;\n", + " }\n", + " }\n", + " if (name === 'key_release') {\n", + " this._key = null;\n", + " }\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.key !== 'Control') {\n", + " value += 'ctrl+';\n", + " }\n", + " else if (event.altKey && event.key !== 'Alt') {\n", + " value += 'alt+';\n", + " }\n", + " else if (event.shiftKey && event.key !== 'Shift') {\n", + " value += 'shift+';\n", + " }\n", + "\n", + " value += 'k' + event.key;\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, { key: value, 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", + "\n", + "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", + "// prettier-ignore\n", + "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\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\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", + "\n", + "mpl.default_extension = \"png\";/* global mpl */\n", + "\n", + "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.binaryType = comm.kernel.ws.binaryType;\n", + " ws.readyState = comm.kernel.ws.readyState;\n", + " function updateReadyState(_event) {\n", + " if (comm.kernel.ws) {\n", + " ws.readyState = comm.kernel.ws.readyState;\n", + " } else {\n", + " ws.readyState = 3; // Closed state.\n", + " }\n", + " }\n", + " comm.kernel.ws.addEventListener('open', updateReadyState);\n", + " comm.kernel.ws.addEventListener('close', updateReadyState);\n", + " comm.kernel.ws.addEventListener('error', updateReadyState);\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", + " var data = msg['content']['data'];\n", + " if (data['blob'] !== undefined) {\n", + " data = {\n", + " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", + " };\n", + " }\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(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 = document.getElementById(id);\n", + " var ws_proxy = comm_websocket_adapter(comm);\n", + "\n", + " function ondownload(figure, _format) {\n", + " window.open(figure.canvas.toDataURL());\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\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;\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", + " fig.cell_info[0].output_area.element.on(\n", + " 'cleared',\n", + " { fig: fig },\n", + " fig._remove_fig_handler\n", + " );\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function (fig, msg) {\n", + " var width = fig.canvas.width / fig.ratio;\n", + " fig.cell_info[0].output_area.element.off(\n", + " 'cleared',\n", + " fig._remove_fig_handler\n", + " );\n", + " fig.resizeObserverInstance.unobserve(fig.canvas_div);\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.innerHTML =\n", + " '<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 / this.ratio;\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] =\n", + " '<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 () {\n", + " fig.push_to_output();\n", + " }, 1000);\n", + "};\n", + "\n", + "mpl.figure.prototype._init_toolbar = function () {\n", + " var fig = this;\n", + "\n", + " var toolbar = document.createElement('div');\n", + " toolbar.classList = 'btn-toolbar';\n", + " this.root.appendChild(toolbar);\n", + "\n", + " function on_click_closure(name) {\n", + " return function (_event) {\n", + " return fig.toolbar_button_onclick(name);\n", + " };\n", + " }\n", + "\n", + " function on_mouseover_closure(tooltip) {\n", + " return function (event) {\n", + " if (!event.currentTarget.disabled) {\n", + " return fig.toolbar_button_onmouseover(tooltip);\n", + " }\n", + " };\n", + " }\n", + "\n", + " fig.buttons = {};\n", + " var buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'btn-group';\n", + " var button;\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", + " /* Instead of a spacer, we start a new button group. */\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + " buttonGroup = document.createElement('div');\n", + " buttonGroup.classList = 'btn-group';\n", + " continue;\n", + " }\n", + "\n", + " button = fig.buttons[name] = document.createElement('button');\n", + " button.classList = 'btn btn-default';\n", + " button.href = '#';\n", + " button.title = name;\n", + " button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n", + " button.addEventListener('click', on_click_closure(method_name));\n", + " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", + " buttonGroup.appendChild(button);\n", + " }\n", + "\n", + " if (buttonGroup.hasChildNodes()) {\n", + " toolbar.appendChild(buttonGroup);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = document.createElement('span');\n", + " status_bar.classList = 'mpl-message pull-right';\n", + " toolbar.appendChild(status_bar);\n", + " this.message = status_bar;\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = document.createElement('div');\n", + " buttongrp.classList = 'btn-group inline pull-right';\n", + " button = document.createElement('button');\n", + " button.classList = 'btn btn-mini btn-primary';\n", + " button.href = '#';\n", + " button.title = 'Stop Interaction';\n", + " button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n", + " button.addEventListener('click', function (_evt) {\n", + " fig.handle_close(fig, {});\n", + " });\n", + " button.addEventListener(\n", + " 'mouseover',\n", + " on_mouseover_closure('Stop Interaction')\n", + " );\n", + " buttongrp.appendChild(button);\n", + " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", + " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", + "};\n", + "\n", + "mpl.figure.prototype._remove_fig_handler = function (event) {\n", + " var fig = event.data.fig;\n", + " if (event.target !== this) {\n", + " // Ignore bubbled events from children.\n", + " return;\n", + " }\n", + " fig.close_ws(fig, {});\n", + "};\n", + "\n", + "mpl.figure.prototype._root_extra_style = function (el) {\n", + " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", + "};\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function (el) {\n", + " // this is important to make the div 'focusable\n", + " el.setAttribute('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", + " } else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\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", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which === 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", + " fig.ondownload(fig, null);\n", + "};\n", + "\n", + "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(\n", + " 'matplotlib',\n", + " mpl.mpl_figure_comm\n", + " );\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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/z3psWGDHOvXy7FunRy//SbHr7/KsXatHGvWyGGacqxeLceqVfaQ8JUrZYj4ihXA8uVyLFsmx9Klcvzyixx+tn0mg60XOTEU+WY6NyAREREREZE36JyL/C7YArJ4VJs2bW78v8vlQr58+e64eFSNGjWS/NkLL7yg/+JRREREREREDtE5F/llsI2IiEBoaCgmTpyI3bt3o3nz5ggLC8OpU6cAAA0bNkTnzp1v/Pz69euRIUMGDBgwAHv27EH37t253Q8REREREVEq6JyL/DLYAsDw4cNRsGBBhISEIDw8HBs3brzxd+XLl0fjxo2T/PzMmTNRrFgxhISEoESJElicij3FdG5AIiIiIiIib9A5F/ltsHWSzg1IRERERETkDTrnIgZb6N2ARERERERE3qBzLmKwhd4NSERERERE5A065yIGW+jdgERERERERN6gcy5isIXeDUhEREREROQNOuciBlvo3YBERERERETeoHMuYrCF3g1IRERERETkDTrnIgZb6N2ARERERERE3qBzLmKwhd4NSERERERE5A065yIGW+jdgERERERERN6gcy5isIXeDUhEREREROQNOuciBlvo3YBERERERETeoHMuYrAFEBUVBcMwEBkZiYsXL/LgwYMHDx48ePDgwYNH0B2RkZEwDANRUVGqI1qqMdgCNxqQBw8ePHjw4MGDBw8ePIL9iIyMVB3RUo3BFoDL5UJkZCSioqKU3yXx98O6CcDebR5pPXgO8fD04DnEw9OD5xAPTw+eQzw8Pfz1HIqKikJkZCRcLpfqiJZqDLaUKhcv6jvunvwDzyHyFM8h8hTPIfIUzyHyFM8h72OwpVThP0LyFM8h8hTPIfIUzyHyFM8h8hTPIe9jsKVU4T9C8hTPIfIUzyHyFM8h8hTPIfIUzyHvY7ClVLl27Rq6d++Oa9euqS6FNMVziDzFc4g8xXOIPMVziDzFc8j7GGyJiIiIiIhIawy2REREREREpDUGWyIiIiIiItIagy0REdaZuKAAAAa+SURBVBERERFpjcGWUmzEiBEoVKgQQkNDER4ejk2bNqkuiTTSq1cvlC1bFlmzZkWuXLlQu3Zt7N27V3VZpKnevXvDMAy0b99edSmkmWPHjuG9995Djhw5kClTJpQsWRJbtmxRXRZpIiEhAV999RUKFy6MTJkyoUiRIvj222/hdrtVl0Z+au3atahRowby5MkDwzAwd+7cJH/vdrvRrVs3PPTQQ8iUKRMqV66Mffv2KapWbwy2lCIREREICQnB+PHjsWvXLjRr1gxhYWE4ffq06tJIE1WrVsWECROwc+dObNu2DdWqVUPBggVx+fJl1aWRZjZv3ozChQvjySefZLClVDl//jwKFSqEJk2aYNOmTTh06BCWLVuGAwcOqC6NNNGzZ0/kzJkTixYtwuHDhzFr1ixkzZoVQ4cOVV0a+aklS5aga9eumDNnTrLBtk+fPsiWLRvmzZuH7du3o1atWnj44Ydx9epVRRXri8GWUiQ8PBytW7e+8f8ulwt58+ZF7969FVZFOjtz5gwMw8DatWtVl0IaiY6ORtGiRbFixQqUL1+ewZZSpVOnTnjppZdUl0Eaq169Oj744IMkf1a3bl289957iioindwcbN1uNx566CH079//xp9FRUUhNDQUM2bMUFGi1hhs6a5iY2ORPn36W+4wNWrUCLVq1VJUFelu//79MAwDf//9t+pSSCONGjVChw4dAIDBllLt8ccfR4cOHVCvXj3kypULZcqUwejRo1WXRRrp2bMnChUqhH/++QcAsG3bNuTOnRtTp05VXBnp4OZge/DgQRiGga1btyb5uVdeeQXt2rVzujztMdjSXR0/fhyGYWDDhg1J/rxjx44IDw9XVBXpzOVyoXr16ihXrpzqUkgjM2bMQMmSJW8Mz2KwpdQKDQ1FaGgovvzyS/z111/48ccfkSlTJkycOFF1aaQJl8uFTp06IV26dMiQIQPSpUuHXr16qS6LNHFzsF2/fj0Mw8CJEyeS/Fz9+vXRoEEDp8vTHoMt3RWDLXnbxx9/jEKFCiEyMlJ1KaSJo0ePInfu3Ni+ffuNP2OwpdTKmDEjXnjhhSR/1rZtWzz//POKKiLdzJgxA/nz58eMGTOwY8cOTJ48GTly5ODNEUoRBlvfYrClu+JQZPKm1q1bI3/+/Dh06JDqUkgjc+fOhWEYSJ8+/Y3DMAykS5cO6dOnR0JCguoSSQMFCxbEhx9+mOTPRo0ahbx58yqqiHSTP39+jBgxIsmf9ejRA8WLF1dUEemEQ5F9i8GWUiQ8PBxt2rS58f8ulwv58uXj4lGUYm63G61bt0bevHm5jD2l2qVLl/D3338nOcqWLYv333+f87Qpxd55551bFo/q0KHDLb24RLeTI0cOjBo1Ksmf9erVC0WLFlVUEenkdotHDRgw4MafXbx4kYtHpRGDLaVIREQEQkNDMXHiROzevRvNmzdHWFgYTp06pbo00kTLli2RLVs2rFmzBidPnrxxxMTEqC6NNMWhyJRamzdvRoYMGdCzZ0/s378f06ZNQ+bMmbnwD6VY48aNkS9fvhvb/cyZMwcPPPAAvvjiC9WlkZ+Kjo7G1q1bsXXrVhiGgUGDBmHr1q04cuQIANnuJywsDPPnz8eOHTtQu3ZtbveTRgy2lGLDhw9HwYIFERISgvDwcGzcuFF1SaQRwzCSPSZMmKC6NNIUgy2lxcKFC1GyZEmEhobiscce46rIlCqXLl1C+/btUbBgQWTKlAlFihRB165dERsbq7o08lOmaSZ7/dO4cWMA0mvbrVs3PPjggwgNDUXlypVvrLpNqcNgS0RERERERFpjsCUiIiIiIiKtMdgSERERERGR1hhsiYiIiIiISGsMtkRERERERKQ1BlsiIiIiIiLSGoMtERERERERaY3BloiIiIiIiLTGYEtERERERERaY7AlIiIiIiIirTHYEhERERERkdYYbImIiIiIiEhrDLZERERERESkNQZbIiIiIiIi0hqDLREREREREWmNwZaIiIiIiIi0xmBLREREREREWmOwJSIiIiIiIq0x2BIREREREZHWGGyJiIiIiIhIawy2REREREREpDUGWyIiIiIiItIagy0RERERERFpjcGWiIiIiIiItMZgS0RERERERFpjsCUiIiIiIiKtMdgSERERERGR1hhsiYiIiIiISGsMtkRERERERKQ1BlsiIiIiIiLSGoMtERERERERaY3BloiIiIiIiLTGYEtERERERERaY7AlIiIiIiIirTHYEhERERERkdYYbImIiIiIiEhrDLZERERERESkNQZbIiIiIiIi0tr/A65QvU0qhscCAAAAAElFTkSuQmCC\" width=\"950\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5bb02d1e11a647e59af1e28e009afb37", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "FloatSlider(value=2.0, layout=Layout(width='100%'), max=4.0, min=0.1)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "c3609b0a930343d78e0faa4665eac7cb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Checkbox(value=False, description='Faltung anzeigen')" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from scipy import signal\n", + "\n", + "# define the approximate input x_app(t)\n", + "def x_app(t):\n", + " if t < 0:\n", + " return 0\n", + " else:\n", + " step_number = numpy.floor(t/delta_t) # numpy floor rounds down, e.g. 2.4 to 2\n", + " return delta(t-step_number*delta_t)*x(step_number*delta_t)\n", + " \n", + "# we are computing the real answer y(t) using the convolution, to compare it afterwards\n", + "sample_rate = (t1-t0)/N\n", + "convolution_result = signal.convolve(numpy.array(list(map(x, t))),\n", + " numpy.array(list(map(g, (t-(N/2)*sample_rate+0.5))))\n", + " ,mode='same')*sample_rate\n", + "\n", + "# prepare the figure to plot in\n", + "figure, axis5 = pyplot.subplots(1,1)\n", + "figure.set_figheight(5)\n", + "figure.tight_layout(pad=2.5)\n", + "\n", + "# this function runs everytime the slider is dragged\n", + "def slider_update(changes):\n", + " global delta_t # to affect all delta_t values in x(t), g(t) ...\n", + " delta_t = delta_t_slider.value\n", + " \n", + " axis5.cla() # clear the canvas\n", + " # plotting x(t) and x_app(t)\n", + " axis5.plot(t, list(map(x, t)), 'grey', label='$x(t)$')\n", + " axis5.plot(t, list(map(x_app, t)), label='$x_{app}(t)$')\n", + "\n", + " # plotting the responses g_Delta(t) and the answer y_app(t)\n", + " amount_steps = int(numpy.floor(numpy.max(t) / delta_t))\n", + " y_app = numpy.zeros(N) # initialize a vector filled with zeros\n", + "\n", + " for i in range(0, amount_steps+1):\n", + " # plot every g_delta(t-i*delta_t) for every step\n", + " axis5.plot(t, numpy.array(list(map(g_delta, (t-i*delta_t))))*x(i*delta_t), 'r')\n", + " y_app += numpy.array(list(map(g_delta, (t-i*delta_t))))*x(i*delta_t)\n", + " \n", + " # plot y_app(t)\n", + " axis5.plot(t, y_app, 'c', label='$y_{app}(t)$')\n", + " \n", + " # if the checkbox is checked, plot the convolution (y(t))\n", + " if show_convolution.value:\n", + " axis5.plot(t, convolution_result, 'black', label='$y(t)$')\n", + " figure.legend()\n", + "\n", + "# this function is run if the checkbox is checked\n", + "def show_convolution_change(change):\n", + " slider_update(None)\n", + "\n", + "# create a slider to modify delta_t\n", + "delta_t_slider = FloatSlider(min=0.1, max=4, step=0.1, value=2, layout={'width':'100%'})\n", + "delta_t_slider.observe(slider_update) # specify the function to be called when dragging\n", + "display(delta_t_slider)\n", + "\n", + "# create a checkbox to conditonally plot the convolution result y(t)\n", + "show_convolution = Checkbox(False, description='Faltung anzeigen')\n", + "show_convolution.observe(show_convolution_change)\n", + "display(show_convolution)\n", + "slider_update(None) # run once to initially plot the figure" + ] } ], "metadata": { diff --git a/lti.svg b/lti.svg new file mode 100644 index 0000000..d46959d --- /dev/null +++ b/lti.svg @@ -0,0 +1,226 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="svg2" + xml:space="preserve" + width="339.7529" + height="83.479309" + viewBox="0 0 339.7529 83.479308" + sodipodi:docname="lti.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"><metadata + id="metadata8"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs + id="defs6"><clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath28"><path + d="M 0,0 H 150.23772 V 44.220928 H 0 Z" + id="path26" /></clipPath><clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath880"><path + d="M 0,0 H 199 V 57 H 0 Z" + id="path878" /></clipPath><clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath890"><path + d="M 0,0 H 198.425 V 56.692 H 0 Z" + id="path888" /></clipPath><clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath900"><path + d="M 0,0 H 199 V 57 H 0 Z" + id="path898" /></clipPath></defs><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="2560" + inkscape:window-height="1371" + id="namedview4" + showgrid="false" + inkscape:snap-smooth-nodes="true" + inkscape:object-nodes="false" + lock-margins="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="1.8015941" + inkscape:cx="-166.91331" + inkscape:cy="-128.27546" + inkscape:window-x="1920" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="g46" + inkscape:document-rotation="0" /><g + id="g10" + inkscape:groupmode="layer" + inkscape:label="skript-systemtheorie" + transform="matrix(1.3333333,0,0,-1.3333333,-319.31865,893.93825)"><g + id="g18" + transform="matrix(2.2472958,0,0,2.2472958,207.72347,965.95803)"><g + id="g46" + transform="translate(-225.354,-801.947)"><g + id="g66" + transform="translate(239.489,655.614)"><g + id="g68"><g + id="g70"><g + id="g72" /><g + id="g74"><path + d="M 45.7844,-10.90923 H 67.60285 V 10.90922 H 45.7844 Z" + style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + id="path76" /><g + id="g78" + transform="translate(49.923,-3.873)"><g + id="g80"><g + id="g82" + transform="translate(-289.412,-651.741)"><text + transform="matrix(1,0,0,-1,289.412,651.741)" + style="font-variant:normal;font-weight:normal;font-size:10.9091px;font-family:'PT Sans';-inkscape-font-specification:PTSans-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="text86"><tspan + x="0 4.3090944 10.363645" + y="0" + sodipodi:role="line" + id="tspan84">LTI</tspan></text><g + id="g88" + transform="translate(289.412,651.741)" /></g></g><g + id="g90" + transform="translate(-49.923,3.873)" /></g></g><g + id="g92" /><path + d="M 0,0 H 43.19412" + style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + id="path94" /><g + id="g96" + transform="translate(43.19412)"><g + id="g98"><path + d="m 2.39102,0 c -0.99626,0.19925 -2.78952,0.59775 -3.98503,1.49438 0.99626,-1.09588 0.99626,-1.89288 0,-2.98876 C -0.3985,-0.59775 1.39476,-0.19925 2.39102,0 Z" + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="path100" /></g></g><g + id="g102"><g + id="g104" + transform="translate(13.462,6.562)"><g + id="g106"><g + id="g108" + transform="translate(-252.951,-662.176)"><text + transform="matrix(1,0,0,-1,252.951,662.176)" + style="font-variant:normal;font-weight:normal;font-size:10.9091px;font-family:CMMI10;-inkscape-font-specification:CMMI10;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="text112"><tspan + x="0" + y="0" + id="tspan110" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:BKM-cmmi10;-inkscape-font-specification:BKM-cmmi10">x</tspan></text><text + transform="matrix(1,0,0,-1,259.186,662.176)" + style="font-variant:normal;font-weight:normal;font-size:10.9091px;font-family:CMR10;-inkscape-font-specification:CMR10;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="text116"><tspan + x="0" + y="0" + id="tspan114" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:BKM-cmr10;-inkscape-font-specification:BKM-cmr10">(</tspan></text><text + transform="matrix(1,0,0,-1,263.429,662.176)" + style="font-variant:normal;font-weight:normal;font-size:10.9091px;font-family:CMMI10;-inkscape-font-specification:CMMI10;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="text120"><tspan + x="0" + y="0" + id="tspan118" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:BKM-cmmi10;-inkscape-font-specification:BKM-cmmi10">t</tspan></text><text + transform="matrix(1,0,0,-1,267.368,662.176)" + style="font-variant:normal;font-weight:normal;font-size:10.9091px;font-family:CMR10;-inkscape-font-specification:CMR10;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="text124"><tspan + x="0" + y="0" + id="tspan122" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:BKM-cmr10;-inkscape-font-specification:BKM-cmr10">)</tspan></text><g + id="g126" + transform="translate(252.951,662.176)" /></g></g><g + id="g128" + transform="translate(-13.462,-6.562)" /></g></g><g + id="g130"><g + id="g132" + transform="translate(5.517,-10.909)"><g + id="g134"><g + id="g136" + transform="translate(-245.006,-644.705)"><text + transform="matrix(1,0,0,-1,245.006,644.705)" + style="font-variant:normal;font-weight:normal;font-size:9.9626px;font-family:'PT Sans';-inkscape-font-specification:PTSans-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="text140"><tspan + x="0 5.3399534 8.0099306 13.459473 18.809389 23.750839 29.20038" + y="0" + sodipodi:role="line" + id="tspan138">Eingang</tspan></text><g + id="g142" + transform="translate(245.006,644.705)" /></g></g><g + id="g144" + transform="translate(-5.517,10.909)" /></g></g><path + d="m 67.80211,0 h 43.19412" + style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" + id="path146" /><g + id="g148" + transform="translate(110.99623)"><g + id="g150"><path + d="m 2.39102,0 c -0.99626,0.19925 -2.78952,0.59775 -3.98503,1.49438 0.99626,-1.09588 0.99626,-1.89288 0,-2.98876 C -0.3985,-0.59775 1.39476,-0.19925 2.39102,0 Z" + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="path152" /></g></g><g + id="g154"><g + id="g156" + transform="translate(81.511,6.562)"><g + id="g158"><g + id="g160" + transform="translate(-321,-662.176)"><text + transform="matrix(1,0,0,-1,321,662.176)" + style="font-variant:normal;font-weight:normal;font-size:10.9091px;font-family:CMMI10;-inkscape-font-specification:CMMI10;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="text164"><tspan + x="0" + y="0" + id="tspan162" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:BKM-cmmi10;-inkscape-font-specification:BKM-cmmi10">y</tspan></text><text + transform="matrix(1,0,0,-1,326.74,662.176)" + style="font-variant:normal;font-weight:normal;font-size:10.9091px;font-family:CMR10;-inkscape-font-specification:CMR10;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="text168"><tspan + x="0" + y="0" + id="tspan166" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:BKM-cmr10;-inkscape-font-specification:BKM-cmr10">(</tspan></text><text + transform="matrix(1,0,0,-1,330.982,662.176)" + style="font-variant:normal;font-weight:normal;font-size:10.9091px;font-family:CMMI10;-inkscape-font-specification:CMMI10;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="text172"><tspan + x="0" + y="0" + id="tspan170" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:BKM-cmmi10;-inkscape-font-specification:BKM-cmmi10">t</tspan></text><text + transform="matrix(1,0,0,-1,334.922,662.176)" + style="font-variant:normal;font-weight:normal;font-size:10.9091px;font-family:CMR10;-inkscape-font-specification:CMR10;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="text176"><tspan + x="0" + y="0" + id="tspan174" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:BKM-cmr10;-inkscape-font-specification:BKM-cmr10">)</tspan></text><g + id="g178" + transform="translate(321,662.176)" /></g></g><g + id="g180" + transform="translate(-81.511,-6.562)" /></g></g><g + id="g182"><g + id="g184" + transform="translate(72.352,-10.909)"><g + id="g186"><g + id="g188" + transform="translate(-311.841,-644.705)"><text + transform="matrix(1,0,0,-1,311.841,644.705)" + style="font-variant:normal;font-weight:normal;font-size:9.9626px;font-family:'PT Sans';-inkscape-font-specification:PTSans-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="text192"><tspan + x="0 5.8281212 11.197963 15.392217 20.742134 25.683582 31.133125" + y="0" + sodipodi:role="line" + id="tspan190">Ausgang</tspan></text><g + id="g194" + transform="translate(311.841,644.705)" /></g></g><g + id="g196" + transform="translate(-72.352,10.909)" /></g></g></g></g></g></g></g></g></svg> -- GitLab