mirror of https://github.com/silx-kit/pyFAI.git
3093 lines
338 KiB
Plaintext
3093 lines
338 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"%matplotlib nbagg"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<module 'pyFAI' from '/home/jerome/workspace-ssd/pyFAI/build/lib.linux-x86_64-3.9/pyFAI/__init__.py'>"
|
|
]
|
|
},
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"import sys\n",
|
|
"import os\n",
|
|
"sys.path.insert(1, os.path.abspath(\"../build/lib.linux-x86_64-3.9/\"))\n",
|
|
"import pyopencl, numpy\n",
|
|
"from pyopencl import array\n",
|
|
"import fabio\n",
|
|
"import pyFAI\n",
|
|
"from pyFAI.test.utilstest import UtilsTest\n",
|
|
"#os.environ[\"PYOPENCL_CTX\"] = \"0:1\"\n",
|
|
"os.environ[\"PYOPENCL_COMPILER_OUTPUT\"]=\"1\"\n",
|
|
"from pyFAI.gui import jupyter\n",
|
|
"from matplotlib.pyplot import subplots\n",
|
|
"pyFAI"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"Detector Detector\t Spline= None\t PixelSize= 1.720e-04, 1.720e-04 m\n",
|
|
"SampleDetDist= 3.000000e-01m\tPONI= 2.254060e-01, 2.285880e-01m\trot1=0.000000 rot2= 0.000000 rot3= 0.000000 rad\n",
|
|
"DirectBeamDist= 300.000mm\tCenter: x=1329.000, y=1310.500 pix\tTilt=0.000 deg tiltPlanRotation= 0.000 deg"
|
|
]
|
|
},
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"img = fabio.open(UtilsTest.getimage(\"Pilatus6M.cbf\")).data\n",
|
|
"ai = pyFAI.load(UtilsTest.getimage(\"Pilatus6M.poni\"))\n",
|
|
"npt = 1000\n",
|
|
"method = [\"no\", \"csr\", None]\n",
|
|
"unit=\"r_mm\"\n",
|
|
"ai"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"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",
|
|
" if (this.ratio !== 1) {\n",
|
|
" fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\n",
|
|
" }\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 (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",
|
|
" // 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",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = 'image/png';\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src\n",
|
|
" );\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data\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.which === this._key) {\n",
|
|
" return;\n",
|
|
" } else {\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" }\n",
|
|
" if (name === 'key_release') {\n",
|
|
" this._key = null;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which !== 17) {\n",
|
|
" value += 'ctrl+';\n",
|
|
" }\n",
|
|
" if (event.altKey && event.which !== 18) {\n",
|
|
" value += 'alt+';\n",
|
|
" }\n",
|
|
" if (event.shiftKey && event.which !== 16) {\n",
|
|
" value += 'shift+';\n",
|
|
" }\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, { key: value, 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\", \"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.close = function () {\n",
|
|
" comm.close();\n",
|
|
" };\n",
|
|
" ws.send = function (m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function (msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data']);\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function (comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOydX5BVZ5X2u0ISe+996IamgYRAwiBCCCEQbIIt2Gmm7QabAJ0O0ISADSRAA2n8ypiUzld+Vs1F6ruaG8uyvDE3M1czN3NhKjeOWjVVc2NpZrTUUiujkwv/3ExSpU4sje93Qa/Nbz9nvaeJddTk67Wqdp1z9r9zus8+737eZ63nWT0pIiIiIiIiIiJiSUXPX/oDRERERERERERE/HkjAGBERERERERExBKLAIAREREREREREUssAgBGRERERERERCyxCAAYEREREREREbHEIgBgRERERERERMQSiwCAERERERERERFLLAIARkREREREREQssQgAGBERERERERGxxCIAYERERERERETEEosAgBERERERERERSywCAEZERERERERELLEIABgRERERERERscQiAGBERERERERExBKLAIAREREREREREUssAgBGRERERERERCyxCAAYEREREREREbHEIgBgRERERERERMQSiwCAERERERERERFLLAIARkREREREREQssQgAGBERERERERGxxCIAYERERERERETEEosAgBERERERERERSywCAEZERERERERELLEIABgRERERERERscQiAGBERERERERExBKLAIAREREREREREUssAgBGRERERERERCyxCAAYEREREREREbHEIgBgRERERERERMQSiwCAERERERERERFLLAIARkREREREREQssQgAGBERERERERGxxCIAYERERERERETEEosAgBERERERERERSywCAEZERERERERELLEIABgRERERERERscQiAGBERERERERExBKLAIAREREREREREUssAgBGRERERERERCyxCAAYEREREREREbHEIgBgRERERERERMQSiwCAERERERERERFLLAIARkREREREREQssQgAGBERERERERGxxCIAYERERERERETEEosAgBERERERERERSywCAEZERERERERELLEIABgRERERERERscQiAGBERERERERExBKLAIAREREREREREUssAgBGRERERERERCyxCAAYEREREREREbHEIgBgRERERERERMQSiwCAERERERERERFLLAIARkREREREREQssQgA+C6PF198MQ0NDaVWq5VWr16djh07ln7w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\" width=\"640\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"_=jupyter.display(img)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"WARNING:pyFAI.ext.splitBBoxCSR:Pixel splitting desactivated !\n"
|
|
]
|
|
},
|
|
{
|
|
"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",
|
|
" if (this.ratio !== 1) {\n",
|
|
" fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\n",
|
|
" }\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 (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",
|
|
" // 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",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = 'image/png';\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src\n",
|
|
" );\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data\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.which === this._key) {\n",
|
|
" return;\n",
|
|
" } else {\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" }\n",
|
|
" if (name === 'key_release') {\n",
|
|
" this._key = null;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which !== 17) {\n",
|
|
" value += 'ctrl+';\n",
|
|
" }\n",
|
|
" if (event.altKey && event.which !== 18) {\n",
|
|
" value += 'alt+';\n",
|
|
" }\n",
|
|
" if (event.shiftKey && event.which !== 16) {\n",
|
|
" value += 'shift+';\n",
|
|
" }\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, { key: value, 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\", \"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.close = function () {\n",
|
|
" comm.close();\n",
|
|
" };\n",
|
|
" ws.send = function (m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function (msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data']);\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function (comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = 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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wjOQEydO6G9/+5veeOONYm9LABaNALSBAQIAMxGApaskAZienq63335b1apV0759+4rdJwFYNALQBgYIAMxUJgIwhJQkAC3LUt26dTV58uQS7ZMALBoBaAMDBABmIgDLPwKwaASgDQwQAJiJACz/CMCiEYA2MEAAYCYCsPwjAItGANrAAAGAmQjA8o8ALBoBaAMDBABmIgDLPwKwaASgDQwQAJiJACz/CMCiEYA2MEAAYKayEICHjx32HsfhY4dt7SsUEYBFIwBtYIAAwEz54dWaACxzTv0YucIQgEUjAG1ggADATARg2UUABgcBaAMDBABm4ingsosADA4C0AYGCADMFKoBmJOToyFDhqhevXqqXLmyrrvuOn333XeSpEWLFsmyLH3yySdq2LChKleurH/84x/66aef/PaxZMkStWrVSuecc44uuugiDRkyRIcO/fFZxg0aNNCLL76oPn36qHr16rr44ovl8Xj89pGamqq77rpLderUUdWqVXX11Vdr+fLlkgjAYCEAbWCAAMBMwQzAEydO6PCxw6e9ZRzJ8B5HxpGMM9rHiRMnTuvYhw4dqgsvvFDz5s3Tzz//rF69eqlOnTrau3evNwCvvPJKLViwQGvWrFGnTp3017/+VceOHZMk/fLLL6pWrZreeustbdq0Sd9++62aNm2q3r17e++jQYMGOvfcc/Xuu+9q8+bNevnll1WhQgVt2LBBknTw4EFdeumlat26tZYsWaLNmzfro48+0tKlSyURgMFCANrAAAGAmYIZgL5n8kp7O50zh4cOHdLZZ5+tyZMne7927NgxXXjhhXr11Ve9ATh16lTv9/fu3asqVaroo48+kiT17dtX/fv399vvkiVLVKFCBe/j0aBBA91zzz3e7584cUJ/+tOf9P7770uSPB6PatSoob179wY8TgIwOAhAGxggADBTKAbg6tWrZVmWUlJS/L5+2223qU+fPt4A3LZtm9/3mzRpotGjR0uSmjVrpkqVKqlatWrerWrVqrIsS+vWrZN0MgBfffVVv300atRIY8aMkSQNHDhQ119/faHHSQAGBwFoAwMEAGYKxaeAgxGA//d//6chQ4Zo8+bNBbajR49KOhmAb731lt8+GjdurOjoaEnSo48+SgCWAgLQBgYIAMwUim8COXTokCpVqlTgKeC//OUveu2117wBmP90ryTt27dPVatW9X6tZ8+eatOmTZH3U1wAJiUlqWbNmjwF7DAC0AYGCADMFIoBKEnDhg3ThRdeqE8//dTvTSD79u3zBmBERIQ+//xz/fTTT+rcubPq16/vPbu3evVqValSRYMHD1ZycrI2bdqk2bNna/Dgwd77KC4Ajx49qiuuuEKtW7fWN998oy1btmjGjBm8CSTICEAbGCAAMFOoBmB2draGDBmiunXrFnoZmI8//lgRERGqVKmSmjdvrtWrV/vt47vvvlPbtm1VvXp1VatWTY0aNdKLL77o/X5xAShJKSkp+te//qWaNWuqatWqatasmVasWCGJAAwWAtAGBggAzBSqAViU/ADMzMx0+1BKhAAsGgFoAwMEAGYiAAsiAM1CANrAAAGAmcpCAJY1BKBZCEAbGCAAMBMBWP4RgEUjAG1ggADATARg+UcAFo0AtIEBAgAzEYDlHwFYNALQBgYIAMyUH4CtbQTgkSNHHDgylNSRI0cIwCKUywB86aWX1KxZM1WvXl316tVTly5dtGHDBr/bZGdna9CgQTr33HNVrVo1devWTbt27fK7zbZt23TzzTerSpUqqlevnh577DEdP368xMfBAAGAmewEYG5urtatW6eMjAwHjgwllZGRoXXr1ik3N7fA91i/y2kAtm/fXomJiVq7dq1+/PFH3Xzzzapfv74OHTrkvc2AAQN08cUX64svvtDKlSvVokULXXvttd7v5+bmKjIyUjfddJOSk5M1b9481a1bV0888USJj4MBAgAz2XkKWJJ27tzpjcAjR44oOzubrZS2I0eOeONv586dAf98WL/LaQCeKj09XZZl6auvvpIkZWVl6eyzz9b06dO9t1m/fr0sy9KyZcskSfPmzVOFChX8zgq+//77qlmzpvcjbYrDAAGAmeycAZSkEydOeCOQzZ1t586dOnHiRMA/H9ZvQwJw8+bNsixLP/30kyTpiy++CHitovr16+vNN9+UJD3zzDMFPkpm69atsixLq1atCng/OTk52r9/v3dLTU0N+QECABPZDcB8ubm5rp8RC8Ut0NO+vghAAwIwLy9Pt9xyi6677jrv1yZPnqxKlSoVuO0111yjkSNHSpL69eundu3a+X3/8OHDsixL8+bNC3hf0dHRsiyrwBbKAwQAJrL7FDDKNgLQgAAcMGCAGjRooNTUVO/XnApAzgACQGggAM1GAJbzABw8eLAu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\" width=\"640\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"method[-1] = \"cython\"\n",
|
|
"res_c = ai.integrate1d(img, npt, unit=unit, method=method, error_model=\"poisson\")\n",
|
|
"method[-1] = \"python\"\n",
|
|
"res_n = ai.integrate1d(img, npt, unit=unit, method=method, error_model=\"poisson\")\n",
|
|
"method[-1] = \"opencl\"\n",
|
|
"res_o = ai.integrate1d(img, npt, unit=unit, method=method, error_model=\"poisson\")\n",
|
|
"ax = jupyter.plot1d(res_c)\n",
|
|
"ax.errorbar(*res_n, label=\"numpy\")\n",
|
|
"ax.errorbar(*res_o, label=\"opencl\")\n",
|
|
"_=ax.legend()\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"CPU times: user 1.03 s, sys: 351 ms, total: 1.38 s\n",
|
|
"Wall time: 98.5 ms\n",
|
|
"CPU times: user 114 ms, sys: 0 ns, total: 114 ms\n",
|
|
"Wall time: 114 ms\n"
|
|
]
|
|
},
|
|
{
|
|
"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",
|
|
" if (this.ratio !== 1) {\n",
|
|
" fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\n",
|
|
" }\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 (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",
|
|
" // 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",
|
|
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
|
" * transferred with MIME type text/plain:\" errors on\n",
|
|
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
|
" * to be part of the websocket stream */\n",
|
|
" evt.data.type = 'image/png';\n",
|
|
"\n",
|
|
" /* Free the memory for the previous frames */\n",
|
|
" if (fig.imageObj.src) {\n",
|
|
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
|
" fig.imageObj.src\n",
|
|
" );\n",
|
|
" }\n",
|
|
"\n",
|
|
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
|
" evt.data\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.which === this._key) {\n",
|
|
" return;\n",
|
|
" } else {\n",
|
|
" this._key = event.which;\n",
|
|
" }\n",
|
|
" }\n",
|
|
" if (name === 'key_release') {\n",
|
|
" this._key = null;\n",
|
|
" }\n",
|
|
"\n",
|
|
" var value = '';\n",
|
|
" if (event.ctrlKey && event.which !== 17) {\n",
|
|
" value += 'ctrl+';\n",
|
|
" }\n",
|
|
" if (event.altKey && event.which !== 18) {\n",
|
|
" value += 'alt+';\n",
|
|
" }\n",
|
|
" if (event.shiftKey && event.which !== 16) {\n",
|
|
" value += 'shift+';\n",
|
|
" }\n",
|
|
"\n",
|
|
" value += 'k';\n",
|
|
" value += event.which.toString();\n",
|
|
"\n",
|
|
" this._key_event_extra(event, name);\n",
|
|
"\n",
|
|
" this.send_message(name, { key: value, 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\", \"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.close = function () {\n",
|
|
" comm.close();\n",
|
|
" };\n",
|
|
" ws.send = function (m) {\n",
|
|
" //console.log('sending', m);\n",
|
|
" comm.send(m);\n",
|
|
" };\n",
|
|
" // Register the callback with on_msg.\n",
|
|
" comm.on_msg(function (msg) {\n",
|
|
" //console.log('receiving', msg['content']['data'], msg);\n",
|
|
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
|
|
" ws.onmessage(msg['content']['data']);\n",
|
|
" });\n",
|
|
" return ws;\n",
|
|
"};\n",
|
|
"\n",
|
|
"mpl.mpl_figure_comm = function (comm, msg) {\n",
|
|
" // This is the function which gets called when the mpl process\n",
|
|
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
|
"\n",
|
|
" var id = msg.content.data.id;\n",
|
|
" // Get hold of the div created by the display call when the Comm\n",
|
|
" // socket was opened in Python.\n",
|
|
" var element = 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeXQUVd4+8AIkSMBiFwKYgAvIvsfxnXGYHzo6C6LOpuM7ir4uM4qKM47b2FUF4goKKjCKGwgqi8iiiLJoWEJWsgJJIGQhIRshSYemIQmE5/dHpYvubCSprqru9PM5p84x3dVV3w5X6uFW3XsFEBEREVFAEawugIiIiIjMxQBIREREFGAYAImIiIgCDAMgERERUYBhACQiIiIKMAyARERERAGGAZCIiIgowDAAEhEREQUYBkAiIiKiAMMASERERBRgGACJiIiIAgwDIBEREVGAYQAkIiIiCjAMgEREREQBhgGQiIiIKMAwABIREREFGAZAIiIiogDDAEhEREQUYBgAiYiIiAIMAyARERFRgGEAJCIiIgowDIBEREREAYYBkIiIiCjAMAASERERBRgGQCIiIqIAwwBIREREFGAYAImIiIgCDAMgERERUYBhACQiIiIKMAyARERERAGGAZCIiIgowDAAEhEREQUYBkAiIiKiAMMASERERBRgGACJyOfNnDkTYWFhVpdhualTp2Lq1KlWl0FE7QADIBG1isPhgCzLuO2229CrVy8IgoDly5c3uu/UqVMhCAIEQUCHDh1wxRVXYNiwYfjb3/6G7du3t/icegLgd999B0VR2vRZKxw6dAiKoiAnJ6fBewyAROQtDIBE1Co5OTkQBAGhoaH41a9+dckAOHjwYKxatQqrVq3CBx98gH//+9+4+uqrIQgC/vKXv6CmpuaS56ypqUFVVVWb6p01axYEwX/+qvvqq68gCAIiIiIavFddXY3q6mrziyKidsd//lYkIp9QVVWFoqIiAEB8fPwlA+CoUaMavH7+/Hk8/vjjEAQBzz33nJHlWh4AT58+3ar9mwuARETewgBIRG3W1gAIqCFw5MiRCA4Oht1ub/Y89W8Bu3ohFyxYgGXLluHqq69GUFAQJk+ejLi4OI/PuW5Bu28utbW1WLRoEUaOHIkuXbrgyiuvxKOPPory8nKP89fW1kJRFISEhKBr16741a9+hUOHDiEsLAwzZ87U9lu+fDkEQcCuXbvw2GOPoV+/fujZsycAIDc3F4899hiGDRuGyy+/HL1798af/vQnj1u9rs/X31xhsLFbwCUlJfi///s/XHnllejSpQvGjh2LFStWeOzT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YgBkANTFzAbkesYv1m2SXqfDjhibOmrzwCs/BxQROXNHGV4LBYb4+bfXtbkpfBaTiNoVBkAGQF1MDYAf/QtQRMTYpngEQNfauUfnjgUUEZnScF6syStitq4EFBHl8kAUHc+yuhwiIq9hADQ4AN5///3YvXu3kaewlKkBcNlTdQEw3CMARtluABQRRcpQQBGRIY1kACSvKDqepa00E/vD51aXQ0TkNQyABgfAO+64A507d8a1116LV199FcePHzfydKYzNQC+P0sd7NFEADwtX6muFSyNZgAkrygtzkNc3TOme5b+w+pyiIi8hgHQhFvAJ06cwNtvv42xY8fisssuw29+8xt89dVXqKmpMfrUhjOzAe1b+vcGARAAIlcqHkunpUpjGQDJK9z/gRG96F6ryyEi8hoGQJOfAUxISMATTzyByy+/HH379sXTTz+NI0eOmFmCV5kaABf/nzoi03aDR8CLWvOmRwBMksYzAJLXuOafTFgw3epSiIi8hgHQxABYWFiIN954A8OHD0e3bt1w//334+abb8Zll12GhQsXmlWGV5nZgKLeua/RABj99WKPALjfNokBkLwm/ttlgCLi4Ks3WV0KEZHXMAAaHABramqwfv16/P73v0fnzp0xadIkvP/++x6/8A0bNqBnz55GlmEYU+cBrJvoOareLeB9G//rEQCj6wVEIj1SItaro8xfHmd1KUREXsMAaHAA7NOnD3r16oXHH38cSUmNLypfUVGBIUOGGFmGYcxsQLFv/bHRgBezdUW9ABjOAEheczhhV90o86utLoWIyGsYAA0OgCtXrsTZs2eNPIWlzGxA+9+6Uw14X8zzfP3HdR4BMME2gQGQvObogVhAEeGU+7JdEVG7wQBocAB88MEHcerUqQavnz59Gg8++GCLj7N7925Mnz4dISEhEAQBGzdu9Hj/woULkCQJAwYMwOWXX46bb765RYNLlixZgrCwMHTp0gXh4eGIjY1tcU2AuQ0oYf7v1XkA177p8XrmwTiPAJgtXccLNXlNaXG+1rZKjmdbXQ4RkVcwABocADt27IiSkpIGr5eWlqJTp04tPs7WrVvx0ksvYcOGDY0GwDfeeAM9evTApk2bkJKSghkzZmDo0KHN9j6uWbMGQUFB+PTTT3Ho0CE88sgj6NmzZ6P1NsXMBpT0xq3qhLzrF3m8fqIwV7tAn5N7qr01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\" width=\"640\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"cutof = 0\n",
|
|
"max_iter= 5\n",
|
|
"method[-1] = \"cython\"\n",
|
|
"res_i = ai.integrate1d(img, npt, unit=unit, method=method, error_model=\"poisson\")\n",
|
|
"# method[-1] = \"python\"\n",
|
|
"%time res_s = ai.sigma_clip_ng(img, npt, unit=unit, method=method, error_model=\"azimuthal\", \\\n",
|
|
" max_iter=max_iter, thres=cutof)\n",
|
|
"method[-1] = \"opencl\"\n",
|
|
"%time res_o = ai.sigma_clip_ng(img, npt, unit=unit, method=method, error_model=\"azimuthal\", \\\n",
|
|
" max_iter=max_iter, thres=cutof)\n",
|
|
"\n",
|
|
"ax = jupyter.plot1d(res_s)\n",
|
|
"# ax.errorbar(*res_n, label=\"numpy\")\n",
|
|
"# ax.errorbar(*res_s, label=\"sigma_clip\")\n",
|
|
"ax.errorbar(*res_o, label=\"opencl\")\n",
|
|
"# ax.errorbar(*res_i, label=\"integrate\")\n",
|
|
"ax.plot(res_s[0],1e6*(res_s[2]-res_o[2]), label=\"delta\")\n",
|
|
"_=ax.legend()\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3.9 (local venv)",
|
|
"language": "python",
|
|
"name": "py39-venv"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.9.2"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 1
|
|
}
|