Created
January 16, 2020 09:33
-
-
Save vlad-bezden/6e2c0328a865b15b25b0c86db5a2b1c2 to your computer and use it in GitHub Desktop.
Calculates how many seconds, or minutes to take to run one circle (1/4 of mile) on the treadmill, and difference in seconds between with increasing speed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Calculates how many seconds, or minutes to take to run one circle (1/4 of mile) on the treadmill, and difference in seconds between with increasing speed" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from matplotlib import pyplot as plt\n", | |
"import numpy as np\n", | |
"%matplotlib notebook" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"speed = 1, seconds = 900, (min, sec) = (15, 0)\n", | |
"speed = 2, seconds = 450, (min, sec) = (7, 30)\n", | |
"speed = 3, seconds = 300, (min, sec) = (5, 0)\n", | |
"speed = 4, seconds = 225, (min, sec) = (3, 45)\n", | |
"speed = 5, seconds = 180, (min, sec) = (3, 0)\n", | |
"speed = 6, seconds = 150, (min, sec) = (2, 30)\n", | |
"speed = 7, seconds = 129, (min, sec) = (2, 8)\n", | |
"speed = 8, seconds = 112, (min, sec) = (1, 52)\n", | |
"speed = 9, seconds = 100, (min, sec) = (1, 40)\n", | |
"speed = 10, seconds = 90, (min, sec) = (1, 30)\n", | |
"speed = 11, seconds = 82, (min, sec) = (1, 21)\n", | |
"speed = 12, seconds = 75, (min, sec) = (1, 15)\n", | |
"speed = 13, seconds = 69, (min, sec) = (1, 9)\n", | |
"speed = 14, seconds = 64, (min, sec) = (1, 4)\n", | |
"speed = 15, seconds = 60, (min, sec) = (1, 0)\n" | |
] | |
} | |
], | |
"source": [ | |
"speeds = range(1, 16)\n", | |
"times = []\n", | |
"seconds_per_hour = 60 * 60\n", | |
"\n", | |
"for speed in speeds:\n", | |
" seconds = seconds_per_hour / speed / 4\n", | |
" times.append(seconds)\n", | |
" print(f\"{speed = }, {seconds = :.0f}, (min, sec) = {divmod(int(times[-1]), 60)}\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"speed = 2, diff = -450 seconds\n", | |
"speed = 3, diff = -150 seconds\n", | |
"speed = 4, diff = -75 seconds\n", | |
"speed = 5, diff = -45 seconds\n", | |
"speed = 6, diff = -30 seconds\n", | |
"speed = 7, diff = -21 seconds\n", | |
"speed = 8, diff = -16 seconds\n", | |
"speed = 9, diff = -12 seconds\n", | |
"speed = 10, diff = -10 seconds\n", | |
"speed = 11, diff = -8 seconds\n", | |
"speed = 12, diff = -7 seconds\n", | |
"speed = 13, diff = -6 seconds\n", | |
"speed = 14, diff = -5 seconds\n", | |
"speed = 15, diff = -4 seconds\n" | |
] | |
} | |
], | |
"source": [ | |
"diffs = np.diff(times)\n", | |
"\n", | |
"for speed, diff in zip(speeds[1:], diffs):\n", | |
" print(f\"{speed = }, {diff = :.0f} seconds\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/javascript": [ | |
"/* Put everything inside the global mpl namespace */\n", | |
"window.mpl = {};\n", | |
"\n", | |
"\n", | |
"mpl.get_websocket_type = function() {\n", | |
" if (typeof(WebSocket) !== 'undefined') {\n", | |
" return WebSocket;\n", | |
" } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
" return MozWebSocket;\n", | |
" } else {\n", | |
" alert('Your browser does not have WebSocket support. ' +\n", | |
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
" 'Firefox 4 and 5 are also supported but you ' +\n", | |
" 'have to enable WebSockets in about:config.');\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
" this.id = figure_id;\n", | |
"\n", | |
" this.ws = websocket;\n", | |
"\n", | |
" this.supports_binary = (this.ws.binaryType != undefined);\n", | |
"\n", | |
" if (!this.supports_binary) {\n", | |
" var warnings = document.getElementById(\"mpl-warnings\");\n", | |
" if (warnings) {\n", | |
" warnings.style.display = 'block';\n", | |
" warnings.textContent = (\n", | |
" \"This browser does not support binary websocket messages. \" +\n", | |
" \"Performance may be slow.\");\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.imageObj = new Image();\n", | |
"\n", | |
" this.context = undefined;\n", | |
" this.message = undefined;\n", | |
" this.canvas = undefined;\n", | |
" this.rubberband_canvas = undefined;\n", | |
" this.rubberband_context = undefined;\n", | |
" this.format_dropdown = undefined;\n", | |
"\n", | |
" this.image_mode = 'full';\n", | |
"\n", | |
" this.root = $('<div/>');\n", | |
" this._root_extra_style(this.root)\n", | |
" this.root.attr('style', 'display: inline-block');\n", | |
"\n", | |
" $(parent_element).append(this.root);\n", | |
"\n", | |
" this._init_header(this);\n", | |
" this._init_canvas(this);\n", | |
" this._init_toolbar(this);\n", | |
"\n", | |
" var fig = this;\n", | |
"\n", | |
" this.waiting = false;\n", | |
"\n", | |
" this.ws.onopen = function () {\n", | |
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
" fig.send_message(\"send_image_mode\", {});\n", | |
" if (mpl.ratio != 1) {\n", | |
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", | |
" }\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" }\n", | |
"\n", | |
" this.imageObj.onload = function() {\n", | |
" if (fig.image_mode == 'full') {\n", | |
" // Full images could contain transparency (where diff images\n", | |
" // almost always do), so we need to clear the canvas so that\n", | |
" // there is no ghosting.\n", | |
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
" }\n", | |
" fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
" };\n", | |
"\n", | |
" this.imageObj.onunload = function() {\n", | |
" fig.ws.close();\n", | |
" }\n", | |
"\n", | |
" this.ws.onmessage = this._make_on_message_function(this);\n", | |
"\n", | |
" this.ondownload = ondownload;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_header = function() {\n", | |
" var titlebar = $(\n", | |
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", | |
" 'ui-helper-clearfix\"/>');\n", | |
" var titletext = $(\n", | |
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", | |
" 'text-align: center; padding: 3px;\"/>');\n", | |
" titlebar.append(titletext)\n", | |
" this.root.append(titlebar);\n", | |
" this.header = titletext[0];\n", | |
"}\n", | |
"\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_canvas = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var canvas_div = $('<div/>');\n", | |
"\n", | |
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
"\n", | |
" function canvas_keyboard_event(event) {\n", | |
" return fig.key_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
" canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
" this.canvas_div = canvas_div\n", | |
" this._canvas_extra_style(canvas_div)\n", | |
" this.root.append(canvas_div);\n", | |
"\n", | |
" var canvas = $('<canvas/>');\n", | |
" canvas.addClass('mpl-canvas');\n", | |
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
"\n", | |
" this.canvas = canvas[0];\n", | |
" this.context = canvas[0].getContext(\"2d\");\n", | |
"\n", | |
" var backingStore = this.context.backingStorePixelRatio ||\n", | |
"\tthis.context.webkitBackingStorePixelRatio ||\n", | |
"\tthis.context.mozBackingStorePixelRatio ||\n", | |
"\tthis.context.msBackingStorePixelRatio ||\n", | |
"\tthis.context.oBackingStorePixelRatio ||\n", | |
"\tthis.context.backingStorePixelRatio || 1;\n", | |
"\n", | |
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", | |
"\n", | |
" var rubberband = $('<canvas/>');\n", | |
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
"\n", | |
" var pass_mouse_events = true;\n", | |
"\n", | |
" canvas_div.resizable({\n", | |
" start: function(event, ui) {\n", | |
" pass_mouse_events = false;\n", | |
" },\n", | |
" resize: function(event, ui) {\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" stop: function(event, ui) {\n", | |
" pass_mouse_events = true;\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" });\n", | |
"\n", | |
" function mouse_event_fn(event) {\n", | |
" if (pass_mouse_events)\n", | |
" return fig.mouse_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" rubberband.mousedown('button_press', mouse_event_fn);\n", | |
" rubberband.mouseup('button_release', mouse_event_fn);\n", | |
" // Throttle sequential mouse events to 1 every 20ms.\n", | |
" rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
"\n", | |
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
"\n", | |
" canvas_div.on(\"wheel\", function (event) {\n", | |
" event = event.originalEvent;\n", | |
" event['data'] = 'scroll'\n", | |
" if (event.deltaY < 0) {\n", | |
" event.step = 1;\n", | |
" } else {\n", | |
" event.step = -1;\n", | |
" }\n", | |
" mouse_event_fn(event);\n", | |
" });\n", | |
"\n", | |
" canvas_div.append(canvas);\n", | |
" canvas_div.append(rubberband);\n", | |
"\n", | |
" this.rubberband = rubberband;\n", | |
" this.rubberband_canvas = rubberband[0];\n", | |
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
" this.rubberband_context.strokeStyle = \"#000000\";\n", | |
"\n", | |
" this._resize_canvas = function(width, height) {\n", | |
" // Keep the size of the canvas, canvas container, and rubber band\n", | |
" // canvas in synch.\n", | |
" canvas_div.css('width', width)\n", | |
" canvas_div.css('height', height)\n", | |
"\n", | |
" canvas.attr('width', width * mpl.ratio);\n", | |
" canvas.attr('height', height * mpl.ratio);\n", | |
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", | |
"\n", | |
" rubberband.attr('width', width);\n", | |
" rubberband.attr('height', height);\n", | |
" }\n", | |
"\n", | |
" // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
" // upon first draw.\n", | |
" this._resize_canvas(600, 600);\n", | |
"\n", | |
" // Disable right mouse context menu.\n", | |
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
" return false;\n", | |
" });\n", | |
"\n", | |
" function set_focus () {\n", | |
" canvas.focus();\n", | |
" canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" window.setTimeout(set_focus, 100);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>');\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items) {\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) {\n", | |
" // put a spacer in here.\n", | |
" continue;\n", | |
" }\n", | |
" var button = $('<button/>');\n", | |
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
" 'ui-button-icon-only');\n", | |
" button.attr('role', 'button');\n", | |
" button.attr('aria-disabled', 'false');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
"\n", | |
" var icon_img = $('<span/>');\n", | |
" icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
" icon_img.addClass(image);\n", | |
" icon_img.addClass('ui-corner-all');\n", | |
"\n", | |
" var tooltip_span = $('<span/>');\n", | |
" tooltip_span.addClass('ui-button-text');\n", | |
" tooltip_span.html(tooltip);\n", | |
"\n", | |
" button.append(icon_img);\n", | |
" button.append(tooltip_span);\n", | |
"\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" var fmt_picker_span = $('<span/>');\n", | |
"\n", | |
" var fmt_picker = $('<select/>');\n", | |
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
" fmt_picker_span.append(fmt_picker);\n", | |
" nav_element.append(fmt_picker_span);\n", | |
" this.format_dropdown = fmt_picker[0];\n", | |
"\n", | |
" for (var ind in mpl.extensions) {\n", | |
" var fmt = mpl.extensions[ind];\n", | |
" var option = $(\n", | |
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
" fmt_picker.append(option);\n", | |
" }\n", | |
"\n", | |
" // Add hover states to the ui-buttons\n", | |
" $( \".ui-button\" ).hover(\n", | |
" function() { $(this).addClass(\"ui-state-hover\");},\n", | |
" function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
" );\n", | |
"\n", | |
" var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
" // which will in turn request a refresh of the image.\n", | |
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_message = function(type, properties) {\n", | |
" properties['type'] = type;\n", | |
" properties['figure_id'] = this.id;\n", | |
" this.ws.send(JSON.stringify(properties));\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_draw_message = function() {\n", | |
" if (!this.waiting) {\n", | |
" this.waiting = true;\n", | |
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" var format_dropdown = fig.format_dropdown;\n", | |
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
" fig.ondownload(fig, format);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
" var size = msg['size'];\n", | |
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
" fig._resize_canvas(size[0], size[1]);\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
" var x0 = msg['x0'] / mpl.ratio;\n", | |
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", | |
" var x1 = msg['x1'] / mpl.ratio;\n", | |
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", | |
" x0 = Math.floor(x0) + 0.5;\n", | |
" y0 = Math.floor(y0) + 0.5;\n", | |
" x1 = Math.floor(x1) + 0.5;\n", | |
" y1 = Math.floor(y1) + 0.5;\n", | |
" var min_x = Math.min(x0, x1);\n", | |
" var min_y = Math.min(y0, y1);\n", | |
" var width = Math.abs(x1 - x0);\n", | |
" var height = Math.abs(y1 - y0);\n", | |
"\n", | |
" fig.rubberband_context.clearRect(\n", | |
" 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", | |
"\n", | |
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
" // Updates the figure title.\n", | |
" fig.header.textContent = msg['label'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
" var cursor = msg['cursor'];\n", | |
" switch(cursor)\n", | |
" {\n", | |
" case 0:\n", | |
" cursor = 'pointer';\n", | |
" break;\n", | |
" case 1:\n", | |
" cursor = 'default';\n", | |
" break;\n", | |
" case 2:\n", | |
" cursor = 'crosshair';\n", | |
" break;\n", | |
" case 3:\n", | |
" cursor = 'move';\n", | |
" break;\n", | |
" }\n", | |
" fig.rubberband_canvas.style.cursor = cursor;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
" fig.message.textContent = msg['message'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
" // Request the server to send over a new figure.\n", | |
" fig.send_draw_message();\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
" fig.image_mode = msg['mode'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Called whenever the canvas gets updated.\n", | |
" this.send_message(\"ack\", {});\n", | |
"}\n", | |
"\n", | |
"// A function to construct a web socket function for onmessage handling.\n", | |
"// Called in the figure constructor.\n", | |
"mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
" return function socket_on_message(evt) {\n", | |
" if (evt.data instanceof Blob) {\n", | |
" /* FIXME: We get \"Resource interpreted as Image but\n", | |
" * transferred with MIME type text/plain:\" errors on\n", | |
" * Chrome. But how to set the MIME type? It doesn't seem\n", | |
" * to be part of the websocket stream */\n", | |
" evt.data.type = \"image/png\";\n", | |
"\n", | |
" /* Free the memory for the previous frames */\n", | |
" if (fig.imageObj.src) {\n", | |
" (window.URL || window.webkitURL).revokeObjectURL(\n", | |
" fig.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
" evt.data);\n", | |
" fig.updated_canvas_event();\n", | |
" fig.waiting = false;\n", | |
" return;\n", | |
" }\n", | |
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", | |
" fig.imageObj.src = evt.data;\n", | |
" fig.updated_canvas_event();\n", | |
" fig.waiting = false;\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var msg = JSON.parse(evt.data);\n", | |
" var msg_type = msg['type'];\n", | |
"\n", | |
" // Call the \"handle_{type}\" callback, which takes\n", | |
" // the figure and JSON message as its only arguments.\n", | |
" try {\n", | |
" var callback = fig[\"handle_\" + msg_type];\n", | |
" } catch (e) {\n", | |
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" if (callback) {\n", | |
" try {\n", | |
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", | |
" callback(fig, msg);\n", | |
" } catch (e) {\n", | |
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", | |
" }\n", | |
" }\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", | |
"mpl.findpos = function(e) {\n", | |
" //this section is from http://www.quirksmode.org/js/events_properties.html\n", | |
" var targ;\n", | |
" if (!e)\n", | |
" e = window.event;\n", | |
" if (e.target)\n", | |
" targ = e.target;\n", | |
" else if (e.srcElement)\n", | |
" targ = e.srcElement;\n", | |
" if (targ.nodeType == 3) // defeat Safari bug\n", | |
" targ = targ.parentNode;\n", | |
"\n", | |
" // jQuery normalizes the pageX and pageY\n", | |
" // pageX,Y are the mouse positions relative to the document\n", | |
" // offset() returns the position of the element relative to the document\n", | |
" var x = e.pageX - $(targ).offset().left;\n", | |
" var y = e.pageY - $(targ).offset().top;\n", | |
"\n", | |
" return {\"x\": x, \"y\": y};\n", | |
"};\n", | |
"\n", | |
"/*\n", | |
" * return a copy of an object with only non-object keys\n", | |
" * we need this to avoid circular references\n", | |
" * http://stackoverflow.com/a/24161582/3208463\n", | |
" */\n", | |
"function simpleKeys (original) {\n", | |
" return Object.keys(original).reduce(function (obj, key) {\n", | |
" if (typeof original[key] !== 'object')\n", | |
" obj[key] = original[key]\n", | |
" return obj;\n", | |
" }, {});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.mouse_event = function(event, name) {\n", | |
" var canvas_pos = mpl.findpos(event)\n", | |
"\n", | |
" if (name === 'button_press')\n", | |
" {\n", | |
" this.canvas.focus();\n", | |
" this.canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" var x = canvas_pos.x * mpl.ratio;\n", | |
" var y = canvas_pos.y * mpl.ratio;\n", | |
"\n", | |
" this.send_message(name, {x: x, y: y, button: event.button,\n", | |
" step: event.step,\n", | |
" guiEvent: simpleKeys(event)});\n", | |
"\n", | |
" /* This prevents the web browser from automatically changing to\n", | |
" * the text insertion cursor when the button is pressed. We want\n", | |
" * to control all of the cursor setting manually through the\n", | |
" * 'cursor' event from matplotlib */\n", | |
" event.preventDefault();\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" // Handle any extra behaviour associated with a key event\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.key_event = function(event, name) {\n", | |
"\n", | |
" // Prevent repeat events\n", | |
" if (name == 'key_press')\n", | |
" {\n", | |
" if (event.which === this._key)\n", | |
" return;\n", | |
" else\n", | |
" this._key = event.which;\n", | |
" }\n", | |
" if (name == 'key_release')\n", | |
" this._key = null;\n", | |
"\n", | |
" var value = '';\n", | |
" if (event.ctrlKey && event.which != 17)\n", | |
" value += \"ctrl+\";\n", | |
" if (event.altKey && event.which != 18)\n", | |
" value += \"alt+\";\n", | |
" if (event.shiftKey && event.which != 16)\n", | |
" value += \"shift+\";\n", | |
"\n", | |
" value += 'k';\n", | |
" value += event.which.toString();\n", | |
"\n", | |
" this._key_event_extra(event, name);\n", | |
"\n", | |
" this.send_message(name, {key: value,\n", | |
" guiEvent: simpleKeys(event)});\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
" if (name == 'download') {\n", | |
" this.handle_save(this, null);\n", | |
" } else {\n", | |
" this.send_message(\"toolbar_button\", {name: name});\n", | |
" }\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
" this.message.textContent = tooltip;\n", | |
"};\n", | |
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
"\n", | |
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", | |
"\n", | |
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
" // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
" // object with the appropriate methods. Currently this is a non binary\n", | |
" // socket, so there is still some room for performance tuning.\n", | |
" var ws = {};\n", | |
"\n", | |
" ws.close = function() {\n", | |
" comm.close()\n", | |
" };\n", | |
" ws.send = function(m) {\n", | |
" //console.log('sending', m);\n", | |
" comm.send(m);\n", | |
" };\n", | |
" // Register the callback with on_msg.\n", | |
" comm.on_msg(function(msg) {\n", | |
" //console.log('receiving', msg['content']['data'], msg);\n", | |
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n", | |
" ws.onmessage(msg['content']['data'])\n", | |
" });\n", | |
" return ws;\n", | |
"}\n", | |
"\n", | |
"mpl.mpl_figure_comm = function(comm, msg) {\n", | |
" // This is the function which gets called when the mpl process\n", | |
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
"\n", | |
" var id = msg.content.data.id;\n", | |
" // Get hold of the div created by the display call when the Comm\n", | |
" // socket was opened in Python.\n", | |
" var element = $(\"#\" + id);\n", | |
" var ws_proxy = comm_websocket_adapter(comm)\n", | |
"\n", | |
" function ondownload(figure, format) {\n", | |
" window.open(figure.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" var fig = new mpl.figure(id, ws_proxy,\n", | |
" ondownload,\n", | |
" element.get(0));\n", | |
"\n", | |
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
" // web socket which is closed, not our websocket->open comm proxy.\n", | |
" ws_proxy.onopen();\n", | |
"\n", | |
" fig.parent_element = element.get(0);\n", | |
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
" if (!fig.cell_info) {\n", | |
" console.error(\"Failed to find cell for figure\", id, fig);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var output_index = fig.cell_info[2]\n", | |
" var cell = fig.cell_info[0];\n", | |
"\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
" var width = fig.canvas.width/mpl.ratio\n", | |
" fig.root.unbind('remove')\n", | |
"\n", | |
" // Update the output cell to use the data from the current canvas.\n", | |
" fig.push_to_output();\n", | |
" var dataURL = fig.canvas.toDataURL();\n", | |
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n", | |
" // the notebook keyboard shortcuts fail.\n", | |
" IPython.keyboard_manager.enable()\n", | |
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", | |
" fig.close_ws(fig, msg);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.close_ws = function(fig, msg){\n", | |
" fig.send_message('closing', msg);\n", | |
" // fig.ws.close()\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", | |
" // Turn the data on the canvas into data in the output cell.\n", | |
" var width = this.canvas.width/mpl.ratio\n", | |
" var dataURL = this.canvas.toDataURL();\n", | |
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Tell IPython that the notebook contents must change.\n", | |
" IPython.notebook.set_dirty(true);\n", | |
" this.send_message(\"ack\", {});\n", | |
" var fig = this;\n", | |
" // Wait a second, then push the new image to the DOM so\n", | |
" // that it is saved nicely (might be nice to debounce this).\n", | |
" setTimeout(function () { fig.push_to_output() }, 1000);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>');\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items){\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) { continue; };\n", | |
"\n", | |
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" // Add the status bar.\n", | |
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"\n", | |
" // Add the close button to the window.\n", | |
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", | |
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", | |
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n", | |
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n", | |
" buttongrp.append(button);\n", | |
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", | |
" titlebar.prepend(buttongrp);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(el){\n", | |
" var fig = this\n", | |
" el.on(\"remove\", function(){\n", | |
"\tfig.close_ws(fig, {});\n", | |
" });\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
" // this is important to make the div 'focusable\n", | |
" el.attr('tabindex', 0)\n", | |
" // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
" // off when our div gets focus\n", | |
"\n", | |
" // location in version 3\n", | |
" if (IPython.notebook.keyboard_manager) {\n", | |
" IPython.notebook.keyboard_manager.register_events(el);\n", | |
" }\n", | |
" else {\n", | |
" // location in version 2\n", | |
" IPython.keyboard_manager.register_events(el);\n", | |
" }\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" var manager = IPython.notebook.keyboard_manager;\n", | |
" if (!manager)\n", | |
" manager = IPython.keyboard_manager;\n", | |
"\n", | |
" // Check for shift+enter\n", | |
" if (event.shiftKey && event.which == 13) {\n", | |
" this.canvas_div.blur();\n", | |
" // 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", | |
"\n", | |
"mpl.find_output_cell = function(html_output) {\n", | |
" // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
" // IPython event is triggered only after the cells have been serialised, which for\n", | |
" // our purposes (turning an active figure into a static one), is too late.\n", | |
" var cells = IPython.notebook.get_cells();\n", | |
" var ncells = cells.length;\n", | |
" for (var i=0; i<ncells; i++) {\n", | |
" var cell = cells[i];\n", | |
" if (cell.cell_type === 'code'){\n", | |
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
" var data = cell.output_area.outputs[j];\n", | |
" if (data.data) {\n", | |
" // IPython >= 3 moved mimebundle to data attribute of output\n", | |
" data = data.data;\n", | |
" }\n", | |
" if (data['text/html'] == html_output) {\n", | |
" return [cell, data, j];\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"// Register the function which deals with the matplotlib target/channel.\n", | |
"// The kernel may be null if the page has been refreshed.\n", | |
"if (IPython.notebook.kernel != null) {\n", | |
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
"}\n" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydB3RUxRvFL2mEQELvHQSkSe+iIAJ2wQKKvSCi/lVUQMUCShEbNhCwIIJgbyDSREABpRfpRXrvgZCe/7mzeXETNmSTl0223DknZ5PdmXkzv/levrvflFcgJSUlBUoiIAIiIAIiIAIiIAIBQ6CABGDAjLU6KgIiIAIiIAIiIAKGgASgDEEEREAEREAEREAEAoyABGCADbi6KwIiIAIiIAIiIAISgLIBERABERABERABEQgwAhKAATbg6q4IiIAIiIAIiIAISADKBkRABERABERABEQgwAhIAAbYgKu7IiACIiACIiACIiABKBsQAREQAREQAREQgQAjIAEYYAOu7oqACIiACIiACIiABKBsQAREQAREQAREQAQCjIAEYIANuLorAiIgAiIgAiIgAhKAsgEREAEREAEREAERCDACEoABNuDqrgiIgAiIgAiIgAhIAMoGREAEREAEREAERCDACEgABtiAq7siIAIiIAIiIAIiIAEoGxABERABERABERCBACMgARhgA67uioAIiIAIiIAIiIAEoGxABERABERABERABAKMgARggA24uisCIiACIiACIiACEoCyAREQAREQAREQAREIMAISgAE24OquCIiACIiACIiACEgAygZEQAREQAREQAREIMAISAAG2ICruyIgAiIgAiIgAiIgASgbEAEREAEREAEREIEAIyABGGADru6KgAiIgAiIgAiIgASgbEAEREAEREAEREAEAoyABGCADbi6KwIiIAIiIAIiIAISgLIBERABERABERABEQgwAhKAATbg6q4IiIAIiIAIiIAISADKBkRABERABERABEQgwAhIAAbYgKu7IiACIiACIiACIiABKBsQAREQAREQAREQgQAjIAEYYAOu7oqACIiACIiACIiABKBsQAREQAREQAREQAQCjIAEYIANuLorAiIgAiIgAiIgAhKAsgEREAEREAEREAERCDACEoABNuCB0N3PPvsM9913X1pXCxYsiGLFiqFu3bro0qULHnjgAZQpU8avUBQoUAAvv/wyBg8enK/94vWHDBmClJSUfG1HZhf/6quv8Morr2DHjh2IjY3FqlWr0LhxY69sq6cade+992L+/PnYuXOnpy7hdfVWq1YNHTp0AP835EYi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gkA4ArBx48bu9Wn2yrzMKC1atNCtt97q+gtHAG7cuFF16tTRnj17VLhw4cwYAn1AAAIBI4AADNiCM10IxAqBt956S8OHD9fXX3+tAgUKqEaNGlqwYIGuvPJK9+7pw4cPu9+9+OKLOnHihHsf78SJE5Pfx2vvqB09erSLnH377beqXLmye4fvgw8+mDzFTZs26fe//72WLl3q+jXhNm7cOBUrVszV+c9//qNu3bpp7ty5uvrqq13dhQsXqnr16ho/fnyaqPbv368SJUrIRJilYkPF3qVtY7H2S5Ys0bXXXqtXXnlFxYsXV6dOnbR69WrdfPPNmjVrlipVqpTczuZm41m5cqXrzwRgly5dHJc333zTCbzBgwe736Us9n5am++jjz4aK0vKOCAAgRxEAAGYgxaLoULALwRMsJUvX17PP/+8mjdvrqNHj2rZsmVq166drrrqKicA3377bd17771O5Gzfvl0dO3ZU586dNWLECIdh0KBBTriZULvhhhucyLM9eYmJibrrrrucKDTBZW2s3+PHj6t///46ffq0E2hWunfv7gSbCbVSpUpp4MCB+vjjj/XYY49dUgDOnz9fjzzyiEvBpkz/mgC0PXljx451AtKeZfv0rrvuOj399NNuvibWChUqpEWLFiUv5bvvvqvevXs7wWfFBKDx+OMf/+gEqwllm+vnn3+uG2+8Mbnd7373OyecX331Vb+YBfOAAASykAACMAth8ygIQOA8gU8//VS1atVyws4iZamLCUATZrt27XIix4pF15566ikdOXLEiTmLmpmQq1+/fnJzi7T9+OOPmj17toYMGeKiaiYIQyUpKUnx8fH66quvVKZMGRUtWlQzZ86UiSkrBw8eVLly5Vy07VIRQPu9RSK3bt16wbBNAFqkzoSbFdvPZ2N7+eWXk6N0c+bMcULWxh8q9iyLPo4ZMyZZAN5555167bXX3P9bpNPEqUVLTeCGiu0DXLdunT766CPMCgIQgEDEBBCAESOjAQQg4JXAmTNn1KRJE61atcr91yJdlroN7WczAbhz587kSJ09b8OGDS6yZqLRTsLaHjhL66Ysp06dcmljE34WPfzHP/6RnDIO1bO073vvvecEoPW3Y8cOF50LFWtvEcRLCcDnnnvOpXEtIpeymAB844039NBDD7lff/PNNy76Z3O0/X1WTKw1atTIidiCBQs6cWfjMGFoz7RiEcAePXo4sRsqt9xyix544AEnakPFooIffPCBmysFAhCAQKQEEICREqM+BCCQKQRM/CxfvlyLFy/WvHnz9N133zkxY3vbLicATbBZerdevXouXZv6KpS8efO6KN9vf/tbFz0cNWrUReMtXbq0tmzZ4sRipALwr3/9q4YOHeoOYKQWgDaPZs2auV+bULW5WJTOhKYVG68dHjl06JBLBdt877nnHidoc+fOnSwAn3zySdlPqFh763fYsGHJv7O9ixYhtRPJFAhAAAKREkAARkqM+hCAQKYTsIigpYItrWk/oRSwpWzz58/vnjdlyhR3SMOiZxbFs8MVJsbatm2b5ngsQmb7CD/77DNdccUVF9U5duyYihQp4qJ5LVu2dP9uwsxSwLZv8FIRwDVr1rjo44EDBy44gWsRwEgFoO05tDlaGjpU0joFnJYAtDSxnVgOpZwzfVHoEAIQ8DUBBKCvl5fJQSA2CVjk68MPP3SpXztRa/9vByvsgIVF7kKHQO677z63r86idLZ3zn4sBWvFfm/7Am3v3B133OEOZVhE0Q6RtG/f3kXoTDhZatXSqbZn0A5aWLrVhKNF3I3/FzoAAAIjSURBVCyKZulgOwRSsmRJd9jC9hVe7hCIiVVL29revoSEhGTAGRGA1apVc3v7LL0biQC0fY42H9vfaEKQAgEIQCBSAgjASIlRHwIQ8Ezgiy++UJ8+fdxhEBNuFv3r1auXevbs6foOXQNje9/sGpiTJ0+qVatWeuGFF2QpXiuWQrbDGC+99JK2bdvmUqo1a9Z0J3ntLR1WLM1rp3Ft7531Yc9p2rSpO6lrgs2igCmvgenXr5/sVO7lroGxfu2+Pkvx/u1vf8uwALQIol37YtfKmGiNRADac0042kXUFAhAAAIZIYAAzAg12kAAAlElEBKAFhGMxbJ3714n3tauXZvmKeZwxmwi1A5xWAQy0mIpaNsjmNmvoYt0HNSHAARyLgEEYM5dO0YOAd8SiHUBaODt0mrbQ5jRFKydGLbDKJG2twMj9uo4S2tbFJMCAQhAICMEEIAZoUYbCEAgqgRyggCMKgA6hwAEIBBlAgjAKAOmewhAAAIQgAAEIBBrBBCAsbYijAcCEIAABCAAAQhEmQACMMqA6R4CEIAABCAAAQjEGgEEYKytCOOBAAQgAAEIQAACUSaAAIwyYLqHAAQgAAEIQAACsUYAARhrK8J4IAABCEAAAhCAQJQJIACjDJjuIQABCEAAAhCAQKwRQADG2oowHghAAAIQgAAEIBBlAgjAKAOmewhAAAIQgAAEIBBrBBCAsbYijAcCEIAABCAAAQhEmcD/A4T/grdM08WKAAAAAElFTkSuQmCC\" width=\"640\">" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(speeds, times, label='sec/circle')\n", | |
"plt.plot(speeds[1:], diffs, label='diff/circle')\n", | |
"plt.legend(loc='upper right')\n", | |
"plt.title(\"Dependencies of seconds per circle\")\n", | |
"plt.xlabel(\"speed (m/h)\")\n", | |
"plt.ylabel(\"secons\");" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.8.0" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment