"
+ ],
+ "text/plain": [
+ "olin 9\n",
+ "wellesley 3\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bikeshare2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Negative bikes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the code we have so far, the number of bikes at one of the locations can go negative, and the number of bikes at the other location can exceed the actual number of bikes in the system.\n",
+ "\n",
+ "If you run this simulation a few times, it happens quite often."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "IOPub data rate exceeded.\n",
+ "The notebook server will temporarily stop sending output\n",
+ "to the client in order to avoid crashing it.\n",
+ "To change this limit, set the config variable\n",
+ "`--NotebookApp.iopub_data_rate_limit`.\n"
+ ]
+ }
+ ],
+ "source": [
+ "bikeshare = System(olin=10, wellesley=2)\n",
+ "newfig()\n",
+ "plot_system(bikeshare)\n",
+ "decorate_bikeshare()\n",
+ "run_steps(bikeshare, 60, 0.4, 0.2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "But this is relatively easy to fix, using the `return` statement to exit the function early if the update would cause negative bikes.\n",
+ "\n",
+ "If the second `if` statement seems confusing, remember that `n` can be negative."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def move_bike(system, n):\n",
+ " # make sure the number of bikes won't go negative\n",
+ " olin_temp = system.olin - n\n",
+ " if olin_temp < 0:\n",
+ " #print('No more bikes at Olin!')\n",
+ " return\n",
+ " \n",
+ " wellesley_temp = system.wellesley + n\n",
+ " if wellesley_temp < 0:\n",
+ " #print('No more bikes at Wellesley!')\n",
+ " return\n",
+ " \n",
+ " # update the system\n",
+ " system.olin = olin_temp\n",
+ " system.wellesley = wellesley_temp"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now if you run the simulation again, it should behave."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "IOPub data rate exceeded.\n",
+ "The notebook server will temporarily stop sending output\n",
+ "to the client in order to avoid crashing it.\n",
+ "To change this limit, set the config variable\n",
+ "`--NotebookApp.iopub_data_rate_limit`.\n"
+ ]
+ }
+ ],
+ "source": [
+ "bikeshare = System(olin=10, wellesley=2)\n",
+ "newfig()\n",
+ "plot_system(bikeshare)\n",
+ "decorate_bikeshare()\n",
+ "run_steps(bikeshare, 60, 0.4, 0.2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The variables `olin` and `wellesley` are created inside `move_bike`, so they are local. When the function ends, they go away.\n",
+ "\n",
+ "If you try to access a local variable from outside its function, you get an error:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# If you remove the # from the last line in this cell and run it, you'll get\n",
+ "# NameError: name 'olin' is not defined\n",
+ "\n",
+ "#olin"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Add print statements in `move_bike` so it prints a message each time a customer arrives and doesn't find a bike. Run the simulation again to confirm that it works as you expect. Then you might want to remove the print statements before you go on."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Comparison operators"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The `if` statements in the previous section used the comparison operator `<`. The other comparison operators are listed in the book.\n",
+ "\n",
+ "It is easy to confuse the comparison operator `==` with the assignment operator `=`.\n",
+ "\n",
+ "Remember that `=` creates a variable or gives an existing variable a new value."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "x = 5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Whereas `==` compared two values and returns `True` if they are equal."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x == 5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "You can use `==` in an `if` statement."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "yes, x is 5\n"
+ ]
+ }
+ ],
+ "source": [
+ "if x == 5:\n",
+ " print('yes, x is 5')\n",
+ "else:\n",
+ " print('x is not 5')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "But if you use `=` in an `if` statement, you get an error."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# If you remove the # from the if statement and run it, you'll get\n",
+ "# SyntaxError: invalid syntax\n",
+ "\n",
+ "#if x = 5:\n",
+ "# print('yes, x is 5')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Add an `else` clause to the `if` statement above, and print an appropriate message.\n",
+ "\n",
+ "Replace the `==` operator with one or two of the other comparison operators, and confirm they do what you expect."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Metrics"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now that we have a working simulation, we'll use it to evaluate alternative designs and see how good or bad they are. The metric we'll use is the number of customers who arrive and find no bikes available, which might indicate a design problem."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "First we'll make a new `System` object that creates and initializes the system variables that will keep track of the metrics."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "bikeshare = System(olin=10, wellesley=2, \n",
+ " olin_empty=0, wellesley_empty=0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next we need a version of `move_bike` that updates the metrics."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def move_bike(system, n):\n",
+ " olin_temp = system.olin - n\n",
+ " if olin_temp < 0:\n",
+ " system.olin_empty += 1\n",
+ " return\n",
+ " \n",
+ " wellesley_temp = system.wellesley + n\n",
+ " if wellesley_temp < 0:\n",
+ " system.wellesley_empty += 1\n",
+ " return\n",
+ " \n",
+ " system.olin = olin_temp\n",
+ " system.wellesley = wellesley_temp"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now when we run a simulation, it keeps track of unhappy customers."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "plot_system(bikeshare)\n",
+ "decorate_bikeshare()\n",
+ "run_steps(bikeshare, 40, 0.4, 0.2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "After the simulation, we can print the number of unhappy customers at each location."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bikeshare.olin_empty"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bikeshare.wellesley_empty"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Let's add a \"clock\" to keep track of how many time steps have elapsed:\n",
+ "\n",
+ "1. Add a new system variable named `clock` to `bikeshare`, initialized to 0, and \n",
+ "\n",
+ "2. Modify `step` so it increments (adds one to) `clock` each time it is invoked.\n",
+ "\n",
+ "Test your code by adding a print statement that prints the value of `clock` at the beginning of each time step."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Here's a copy of step to get you started\n",
+ "\n",
+ "def step(system, p1=0.5, p2=0.5):\n",
+ " \"\"\"Simulate one minute of time.\n",
+ " \n",
+ " system: bikeshare System object\n",
+ " p1: probability of an Olin->Wellesley customer arrival\n",
+ " p2: probability of a Wellesley->Olin customer arrival\n",
+ " \"\"\"\n",
+ " #print(system.clock)\n",
+ " system.clock+=1\n",
+ " \n",
+ " if flip(p1):\n",
+ " bike_to_wellesley(system)\n",
+ " \n",
+ " if flip(p2):\n",
+ " bike_to_olin(system)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "bikeshare = System(olin = 10, wellesley = 2, olin_empty=0, wellesley_empty=0, clock = 0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "run_steps(bikeshare, 20, .5, .5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "After the simulation, check the final value of `clock`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "20\n"
+ ]
+ }
+ ],
+ "source": [
+ " print(bikeshare.clock)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Now suppose we'd like to know how long it takes to run out of bikes at either location. Modify `move_bike` so the first time a student arrives at Olin and doesn't find a bike, it records the value of `clock` in a system variable.\n",
+ "\n",
+ "Hint: create a system variable named `t_first_empty` and initialize it to `-1` to indicate that it has not been set yet.\n",
+ "\n",
+ "Test your code by running a simulation for 60 minutes and checking the metrics."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "bikeshare = System(olin = 10, wellesley = 2, olin_empty=0, wellesley_empty=0, clock = 0, t_first_empty = -1)\n",
+ "\n",
+ "def move_bike(system, n):\n",
+ " olin_temp = system.olin - n\n",
+ " if olin_temp < 0:\n",
+ " system.olin_empty += 1\n",
+ " if system.t_first_empty < 0:\n",
+ " system.t_first_empty = system.clock\n",
+ " return\n",
+ " \n",
+ " wellesley_temp = system.wellesley + n\n",
+ " if wellesley_temp < 0:\n",
+ " system.wellesley_empty += 1\n",
+ " return\n",
+ " \n",
+ " system.olin = olin_temp\n",
+ " system.wellesley = wellesley_temp"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "run_steps(bikeshare, 15, 1, 0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "After the simulation, check the final value of `t_first_empty`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "11\n"
+ ]
+ }
+ ],
+ "source": [
+ " print(bikeshare.t_first_empty)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Before we go on, let's put `step` and `move_bike` back the way we found them, so they don't break the examples below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def step(system, p1=0.5, p2=0.5):\n",
+ " if flip(p1):\n",
+ " bike_to_wellesley(system)\n",
+ " \n",
+ " if flip(p2):\n",
+ " bike_to_olin(system)\n",
+ "\n",
+ "def move_bike(system, n):\n",
+ " olin_temp = system.olin - n\n",
+ " if olin_temp < 0:\n",
+ " system.olin_empty += 1\n",
+ " return\n",
+ " \n",
+ " wellesley_temp = system.wellesley + n\n",
+ " if wellesley_temp < 0:\n",
+ " system.wellesley_empty += 1\n",
+ " return\n",
+ " \n",
+ " system.olin = olin_temp\n",
+ " system.wellesley = wellesley_temp"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Returning values"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's a simple function that returns a value:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def add_five(x):\n",
+ " return x + 5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And here's how we call it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "8"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y = add_five(3)\n",
+ "y"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If you run a function on the last line of a cell, Jupyter displays the result:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "10"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "add_five(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "But that can be a bad habit, because usually if you call a function and don't assign the result in a variable, the result gets discarded.\n",
+ "\n",
+ "In the following example, Jupyter shows the second result, but the first result just disappears."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "10"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "add_five(3)\n",
+ "add_five(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "When you call a function that returns a variable, it is generally a good idea to assign the result to a variable."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "8 10\n"
+ ]
+ }
+ ],
+ "source": [
+ "y1 = add_five(3)\n",
+ "y2 = add_five(5)\n",
+ "\n",
+ "print(y1, y2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Write a function called `make_system` that creates a `System` object with the system variables `olin=10` and `wellesley=2`, and then returns the new `System` object.\n",
+ "\n",
+ "Write a line of code that calls `make_system` and assigns the result to a variable."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "def make_system():\n",
+ " system = System(olin = 10, wellesley = 2)\n",
+ " return system"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "newSystem = make_system"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Running simulations"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Before we go on, I want to update `run_steps` so it doesn't always plot the results. The new version takes an additional parameter, `plot_flag`, to indicate whether we want to plot.\n",
+ "\n",
+ "\"flag\" is a conventional name for a boolean variable that indicates whether or not a condition is true.\n",
+ "\n",
+ "This version of `run_steps` works even if `num_steps` is not an integer. It uses the `int` function to round down. See https://docs.python.org/3/library/functions.html#int"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def run_steps(system, num_steps=1, p1=0.5, p2=0.5, plot_flag=True):\n",
+ " \"\"\"Simulate the given number of time steps.\n",
+ " \n",
+ " `num_steps` should be an integer; if not, it gets rounded down.\n",
+ " \n",
+ " system: bikeshare System object\n",
+ " num_steps: number of time steps\n",
+ " p1: probability of an Olin->Wellesley customer arrival\n",
+ " p2: probability of a Wellesley->Olin customer arrival\n",
+ " plot_flag: boolean, whether to plot\n",
+ " \"\"\"\n",
+ " for i in range(int(num_steps)):\n",
+ " step(system, p1, p2)\n",
+ " if plot_flag:\n",
+ " plot_system(system)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now when we run a simulation, we can choose not to plot the results:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "bikeshare = System(olin=10, wellesley=2, \n",
+ " olin_empty=0, wellesley_empty=0)\n",
+ "run_steps(bikeshare, 60, 0.4, 0.2, plot_flag=False)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "But after the simulation, we can still read the metrics."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bikeshare.olin_empty"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's wrap all that in a function."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def run_simulation():\n",
+ " system = System(olin=10, wellesley=2, \n",
+ " olin_empty=0, wellesley_empty=0)\n",
+ " run_steps(system, 60, 0.4, 0.2, plot_flag=False)\n",
+ " return system"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And test it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "system = run_simulation()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0 3\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(system.olin_empty, system.wellesley_empty)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If we generalize `run_simulation` to take `p1` and `p2`, we can use it to run simulations with a range of values for the parameters."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def run_simulation(p1=0.4, p2=0.2):\n",
+ " bikeshare = System(olin=10, wellesley=2, \n",
+ " olin_empty=0, wellesley_empty=0)\n",
+ " run_steps(bikeshare, 60, p1, p2, plot_flag=False)\n",
+ " return bikeshare"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "When `p1` is small, we probably don't run out of bikes at Olin."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "system = run_simulation(p1=0.2)\n",
+ "system.olin_empty"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "When `p1` is large, we probably do."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "11"
+ ]
+ },
+ "execution_count": 47,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "system = run_simulation(p1=0.6)\n",
+ "system.olin_empty"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "**Exercise:** Write a version of `run_simulation` that takes all five model parameters as function parameters."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "def run_simulation(numSteps = 60, p1 = 0.4, p2 = 0.2, plot = False):\n",
+ " bikeshare = System(olin=10, wellesley=2, \n",
+ " olin_empty=0, wellesley_empty=0)\n",
+ " run_steps(bikeshare, numSteps, p1, p2, plot)\n",
+ " return bikeshare"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "## More for loops"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`linspace` creates a NumPy array of equally spaced numbers."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 0. , 0.25, 0.5 , 0.75, 1. ])"
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "p1_array = linspace(start=0, stop=1, num=5)\n",
+ "p1_array"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can use an array in a `for` loop, like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.0\n",
+ "0.25\n",
+ "0.5\n",
+ "0.75\n",
+ "1.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "for p1 in p1_array:\n",
+ " print(p1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This will come in handy in the next section."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** The function `linspace` is part of NumPy. [You can read the documentation here](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html).\n",
+ "\n",
+ "Use `linspace` to make an array of 10 equally spaced numbers from 1 to 10 (including both)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** The `modsim` library provides a related function called `linrange`. You can view the documentation by running the following cell:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on function linrange in module modsim:\n",
+ "\n",
+ "linrange(start=0, stop=None, step=1, **kwargs)\n",
+ " Returns an array of evenly-spaced values in the interval [start, stop].\n",
+ " \n",
+ " This function works best if the space between start and stop\n",
+ " is divisible by step; otherwise the results might be surprising.\n",
+ " \n",
+ " By default, the last value in the array is `stop` (at least approximately).\n",
+ " If you provide the keyword argument `endpoint=False`, the last value\n",
+ " in the array is `stop-step`. \n",
+ " \n",
+ " start: first value\n",
+ " stop: last value\n",
+ " step: space between values\n",
+ " \n",
+ " Also accepts the same keyword arguments as np.linspace. See\n",
+ " https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html\n",
+ " \n",
+ " returns: array or Quantity\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "help(linrange)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Use `linrange` to make an array of numbers from 1 to 11 with a step size of 2."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 1., 3., 5., 7., 9., 11.])"
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "new_array = linspace(start = 1, stop = 11, num = 6)\n",
+ "new_array"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "## Sweeping parameters"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The following example runs simulations with a range of values for `p1`; after each simulation, it prints the number of unhappy customers at the Olin station:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])"
+ ]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "p1_array = linspace(0, 1, 11)\n",
+ "p1_array"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.0 0\n",
+ "0.1 0\n",
+ "0.2 0\n",
+ "0.3 2\n",
+ "0.4 2\n",
+ "0.5 25\n",
+ "0.6 7\n",
+ "0.7 28\n",
+ "0.8 29\n",
+ "0.9 34\n",
+ "1.0 37\n"
+ ]
+ }
+ ],
+ "source": [
+ "for p1 in p1_array:\n",
+ " system = run_simulation(p1=p1)\n",
+ " print(p1, system.olin_empty)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can do the same thing, but plotting the results instead of printing them.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "for p1 in p1_array:\n",
+ " system = run_simulation(p1=p1)\n",
+ " plot(p1, system.olin_empty, 'rs', label='olin')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "As always, we should decorate the figure. This version of `decorate_bikeshare` takes `xlabel` as a parameter, for reasons you will see soon."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def decorate_bikeshare(xlabel):\n",
+ " decorate(title='Olin-Wellesley Bikeshare',\n",
+ " xlabel=xlabel, \n",
+ " ylabel='Number of unhappy customers')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "decorate_bikeshare(xlabel='Arrival rate at Olin (p1 in customers/min)')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Wrap this code in a function named `parameter_sweep` that takes an array called `p1_array` as a parameter. It should create a new figure, run a simulation for each value of `p1` in `p1_array`, and plot the results.\n",
+ "\n",
+ "Once you have the function working, modify it so it also plots the number of unhappy customers at Wellesley. Looking at the plot, can you estimate a range of values for `p1` that minimizes the total number of unhappy customers?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "def parameter_sweep(p1_array):\n",
+ " newfig()\n",
+ " for p1 in p1_array:\n",
+ " system = run_simulation(p1=p1)\n",
+ " plot(p1, system.olin_empty, 'rs', label='olin')\n",
+ "parameter_sweep(p1_array)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "SyntaxError",
+ "evalue": "illegal target for annotation (, line 2)",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m2\u001b[0m\n\u001b[1;33m Markdown and LaTeX: α**2\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m illegal target for annotation\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "Markdown and LaTeX: α**2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "**Exercise:** Write a function called `parameter_sweep2` that runs simulations with `p1=0.2` and a range of values for `p2`.\n",
+ "\n",
+ "Note: If you run `parameter_sweep2` a few times without calling `newfig`, you can plot multiple runs on the same axes, which will give you a sense of how much random variation there is from one run to the next. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 83,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "def parameter_sweep2(p1_array):\n",
+ " newfig()\n",
+ " for p1 in p1_array:\n",
+ " system = run_simulation(p1=p1, p2=0.2)\n",
+ " plot(p1, system.olin_empty, 'rs', label='olin')\n",
+ "parameter_sweep2(p1_array)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 88,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 84,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on class range in module builtins:\n",
+ "\n",
+ "class range(object)\n",
+ " | range(stop) -> range object\n",
+ " | range(start, stop[, step]) -> range object\n",
+ " | \n",
+ " | Return an object that produces a sequence of integers from start (inclusive)\n",
+ " | to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.\n",
+ " | start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.\n",
+ " | These are exactly the valid indices for a list of 4 elements.\n",
+ " | When step is given, it specifies the increment (or decrement).\n",
+ " | \n",
+ " | Methods defined here:\n",
+ " | \n",
+ " | __contains__(self, key, /)\n",
+ " | Return key in self.\n",
+ " | \n",
+ " | __eq__(self, value, /)\n",
+ " | Return self==value.\n",
+ " | \n",
+ " | __ge__(self, value, /)\n",
+ " | Return self>=value.\n",
+ " | \n",
+ " | __getattribute__(self, name, /)\n",
+ " | Return getattr(self, name).\n",
+ " | \n",
+ " | __getitem__(self, key, /)\n",
+ " | Return self[key].\n",
+ " | \n",
+ " | __gt__(self, value, /)\n",
+ " | Return self>value.\n",
+ " | \n",
+ " | __hash__(self, /)\n",
+ " | Return hash(self).\n",
+ " | \n",
+ " | __iter__(self, /)\n",
+ " | Implement iter(self).\n",
+ " | \n",
+ " | __le__(self, value, /)\n",
+ " | Return self<=value.\n",
+ " | \n",
+ " | __len__(self, /)\n",
+ " | Return len(self).\n",
+ " | \n",
+ " | __lt__(self, value, /)\n",
+ " | Return self integer -- return number of occurrences of value\n",
+ " | \n",
+ " | index(...)\n",
+ " | rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.\n",
+ " | Raise ValueError if the value is not present.\n",
+ " | \n",
+ " | ----------------------------------------------------------------------\n",
+ " | Data descriptors defined here:\n",
+ " | \n",
+ " | start\n",
+ " | \n",
+ " | step\n",
+ " | \n",
+ " | stop\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "help(range)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Hold `p1=0.4` and `p2=0.2`, and sweep a range of values for `num_steps`.\n",
+ "\n",
+ "Hint: You will need a version of `run_simulation` that takes `num_steps` as a parameter.\n",
+ "\n",
+ "Hint: Because `num_steps` is supposed to be an integer use `range` rather than `linrange`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 91,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "array_steps = range(1,35)\n",
+ "def parameter_sweep3(array_steps):\n",
+ " newfig()\n",
+ " for num in array_steps:\n",
+ " system = run_simulation(p1 = 0.8, p2 = 0.3, numSteps = num)\n",
+ " plot(num, system.olin_empty, 'rs', label='olin')\n",
+ "parameter_sweep3(array_steps)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 91,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 92,
+ "metadata": {
+ "collapsed": true,
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "**Exercise:** The code below runs a simulation with the same parameters 10 times and computes the average number of unhappy customers.\n",
+ "\n",
+ "1. Wrap this code in a function called `run_simulations` that takes `num_runs` as a parameter.\n",
+ "\n",
+ "2. Test `run_simulations`, and increase `num_runs` until the results are reasonably consistent from one run to the next.\n",
+ "\n",
+ "3. Generalize `run_simulations` so it also takes the initial value of `olin` as a parameter.\n",
+ "\n",
+ "4. Run the generalized version with `olin=12`. How much do the two extra bikes decrease the average number of unhappy customers.\n",
+ "\n",
+ "5. Make a plot that shows the average number of unhappy customers as a function of the initial number of bikes at Olin."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 117,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "5.2000000000000002"
+ ]
+ },
+ "execution_count": 117,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "num_runs = 10\n",
+ "total = 0\n",
+ "for i in range(num_runs):\n",
+ " system = run_simulation(p1=0.4, p2=0.2, numSteps=70)\n",
+ " total += system.olin_empty + system.wellesley_empty\n",
+ "total / num_runs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 124,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "def run_simulations(num_runs):\n",
+ " total = 0\n",
+ " for i in range(num_runs):\n",
+ " system = run_simulation(p1=0.4, p2=0.2, numSteps=70)\n",
+ " total += system.olin_empty + system.wellesley_empty\n",
+ " return (total / num_runs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 199,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "5.8499999999999996"
+ ]
+ },
+ "execution_count": 199,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "run_simulations(40)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 201,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "def run_simulation(numSteps = 60, p1 = 0.4, p2 = 0.2, plot = False, olin = 10):\n",
+ " bikeshare = System(olin=olin, wellesley=2, \n",
+ " olin_empty=0, wellesley_empty=0)\n",
+ " run_steps(bikeshare, numSteps, p1, p2, plot)\n",
+ " return bikeshare\n",
+ "\n",
+ "def run_simulations(num_runs, olin):\n",
+ " total = 0\n",
+ " for i in range(num_runs):\n",
+ " system = run_simulation(p1=0.4, p2=0.2, numSteps=70, olin = olin)\n",
+ " total += system.olin_empty + system.wellesley_empty\n",
+ " return (total / num_runs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 215,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "4.4000000000000004"
+ ]
+ },
+ "execution_count": 215,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "run_simulations(40, 12)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 219,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "olin_bikes = range(0,20)\n",
+ "\n",
+ "def parameter_sweep4(olin_bikes):\n",
+ " newfig()\n",
+ " for num in olin_bikes:\n",
+ " average = run_simulations(40, num)\n",
+ " plot(num, average, 'rs', label='olin')\n",
+ "parameter_sweep4(array_steps)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 221,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def decorate_unhappy(xlabel):\n",
+ " decorate(title='Unhappy customers vs. initial number of bikes at Olin',\n",
+ " xlabel=xlabel, \n",
+ " ylabel='Number of unhappy customers')\n",
+ "decorate_unhappy('Bikes at olin')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.6.1"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/code/chap03-fig01.pdf b/code/chap03-fig01.pdf
new file mode 100644
index 00000000..71c00cb2
Binary files /dev/null and b/code/chap03-fig01.pdf differ
diff --git a/code/chap03-fig02.pdf b/code/chap03-fig02.pdf
new file mode 100644
index 00000000..f13f3c82
Binary files /dev/null and b/code/chap03-fig02.pdf differ
diff --git a/code/chap03-fig03.pdf b/code/chap03-fig03.pdf
new file mode 100644
index 00000000..57321cef
Binary files /dev/null and b/code/chap03-fig03.pdf differ
diff --git a/code/chap03-fig04.pdf b/code/chap03-fig04.pdf
new file mode 100644
index 00000000..7ccb708f
Binary files /dev/null and b/code/chap03-fig04.pdf differ
diff --git a/code/chap03-fig05.pdf b/code/chap03-fig05.pdf
new file mode 100644
index 00000000..95310bb3
Binary files /dev/null and b/code/chap03-fig05.pdf differ
diff --git a/code/chap03mine.ipynb b/code/chap03mine.ipynb
new file mode 100644
index 00000000..31ae4d6f
--- /dev/null
+++ b/code/chap03mine.ipynb
@@ -0,0 +1,3942 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Modeling and Simulation in Python\n",
+ "\n",
+ "Chapter 3: Explain\n",
+ "\n",
+ "Copyright 2017 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# If you want the figures to appear in the notebook, \n",
+ "# and you want to interact with them, use\n",
+ "# %matplotlib notebook\n",
+ "\n",
+ "# If you want the figures to appear in the notebook, \n",
+ "# and you don't want to interact with them, use\n",
+ "# %matplotlib inline\n",
+ "\n",
+ "# If you want the figures to appear in separate windows, use\n",
+ "# %matplotlib qt5\n",
+ "\n",
+ "# To switch from one to another, you have to select Kernel->Restart\n",
+ "\n",
+ "%matplotlib inline\n",
+ "\n",
+ "from modsim import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Pandas is a module that provides tools for reading and processing data. The `read_html` reads a web page from a file or the Internet and creates one DataFrame for each table on the page."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from pandas import read_html"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The data directory contains a downloaded copy of https://en.wikipedia.org/wiki/World_population_estimates"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "filename = 'data/World_population_estimates.html'\n",
+ "tables = read_html(filename, header=0, index_col=0, decimal='M')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`tables` is a sequence of DataFrame objects. We can select the DataFrame we want using the bracket operator. The tables are numbered from 0, so `table2` is actually the third table on the page.\n",
+ "\n",
+ "`head` selects the header and the first five rows."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
United States Census Bureau (2015)[18]
\n",
+ "
Population Reference Bureau (1973–2015)[6]
\n",
+ "
United Nations Department of Economic and Social Affairs (2015)[7]
\n",
+ "
Maddison (2008)[8]
\n",
+ "
HYDE (2007)[15]
\n",
+ "
Tanton (1994)[9]
\n",
+ "
Biraben (1980)[10]
\n",
+ "
McEvedy & Jones (1978)[11]
\n",
+ "
Thomlinson (1975)[12]
\n",
+ "
Durand (1974)[13]
\n",
+ "
Clark (1967)[14]
\n",
+ "
\n",
+ "
\n",
+ "
Year
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1950
\n",
+ "
2557628654
\n",
+ "
2.516000e+09
\n",
+ "
2525149000
\n",
+ "
2.544000e+09
\n",
+ "
2.527960e+09
\n",
+ "
2.400000e+09
\n",
+ "
2.527000e+09
\n",
+ "
2.500000e+09
\n",
+ "
2.400000e+09
\n",
+ "
NaN
\n",
+ "
2.486000e+09
\n",
+ "
\n",
+ "
\n",
+ "
1951
\n",
+ "
2594939877
\n",
+ "
NaN
\n",
+ "
2572850917
\n",
+ "
2.571663e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1952
\n",
+ "
2636772306
\n",
+ "
NaN
\n",
+ "
2619292068
\n",
+ "
2.617949e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1953
\n",
+ "
2682053389
\n",
+ "
NaN
\n",
+ "
2665865392
\n",
+ "
2.665959e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1954
\n",
+ "
2730228104
\n",
+ "
NaN
\n",
+ "
2713172027
\n",
+ "
2.716927e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " United States Census Bureau (2015)[18] \\\n",
+ "Year \n",
+ "1950 2557628654 \n",
+ "1951 2594939877 \n",
+ "1952 2636772306 \n",
+ "1953 2682053389 \n",
+ "1954 2730228104 \n",
+ "\n",
+ " Population Reference Bureau (1973–2015)[6] \\\n",
+ "Year \n",
+ "1950 2.516000e+09 \n",
+ "1951 NaN \n",
+ "1952 NaN \n",
+ "1953 NaN \n",
+ "1954 NaN \n",
+ "\n",
+ " United Nations Department of Economic and Social Affairs (2015)[7] \\\n",
+ "Year \n",
+ "1950 2525149000 \n",
+ "1951 2572850917 \n",
+ "1952 2619292068 \n",
+ "1953 2665865392 \n",
+ "1954 2713172027 \n",
+ "\n",
+ " Maddison (2008)[8] HYDE (2007)[15] Tanton (1994)[9] \\\n",
+ "Year \n",
+ "1950 2.544000e+09 2.527960e+09 2.400000e+09 \n",
+ "1951 2.571663e+09 NaN NaN \n",
+ "1952 2.617949e+09 NaN NaN \n",
+ "1953 2.665959e+09 NaN NaN \n",
+ "1954 2.716927e+09 NaN NaN \n",
+ "\n",
+ " Biraben (1980)[10] McEvedy & Jones (1978)[11] Thomlinson (1975)[12] \\\n",
+ "Year \n",
+ "1950 2.527000e+09 2.500000e+09 2.400000e+09 \n",
+ "1951 NaN NaN NaN \n",
+ "1952 NaN NaN NaN \n",
+ "1953 NaN NaN NaN \n",
+ "1954 NaN NaN NaN \n",
+ "\n",
+ " Durand (1974)[13] Clark (1967)[14] \n",
+ "Year \n",
+ "1950 NaN 2.486000e+09 \n",
+ "1951 NaN NaN \n",
+ "1952 NaN NaN \n",
+ "1953 NaN NaN \n",
+ "1954 NaN NaN "
+ ]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "table2 = tables[2]\n",
+ "table2.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`tail` selects the last five rows."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
United States Census Bureau (2015)[18]
\n",
+ "
Population Reference Bureau (1973–2015)[6]
\n",
+ "
United Nations Department of Economic and Social Affairs (2015)[7]
\n",
+ "
Maddison (2008)[8]
\n",
+ "
HYDE (2007)[15]
\n",
+ "
Tanton (1994)[9]
\n",
+ "
Biraben (1980)[10]
\n",
+ "
McEvedy & Jones (1978)[11]
\n",
+ "
Thomlinson (1975)[12]
\n",
+ "
Durand (1974)[13]
\n",
+ "
Clark (1967)[14]
\n",
+ "
\n",
+ "
\n",
+ "
Year
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
2011
\n",
+ "
6944055583
\n",
+ "
6.986951e+09
\n",
+ "
6997998760
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2012
\n",
+ "
7022349283
\n",
+ "
7.057075e+09
\n",
+ "
7080072417
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2013
\n",
+ "
7101027895
\n",
+ "
7.136796e+09
\n",
+ "
7162119434
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2014
\n",
+ "
7178722893
\n",
+ "
7.238184e+09
\n",
+ "
7243784000
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2015
\n",
+ "
7256490011
\n",
+ "
7.336435e+09
\n",
+ "
7349472000
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " United States Census Bureau (2015)[18] \\\n",
+ "Year \n",
+ "2011 6944055583 \n",
+ "2012 7022349283 \n",
+ "2013 7101027895 \n",
+ "2014 7178722893 \n",
+ "2015 7256490011 \n",
+ "\n",
+ " Population Reference Bureau (1973–2015)[6] \\\n",
+ "Year \n",
+ "2011 6.986951e+09 \n",
+ "2012 7.057075e+09 \n",
+ "2013 7.136796e+09 \n",
+ "2014 7.238184e+09 \n",
+ "2015 7.336435e+09 \n",
+ "\n",
+ " United Nations Department of Economic and Social Affairs (2015)[7] \\\n",
+ "Year \n",
+ "2011 6997998760 \n",
+ "2012 7080072417 \n",
+ "2013 7162119434 \n",
+ "2014 7243784000 \n",
+ "2015 7349472000 \n",
+ "\n",
+ " Maddison (2008)[8] HYDE (2007)[15] Tanton (1994)[9] \\\n",
+ "Year \n",
+ "2011 NaN NaN NaN \n",
+ "2012 NaN NaN NaN \n",
+ "2013 NaN NaN NaN \n",
+ "2014 NaN NaN NaN \n",
+ "2015 NaN NaN NaN \n",
+ "\n",
+ " Biraben (1980)[10] McEvedy & Jones (1978)[11] Thomlinson (1975)[12] \\\n",
+ "Year \n",
+ "2011 NaN NaN NaN \n",
+ "2012 NaN NaN NaN \n",
+ "2013 NaN NaN NaN \n",
+ "2014 NaN NaN NaN \n",
+ "2015 NaN NaN NaN \n",
+ "\n",
+ " Durand (1974)[13] Clark (1967)[14] \n",
+ "Year \n",
+ "2011 NaN NaN \n",
+ "2012 NaN NaN \n",
+ "2013 NaN NaN \n",
+ "2014 NaN NaN \n",
+ "2015 NaN NaN "
+ ]
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "table2.tail()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Long column names are awkard to work with, but we can replace them with abbreviated names."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "table2.columns = ['census', 'prb', 'un', 'maddison', \n",
+ " 'hyde', 'tanton', 'biraben', 'mj', \n",
+ " 'thomlinson', 'durand', 'clark']"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's what the DataFrame looks like now. \n",
+ "\n",
+ "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n",
+ "\n",
+ "`NaN` is a special value that indicates missing data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
census
\n",
+ "
prb
\n",
+ "
un
\n",
+ "
maddison
\n",
+ "
hyde
\n",
+ "
tanton
\n",
+ "
biraben
\n",
+ "
mj
\n",
+ "
thomlinson
\n",
+ "
durand
\n",
+ "
clark
\n",
+ "
\n",
+ "
\n",
+ "
Year
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1950
\n",
+ "
2557628654
\n",
+ "
2.516000e+09
\n",
+ "
2525149000
\n",
+ "
2.544000e+09
\n",
+ "
2.527960e+09
\n",
+ "
2.400000e+09
\n",
+ "
2.527000e+09
\n",
+ "
2.500000e+09
\n",
+ "
2.400000e+09
\n",
+ "
NaN
\n",
+ "
2.486000e+09
\n",
+ "
\n",
+ "
\n",
+ "
1951
\n",
+ "
2594939877
\n",
+ "
NaN
\n",
+ "
2572850917
\n",
+ "
2.571663e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1952
\n",
+ "
2636772306
\n",
+ "
NaN
\n",
+ "
2619292068
\n",
+ "
2.617949e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1953
\n",
+ "
2682053389
\n",
+ "
NaN
\n",
+ "
2665865392
\n",
+ "
2.665959e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1954
\n",
+ "
2730228104
\n",
+ "
NaN
\n",
+ "
2713172027
\n",
+ "
2.716927e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1955
\n",
+ "
2782098943
\n",
+ "
NaN
\n",
+ "
2761650981
\n",
+ "
2.769074e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1956
\n",
+ "
2835299673
\n",
+ "
NaN
\n",
+ "
2811572031
\n",
+ "
2.822502e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1957
\n",
+ "
2891349717
\n",
+ "
NaN
\n",
+ "
2863042795
\n",
+ "
2.879934e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1958
\n",
+ "
2948137248
\n",
+ "
NaN
\n",
+ "
2916030167
\n",
+ "
2.939254e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1959
\n",
+ "
3000716593
\n",
+ "
NaN
\n",
+ "
2970395814
\n",
+ "
2.995909e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1960
\n",
+ "
3043001508
\n",
+ "
NaN
\n",
+ "
3026002942
\n",
+ "
3.041507e+09
\n",
+ "
3.042000e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1961
\n",
+ "
3083966929
\n",
+ "
NaN
\n",
+ "
3082830266
\n",
+ "
3.082161e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1962
\n",
+ "
3140093217
\n",
+ "
NaN
\n",
+ "
3141071531
\n",
+ "
3.135787e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
3.036000e+09
\n",
+ "
\n",
+ "
\n",
+ "
1963
\n",
+ "
3209827882
\n",
+ "
NaN
\n",
+ "
3201178277
\n",
+ "
3.201354e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1964
\n",
+ "
3281201306
\n",
+ "
NaN
\n",
+ "
3263738832
\n",
+ "
3.266477e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1965
\n",
+ "
3350425793
\n",
+ "
NaN
\n",
+ "
3329122479
\n",
+ "
3.333138e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1966
\n",
+ "
3420677923
\n",
+ "
NaN
\n",
+ "
3397475247
\n",
+ "
3.402224e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
3.288000e+09
\n",
+ "
\n",
+ "
\n",
+ "
1967
\n",
+ "
3490333715
\n",
+ "
NaN
\n",
+ "
3468521724
\n",
+ "
3.471464e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1968
\n",
+ "
3562313822
\n",
+ "
NaN
\n",
+ "
3541674891
\n",
+ "
3.543086e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1969
\n",
+ "
3637159050
\n",
+ "
NaN
\n",
+ "
3616108749
\n",
+ "
3.615743e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1970
\n",
+ "
3712697742
\n",
+ "
NaN
\n",
+ "
3691172616
\n",
+ "
3.691157e+09
\n",
+ "
3.710000e+09
\n",
+ "
NaN
\n",
+ "
3.637000e+09
\n",
+ "
NaN
\n",
+ "
3.600000e+09
\n",
+ "
3,600,000,000– 3,700,000,000
\n",
+ "
3.632000e+09
\n",
+ "
\n",
+ "
\n",
+ "
1971
\n",
+ "
3790326948
\n",
+ "
NaN
\n",
+ "
3766754345
\n",
+ "
3.769818e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1972
\n",
+ "
3866568653
\n",
+ "
NaN
\n",
+ "
3842873611
\n",
+ "
3.846499e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1973
\n",
+ "
3942096442
\n",
+ "
NaN
\n",
+ "
3919182332
\n",
+ "
3.922793e+09
\n",
+ "
3.923000e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
3.860000e+09
\n",
+ "
\n",
+ "
\n",
+ "
1974
\n",
+ "
4016608813
\n",
+ "
NaN
\n",
+ "
3995304922
\n",
+ "
3.997677e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1975
\n",
+ "
4089083233
\n",
+ "
NaN
\n",
+ "
4071020434
\n",
+ "
4.070671e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
3.900000e+09
\n",
+ "
4.000000e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1976
\n",
+ "
4160185010
\n",
+ "
NaN
\n",
+ "
4146135850
\n",
+ "
4.141445e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1977
\n",
+ "
4232084578
\n",
+ "
NaN
\n",
+ "
4220816737
\n",
+ "
4.213539e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1978
\n",
+ "
4304105753
\n",
+ "
NaN
\n",
+ "
4295664825
\n",
+ "
4.286317e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1979
\n",
+ "
4379013942
\n",
+ "
NaN
\n",
+ "
4371527871
\n",
+ "
4.363144e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
\n",
+ "
\n",
+ "
1986
\n",
+ "
4940571232
\n",
+ "
NaN
\n",
+ "
4953376710
\n",
+ "
4.920968e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1987
\n",
+ "
5027200492
\n",
+ "
NaN
\n",
+ "
5045315871
\n",
+ "
5.006672e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1988
\n",
+ "
5114557167
\n",
+ "
NaN
\n",
+ "
5138214688
\n",
+ "
5.093306e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1989
\n",
+ "
5201440110
\n",
+ "
NaN
\n",
+ "
5230000000
\n",
+ "
5.180540e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1990
\n",
+ "
5288955934
\n",
+ "
NaN
\n",
+ "
5320816667
\n",
+ "
5.269029e+09
\n",
+ "
5.308000e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1991
\n",
+ "
5371585922
\n",
+ "
NaN
\n",
+ "
5408908724
\n",
+ "
5.351922e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1992
\n",
+ "
5456136278
\n",
+ "
NaN
\n",
+ "
5494899570
\n",
+ "
5.435722e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1993
\n",
+ "
5538268316
\n",
+ "
NaN
\n",
+ "
5578865109
\n",
+ "
5.518127e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1994
\n",
+ "
5618682132
\n",
+ "
NaN
\n",
+ "
5661086346
\n",
+ "
5.599396e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1995
\n",
+ "
5699202985
\n",
+ "
5.760000e+09
\n",
+ "
5741822412
\n",
+ "
5.681575e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1996
\n",
+ "
5779440593
\n",
+ "
NaN
\n",
+ "
5821016750
\n",
+ "
5.762212e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1997
\n",
+ "
5857972543
\n",
+ "
5.840000e+09
\n",
+ "
5898688337
\n",
+ "
5.842122e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1998
\n",
+ "
5935213248
\n",
+ "
NaN
\n",
+ "
5975303657
\n",
+ "
5.921366e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1999
\n",
+ "
6012074922
\n",
+ "
NaN
\n",
+ "
6051478010
\n",
+ "
5.999622e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2000
\n",
+ "
6088571383
\n",
+ "
6.067000e+09
\n",
+ "
6127700428
\n",
+ "
6.076558e+09
\n",
+ "
6.145000e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
5.750000e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2001
\n",
+ "
6165219247
\n",
+ "
6.137000e+09
\n",
+ "
6204147026
\n",
+ "
6.154791e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2002
\n",
+ "
6242016348
\n",
+ "
6.215000e+09
\n",
+ "
6280853817
\n",
+ "
6.231704e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2003
\n",
+ "
6318590956
\n",
+ "
6.314000e+09
\n",
+ "
6357991749
\n",
+ "
6.308364e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2004
\n",
+ "
6395699509
\n",
+ "
6.396000e+09
\n",
+ "
6435705595
\n",
+ "
6.374056e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2005
\n",
+ "
6473044732
\n",
+ "
6.477000e+09
\n",
+ "
6514094605
\n",
+ "
6.462987e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2006
\n",
+ "
6551263534
\n",
+ "
6.555000e+09
\n",
+ "
6593227977
\n",
+ "
6.540214e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2007
\n",
+ "
6629913759
\n",
+ "
6.625000e+09
\n",
+ "
6673105937
\n",
+ "
6.616689e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2008
\n",
+ "
6709049780
\n",
+ "
6.705000e+09
\n",
+ "
6753649228
\n",
+ "
6.694832e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2009
\n",
+ "
6788214394
\n",
+ "
6.809972e+09
\n",
+ "
6834721933
\n",
+ "
6.764086e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2010
\n",
+ "
6866332358
\n",
+ "
6.892319e+09
\n",
+ "
6916183482
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2011
\n",
+ "
6944055583
\n",
+ "
6.986951e+09
\n",
+ "
6997998760
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2012
\n",
+ "
7022349283
\n",
+ "
7.057075e+09
\n",
+ "
7080072417
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2013
\n",
+ "
7101027895
\n",
+ "
7.136796e+09
\n",
+ "
7162119434
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2014
\n",
+ "
7178722893
\n",
+ "
7.238184e+09
\n",
+ "
7243784000
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2015
\n",
+ "
7256490011
\n",
+ "
7.336435e+09
\n",
+ "
7349472000
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
66 rows × 11 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " census prb un maddison hyde \\\n",
+ "Year \n",
+ "1950 2557628654 2.516000e+09 2525149000 2.544000e+09 2.527960e+09 \n",
+ "1951 2594939877 NaN 2572850917 2.571663e+09 NaN \n",
+ "1952 2636772306 NaN 2619292068 2.617949e+09 NaN \n",
+ "1953 2682053389 NaN 2665865392 2.665959e+09 NaN \n",
+ "1954 2730228104 NaN 2713172027 2.716927e+09 NaN \n",
+ "1955 2782098943 NaN 2761650981 2.769074e+09 NaN \n",
+ "1956 2835299673 NaN 2811572031 2.822502e+09 NaN \n",
+ "1957 2891349717 NaN 2863042795 2.879934e+09 NaN \n",
+ "1958 2948137248 NaN 2916030167 2.939254e+09 NaN \n",
+ "1959 3000716593 NaN 2970395814 2.995909e+09 NaN \n",
+ "1960 3043001508 NaN 3026002942 3.041507e+09 3.042000e+09 \n",
+ "1961 3083966929 NaN 3082830266 3.082161e+09 NaN \n",
+ "1962 3140093217 NaN 3141071531 3.135787e+09 NaN \n",
+ "1963 3209827882 NaN 3201178277 3.201354e+09 NaN \n",
+ "1964 3281201306 NaN 3263738832 3.266477e+09 NaN \n",
+ "1965 3350425793 NaN 3329122479 3.333138e+09 NaN \n",
+ "1966 3420677923 NaN 3397475247 3.402224e+09 NaN \n",
+ "1967 3490333715 NaN 3468521724 3.471464e+09 NaN \n",
+ "1968 3562313822 NaN 3541674891 3.543086e+09 NaN \n",
+ "1969 3637159050 NaN 3616108749 3.615743e+09 NaN \n",
+ "1970 3712697742 NaN 3691172616 3.691157e+09 3.710000e+09 \n",
+ "1971 3790326948 NaN 3766754345 3.769818e+09 NaN \n",
+ "1972 3866568653 NaN 3842873611 3.846499e+09 NaN \n",
+ "1973 3942096442 NaN 3919182332 3.922793e+09 3.923000e+09 \n",
+ "1974 4016608813 NaN 3995304922 3.997677e+09 NaN \n",
+ "1975 4089083233 NaN 4071020434 4.070671e+09 NaN \n",
+ "1976 4160185010 NaN 4146135850 4.141445e+09 NaN \n",
+ "1977 4232084578 NaN 4220816737 4.213539e+09 NaN \n",
+ "1978 4304105753 NaN 4295664825 4.286317e+09 NaN \n",
+ "1979 4379013942 NaN 4371527871 4.363144e+09 NaN \n",
+ "... ... ... ... ... ... \n",
+ "1986 4940571232 NaN 4953376710 4.920968e+09 NaN \n",
+ "1987 5027200492 NaN 5045315871 5.006672e+09 NaN \n",
+ "1988 5114557167 NaN 5138214688 5.093306e+09 NaN \n",
+ "1989 5201440110 NaN 5230000000 5.180540e+09 NaN \n",
+ "1990 5288955934 NaN 5320816667 5.269029e+09 5.308000e+09 \n",
+ "1991 5371585922 NaN 5408908724 5.351922e+09 NaN \n",
+ "1992 5456136278 NaN 5494899570 5.435722e+09 NaN \n",
+ "1993 5538268316 NaN 5578865109 5.518127e+09 NaN \n",
+ "1994 5618682132 NaN 5661086346 5.599396e+09 NaN \n",
+ "1995 5699202985 5.760000e+09 5741822412 5.681575e+09 NaN \n",
+ "1996 5779440593 NaN 5821016750 5.762212e+09 NaN \n",
+ "1997 5857972543 5.840000e+09 5898688337 5.842122e+09 NaN \n",
+ "1998 5935213248 NaN 5975303657 5.921366e+09 NaN \n",
+ "1999 6012074922 NaN 6051478010 5.999622e+09 NaN \n",
+ "2000 6088571383 6.067000e+09 6127700428 6.076558e+09 6.145000e+09 \n",
+ "2001 6165219247 6.137000e+09 6204147026 6.154791e+09 NaN \n",
+ "2002 6242016348 6.215000e+09 6280853817 6.231704e+09 NaN \n",
+ "2003 6318590956 6.314000e+09 6357991749 6.308364e+09 NaN \n",
+ "2004 6395699509 6.396000e+09 6435705595 6.374056e+09 NaN \n",
+ "2005 6473044732 6.477000e+09 6514094605 6.462987e+09 NaN \n",
+ "2006 6551263534 6.555000e+09 6593227977 6.540214e+09 NaN \n",
+ "2007 6629913759 6.625000e+09 6673105937 6.616689e+09 NaN \n",
+ "2008 6709049780 6.705000e+09 6753649228 6.694832e+09 NaN \n",
+ "2009 6788214394 6.809972e+09 6834721933 6.764086e+09 NaN \n",
+ "2010 6866332358 6.892319e+09 6916183482 NaN NaN \n",
+ "2011 6944055583 6.986951e+09 6997998760 NaN NaN \n",
+ "2012 7022349283 7.057075e+09 7080072417 NaN NaN \n",
+ "2013 7101027895 7.136796e+09 7162119434 NaN NaN \n",
+ "2014 7178722893 7.238184e+09 7243784000 NaN NaN \n",
+ "2015 7256490011 7.336435e+09 7349472000 NaN NaN \n",
+ "\n",
+ " tanton biraben mj thomlinson \\\n",
+ "Year \n",
+ "1950 2.400000e+09 2.527000e+09 2.500000e+09 2.400000e+09 \n",
+ "1951 NaN NaN NaN NaN \n",
+ "1952 NaN NaN NaN NaN \n",
+ "1953 NaN NaN NaN NaN \n",
+ "1954 NaN NaN NaN NaN \n",
+ "1955 NaN NaN NaN NaN \n",
+ "1956 NaN NaN NaN NaN \n",
+ "1957 NaN NaN NaN NaN \n",
+ "1958 NaN NaN NaN NaN \n",
+ "1959 NaN NaN NaN NaN \n",
+ "1960 NaN NaN NaN NaN \n",
+ "1961 NaN NaN NaN NaN \n",
+ "1962 NaN NaN NaN NaN \n",
+ "1963 NaN NaN NaN NaN \n",
+ "1964 NaN NaN NaN NaN \n",
+ "1965 NaN NaN NaN NaN \n",
+ "1966 NaN NaN NaN NaN \n",
+ "1967 NaN NaN NaN NaN \n",
+ "1968 NaN NaN NaN NaN \n",
+ "1969 NaN NaN NaN NaN \n",
+ "1970 NaN 3.637000e+09 NaN 3.600000e+09 \n",
+ "1971 NaN NaN NaN NaN \n",
+ "1972 NaN NaN NaN NaN \n",
+ "1973 NaN NaN NaN NaN \n",
+ "1974 NaN NaN NaN NaN \n",
+ "1975 NaN NaN 3.900000e+09 4.000000e+09 \n",
+ "1976 NaN NaN NaN NaN \n",
+ "1977 NaN NaN NaN NaN \n",
+ "1978 NaN NaN NaN NaN \n",
+ "1979 NaN NaN NaN NaN \n",
+ "... ... ... ... ... \n",
+ "1986 NaN NaN NaN NaN \n",
+ "1987 NaN NaN NaN NaN \n",
+ "1988 NaN NaN NaN NaN \n",
+ "1989 NaN NaN NaN NaN \n",
+ "1990 NaN NaN NaN NaN \n",
+ "1991 NaN NaN NaN NaN \n",
+ "1992 NaN NaN NaN NaN \n",
+ "1993 NaN NaN NaN NaN \n",
+ "1994 NaN NaN NaN NaN \n",
+ "1995 NaN NaN NaN NaN \n",
+ "1996 NaN NaN NaN NaN \n",
+ "1997 NaN NaN NaN NaN \n",
+ "1998 NaN NaN NaN NaN \n",
+ "1999 NaN NaN NaN NaN \n",
+ "2000 NaN NaN 5.750000e+09 NaN \n",
+ "2001 NaN NaN NaN NaN \n",
+ "2002 NaN NaN NaN NaN \n",
+ "2003 NaN NaN NaN NaN \n",
+ "2004 NaN NaN NaN NaN \n",
+ "2005 NaN NaN NaN NaN \n",
+ "2006 NaN NaN NaN NaN \n",
+ "2007 NaN NaN NaN NaN \n",
+ "2008 NaN NaN NaN NaN \n",
+ "2009 NaN NaN NaN NaN \n",
+ "2010 NaN NaN NaN NaN \n",
+ "2011 NaN NaN NaN NaN \n",
+ "2012 NaN NaN NaN NaN \n",
+ "2013 NaN NaN NaN NaN \n",
+ "2014 NaN NaN NaN NaN \n",
+ "2015 NaN NaN NaN NaN \n",
+ "\n",
+ " durand clark \n",
+ "Year \n",
+ "1950 NaN 2.486000e+09 \n",
+ "1951 NaN NaN \n",
+ "1952 NaN NaN \n",
+ "1953 NaN NaN \n",
+ "1954 NaN NaN \n",
+ "1955 NaN NaN \n",
+ "1956 NaN NaN \n",
+ "1957 NaN NaN \n",
+ "1958 NaN NaN \n",
+ "1959 NaN NaN \n",
+ "1960 NaN NaN \n",
+ "1961 NaN NaN \n",
+ "1962 NaN 3.036000e+09 \n",
+ "1963 NaN NaN \n",
+ "1964 NaN NaN \n",
+ "1965 NaN NaN \n",
+ "1966 NaN 3.288000e+09 \n",
+ "1967 NaN NaN \n",
+ "1968 NaN NaN \n",
+ "1969 NaN NaN \n",
+ "1970 3,600,000,000– 3,700,000,000 3.632000e+09 \n",
+ "1971 NaN NaN \n",
+ "1972 NaN NaN \n",
+ "1973 NaN 3.860000e+09 \n",
+ "1974 NaN NaN \n",
+ "1975 NaN NaN \n",
+ "1976 NaN NaN \n",
+ "1977 NaN NaN \n",
+ "1978 NaN NaN \n",
+ "1979 NaN NaN \n",
+ "... ... ... \n",
+ "1986 NaN NaN \n",
+ "1987 NaN NaN \n",
+ "1988 NaN NaN \n",
+ "1989 NaN NaN \n",
+ "1990 NaN NaN \n",
+ "1991 NaN NaN \n",
+ "1992 NaN NaN \n",
+ "1993 NaN NaN \n",
+ "1994 NaN NaN \n",
+ "1995 NaN NaN \n",
+ "1996 NaN NaN \n",
+ "1997 NaN NaN \n",
+ "1998 NaN NaN \n",
+ "1999 NaN NaN \n",
+ "2000 NaN NaN \n",
+ "2001 NaN NaN \n",
+ "2002 NaN NaN \n",
+ "2003 NaN NaN \n",
+ "2004 NaN NaN \n",
+ "2005 NaN NaN \n",
+ "2006 NaN NaN \n",
+ "2007 NaN NaN \n",
+ "2008 NaN NaN \n",
+ "2009 NaN NaN \n",
+ "2010 NaN NaN \n",
+ "2011 NaN NaN \n",
+ "2012 NaN NaN \n",
+ "2013 NaN NaN \n",
+ "2014 NaN NaN \n",
+ "2015 NaN NaN \n",
+ "\n",
+ "[66 rows x 11 columns]"
+ ]
+ },
+ "execution_count": 45,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "table2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can use dot notatio to select a column from a DataFrame. The result is a Series."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Year\n",
+ "1950 2557628654\n",
+ "1951 2594939877\n",
+ "1952 2636772306\n",
+ "1953 2682053389\n",
+ "1954 2730228104\n",
+ "1955 2782098943\n",
+ "1956 2835299673\n",
+ "1957 2891349717\n",
+ "1958 2948137248\n",
+ "1959 3000716593\n",
+ "1960 3043001508\n",
+ "1961 3083966929\n",
+ "1962 3140093217\n",
+ "1963 3209827882\n",
+ "1964 3281201306\n",
+ "1965 3350425793\n",
+ "1966 3420677923\n",
+ "1967 3490333715\n",
+ "1968 3562313822\n",
+ "1969 3637159050\n",
+ "1970 3712697742\n",
+ "1971 3790326948\n",
+ "1972 3866568653\n",
+ "1973 3942096442\n",
+ "1974 4016608813\n",
+ "1975 4089083233\n",
+ "1976 4160185010\n",
+ "1977 4232084578\n",
+ "1978 4304105753\n",
+ "1979 4379013942\n",
+ " ... \n",
+ "1986 4940571232\n",
+ "1987 5027200492\n",
+ "1988 5114557167\n",
+ "1989 5201440110\n",
+ "1990 5288955934\n",
+ "1991 5371585922\n",
+ "1992 5456136278\n",
+ "1993 5538268316\n",
+ "1994 5618682132\n",
+ "1995 5699202985\n",
+ "1996 5779440593\n",
+ "1997 5857972543\n",
+ "1998 5935213248\n",
+ "1999 6012074922\n",
+ "2000 6088571383\n",
+ "2001 6165219247\n",
+ "2002 6242016348\n",
+ "2003 6318590956\n",
+ "2004 6395699509\n",
+ "2005 6473044732\n",
+ "2006 6551263534\n",
+ "2007 6629913759\n",
+ "2008 6709049780\n",
+ "2009 6788214394\n",
+ "2010 6866332358\n",
+ "2011 6944055583\n",
+ "2012 7022349283\n",
+ "2013 7101027895\n",
+ "2014 7178722893\n",
+ "2015 7256490011\n",
+ "Name: census, Length: 66, dtype: int64"
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "census = table2.census\n",
+ "census"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "A Series object has two parts, `values` and `index`.\n",
+ "\n",
+ "The `values` part is an array."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([2557628654, 2594939877, 2636772306, 2682053389, 2730228104,\n",
+ " 2782098943, 2835299673, 2891349717, 2948137248, 3000716593,\n",
+ " 3043001508, 3083966929, 3140093217, 3209827882, 3281201306,\n",
+ " 3350425793, 3420677923, 3490333715, 3562313822, 3637159050,\n",
+ " 3712697742, 3790326948, 3866568653, 3942096442, 4016608813,\n",
+ " 4089083233, 4160185010, 4232084578, 4304105753, 4379013942,\n",
+ " 4451362735, 4534410125, 4614566561, 4695736743, 4774569391,\n",
+ " 4856462699, 4940571232, 5027200492, 5114557167, 5201440110,\n",
+ " 5288955934, 5371585922, 5456136278, 5538268316, 5618682132,\n",
+ " 5699202985, 5779440593, 5857972543, 5935213248, 6012074922,\n",
+ " 6088571383, 6165219247, 6242016348, 6318590956, 6395699509,\n",
+ " 6473044732, 6551263534, 6629913759, 6709049780, 6788214394,\n",
+ " 6866332358, 6944055583, 7022349283, 7101027895, 7178722893,\n",
+ " 7256490011], dtype=int64)"
+ ]
+ },
+ "execution_count": 47,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "census.values"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The `index` part is yet another kind of object, an `Int64Index`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Int64Index([1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960,\n",
+ " 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971,\n",
+ " 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982,\n",
+ " 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993,\n",
+ " 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n",
+ " 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015],\n",
+ " dtype='int64', name='Year')"
+ ]
+ },
+ "execution_count": 48,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "census.index"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If you ever wonder what kind of object a variable refers to, you can use the `type` function.\n",
+ "\n",
+ "The result indicates what type the object is, and the module where that type is defined.\n",
+ "\n",
+ "DataFrame, Series, and Int64Index are defined by Pandas.\n",
+ "\n",
+ "array is defined by NumPy."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "pandas.core.frame.DataFrame"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "type(table2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "pandas.core.series.Series"
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "type(census)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "pandas.core.indexes.numeric.Int64Index"
+ ]
+ },
+ "execution_count": 51,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "type(census.index)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "numpy.ndarray"
+ ]
+ },
+ "execution_count": 52,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "type(census.values)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This function plots the estimates generated by the US Censis and UN DESA, and labels the axes.\n",
+ "\n",
+ "`1e9` is scientific notation for $1 \\cdot 10^9$ or 1 billion."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def plot_estimates(table):\n",
+ " \"\"\"Plot world population estimates.\n",
+ " \n",
+ " table: DataFrame with columns 'un' and 'census'\n",
+ " \"\"\"\n",
+ " un = table.un / 1e9\n",
+ " census = table.census / 1e9\n",
+ " \n",
+ " plot(census, ':', color='darkblue', label='US Census')\n",
+ " plot(un, '--', color='green', label='UN DESA')\n",
+ " \n",
+ " decorate(xlabel='Year',\n",
+ " ylabel='World population (billion)')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can plot the estimates."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap03-fig01.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "plot_estimates(table2)\n",
+ "savefig('chap03-fig01.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "From here on, we will work in units of billions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "un = table2.un / 1e9"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "census = table2.census / 1e9"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This expression computes the elementwise differences between the series, then divides through by the UN value to produce relative errors, then finds the largest element.\n",
+ "\n",
+ "So the largest relative error between the estimates is about 1.3%."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.2862470293832287"
+ ]
+ },
+ "execution_count": 57,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "max(abs(census - un) / un) * 100"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Break down that expression into smaller steps and display the intermediate results, to make sure you understand how it works.\n",
+ "\n",
+ "Where in the series is the largest relative error between the two estimates, near the beginning or the end?\n",
+ "\n",
+ "When I computed relative errors, I used `un` as the denominator. But that was an arbitraty choice. What happens if we use `census` instead? How much difference does it make."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {
+ "collapsed": true,
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "percent_difference = ((census-un)/un)*100\n",
+ "#percent_difference"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {
+ "collapsed": true,
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "abs_difference = abs(percent_difference)\n",
+ "#abs_difference"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.2862470293832287"
+ ]
+ },
+ "execution_count": 60,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "max_difference = max(abs_difference)\n",
+ "max_difference\n",
+ "#biggest difference was 1.286%, in the first year (1950)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.2813631502151765"
+ ]
+ },
+ "execution_count": 61,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "percent_difference = ((census-un)/census)*100\n",
+ "abs_difference = abs(percent_difference)\n",
+ "max_difference = max(abs_difference)\n",
+ "max_difference\n",
+ "#largest difference is almost the same when using census as the denominator, 1.281 instead of 1.286"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Constant growth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can select an element from a series using bracket notation and one of the elements from the index. Here's the first element:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2.5576286540000002"
+ ]
+ },
+ "execution_count": 62,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "census[1950]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And the last element."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "7.2564900110000004"
+ ]
+ },
+ "execution_count": 63,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "census[2015]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "But we can get the first and last years from the index itself:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(1950, 2015)"
+ ]
+ },
+ "execution_count": 64,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "first_year = census.index[0]\n",
+ "last_year = census.index[-1]\n",
+ "first_year, last_year"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And use them to look up the first and last elements.\n",
+ "\n",
+ "Then we can compute the average annual growth in billions of people per year."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.07229017472307693"
+ ]
+ },
+ "execution_count": 65,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "total_growth = census[last_year] - census[first_year]\n",
+ "elapsed_time = last_year - first_year\n",
+ "annual_growth = total_growth / elapsed_time\n",
+ "annual_growth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now let's create a `TimeSeries` to contain values generated by a linear growth model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "results = TimeSeries()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Initially the Series is empty, but we can initialize it so the starting value, in 1950, is the 1950 population estimated by the US Census."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
value
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1950
\n",
+ "
2.557629
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "1950 2.557629\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 67,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "results[1950] = census[1950]\n",
+ "results"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "After that, the population in the model grows by a constant amount each year."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "for t in linrange(1950, 2015):\n",
+ " results[t+1] = results[t] + annual_growth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's what the results looks like, compared to the actual data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap03-fig02.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\nBM33y9YAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "plot_estimates(table2)\n",
+ "plot(results, '--', color='gray', label='model')\n",
+ "decorate(xlabel='Year', ylabel='World population (billion)')\n",
+ "savefig('chap03-fig02.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The model fits the data pretty well after 1990, but not so well before."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Try fitting the model using data from 1965 to the present, and see if that does a better job.\n",
+ "\n",
+ "Hint: Copy the code from above and make a few changes.\n",
+ "\n",
+ "Make sure your model starts in 1950, even though the estimated annual growth is based on later data. You might have to shift the first value in the series up or down to match the data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 70,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap03-fig02.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "total_growth = census[last_year] - census[1965]\n",
+ "elapsed_time = last_year - 1965\n",
+ "annual_growth = total_growth / elapsed_time\n",
+ "annual_growth\n",
+ "\n",
+ "#add = (t - 1965)*annual_growth\n",
+ "\n",
+ "for i in linrange(1950, 1965):\n",
+ " results[i+1] = census[1965]\n",
+ "for t in linrange(1965, 2015):\n",
+ " results[t+1] = results[t] + annual_growth\n",
+ "\n",
+ "# for t in linrange(1950, 2015):\n",
+ "# add = (t - 1965)*annual_growth\n",
+ "# results[t] = results[1965] + add\n",
+ " \n",
+ "newfig()\n",
+ "plot_estimates(table2)\n",
+ "plot(results, '--', color='gray', label='model')\n",
+ "decorate(xlabel='Year', ylabel='World population (billion)')\n",
+ "savefig('chap03-fig02.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now with system objects"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can rewrite the code from the previous section using system objects."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 112,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "t0 = census.index[0]\n",
+ "t_end = census.index[-1]\n",
+ "total_growth = census[t_end] - census[t0]\n",
+ "elapsed_time = t_end - t0\n",
+ "annual_growth = total_growth / elapsed_time"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's the system object."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 113,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "system = System(t0=t0, \n",
+ " t_end=t_end,\n",
+ " p0=census[t0],\n",
+ " annual_growth=annual_growth)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And we can encapsulate the code tha runs the model in a function that stores the resulting Series as a new system variable."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 114,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def run_simulation1(system):\n",
+ " \"\"\"Runs the constant growth model.\n",
+ " \n",
+ " Adds TimeSeries to `system` as `results`.\n",
+ " \n",
+ " system: system object\n",
+ " \"\"\"\n",
+ " results = TimeSeries()\n",
+ " results[system.t0] = system.p0\n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " results[t+1] = results[t] + system.annual_growth\n",
+ " system.results = results"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can also encapsulate the code that plots the results."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 115,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def plot_results(system, title=None):\n",
+ " \"\"\"Plot the estimates and the model.\n",
+ " \n",
+ " system: System object with `results`\n",
+ " \"\"\"\n",
+ " newfig()\n",
+ " plot_estimates(table2)\n",
+ " plot(system.results, '--', color='gray', label='model')\n",
+ " decorate(xlabel='Year', \n",
+ " ylabel='World population (billion)',\n",
+ " title=title)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's how we run it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 116,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "run_simulation1(system)\n",
+ "plot_results(system, title='Constant growth model')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`plot_results` uses `decorate`, which takes parameters that specify the title of the figure, labels for the $x$ and $y$ axis, and limits for the axes. To read the documentation of `decorate`, run the cells below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 117,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "#help(decorate)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 118,
+ "metadata": {
+ "collapsed": true,
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "#plt.getp(plt.gca())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** The constant growth model doesn't make a lot of sense, because it seems like the number of deaths and births should depend on the size of the population. As a small improvement, let's write a version of `run_simulation1` where the number of deaths is proportional to the size of the population, but the number of births is constant. This model doesn't make a lot of sense, either, but it's a good exercise.\n",
+ "\n",
+ "Write a function called `run_simulation1b` that implements a model where the number of births is constant, but the number of deaths is proportional to the current size of the population. Set the death rate to `0.01`, which means that 1% of the population dies each year; then choose the number of annual births to make the model fit the data as well as you can.\n",
+ "\n",
+ "Hint: It probably won't fit very well."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 139,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "def run_simulation1b(system, num_births = .1, death_rate = 0.01):\n",
+ " results = TimeSeries()\n",
+ " results[system.t0] = system.p0\n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " results[t+1] = results[t] + num_births - results[t]*death_rate\n",
+ " system.results = results"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 140,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAEjCAYAAADaCAHrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdcVfX/wPHXZW9kigxBEFBREdyaC7emfk2xUkQrVzas\nrMyGX/f6au5yktvcmQ0rzTQzU1FDFAWULXvPC1zO7w9+XL0CelFZ8nk+Hjwe8DnrfS7wPud8zmfI\nJEmSEARBEBoUjdoOQBAEQah5IvkLgiA0QCL5C4IgNEAi+QuCIDRAIvkLgiA0QCL5C4IgNEAi+T/H\ncnJyCAgI4KWXXqJ9+/a0a9eO0aNHs3//fkpKSmo7PKA0xrS0tGo9RmFhIYmJidV6jJoQExOj/P6f\nf/7B3d2dI0eO1GJEVXfkyBHc3d35559/amQ7oXIi+T+n7t69y6hRo/jyyy9xd3fngw8+YMaMGejq\n6jJnzhw+/vhjaruLR3BwMIMHDyYsLKzajhEXF8ewYcP466+/qu0YNeGNN95gw4YNtR2G8BzRqu0A\nhGdPLpczffp0MjIyOHToEC1atFAue+2115g3bx579+6lbdu2+Pv711qcoaGhJCUlVesxYmNjiYyM\nrNZj1IRz584xcuTI2g5DeI6IO//n0N69e4mIiGD27Nkqib/MrFmzMDU15dtvv62F6ARBqAtE8n8O\n/fjjjxgYGDB06NAKl+vp6XHgwAG+++47lfLLly8zceJEvLy88PLywt/fn0uXLqms4+Pjw5w5czh2\n7BhDhw6lTZs2DBgwgD179qisl5mZySeffELv3r1p3bo1/fr1Y+XKlcjlcgDWrVvH7NmzAfD398fH\nx0e57d9//82kSZPo3LkzHh4e9OjRgzlz5pCVlaVc55NPPmHQoEEEBQXh5+eHp6cn3bp1Y+HChRQU\nFACl9cRlTzazZ8/G3d39kZ9bYmIiH330EV26dKF9+/Z89NFHnDx5UqWuuazu+ZdffsHHxwdPT0/W\nrVsHQH5+PitXrsTHx4fWrVvj4+PDihUryM/PB1Du6+TJk8pjSpJEly5d6NChg8p7mLJ1g4KClHEf\nPXq0XL13Xl4e8+bNo2vXrrRr144JEyZw+/btR55n2fuC8+fP89lnn9GxY0fat2/P7NmzycvL48yZ\nM4wYMQJPT09GjBjB33//rbL9486zTGpqKrNnz1Z+nrNnzyY7O7tcPHK5nFWrVin317dvX9asWUNh\nYeEjz0N4OqLa5zkjSRIhISF4e3ujra1d6XpOTk4qP586dYq3336bpk2b8uabbwJw8OBBJk6cyNq1\na+nbt69y3T///JMTJ07g5+eHpaUl+/fvZ/78+djb29OrVy8A3nvvPW7evIm/vz/W1tZcvXqVzZs3\nk5GRwYIFC+jfvz/Jycns37+fadOm0aZNG6C0emPy5Ml4e3vz7rvvIpPJ+Ouvv9i/fz+ZmZmsWbNG\nGUdaWhpvvPEGgwcPZvjw4Zw9e5Zdu3aho6PDxx9/TMeOHZk2bRobN27k5Zdfpn379pV+Hjk5Ofj5\n+ZGcnMyECRMwMzPj4MGDnD17tsL1P/vsM/z8/DAyMqJdu3YUFhby2muvce3aNV566SVat25NUFAQ\nW7ZsITAwkJ07d9K1a1e0tbW5cOEC/fr1A0qrvtLT05Xflz2p/fnnn1hYWNC8eXOWL1/Oxx9/TIcO\nHRgzZgwuLi7cuXMHgBUrVuDu7s4777xDYmIi33zzDW+88QYnT55ET0+v0vOF0gto8+bNmTlzJhcv\nXuTIkSMkJCRw8+ZNxo8fj7GxMZs3b2bGjBmcPHkSExMTtc5TW1sbuVyOn58fsbGx+Pv7Y2VlxdGj\nRzlx4oRKDAqFgqlTp3LlyhXluQUHB7Nx40ZCQkL4+uuvkclkjzwP4QlJwnMlNTVVcnNzk95//321\ntykqKpJ69uwp9erVS8rOzlaWZ2ZmSj169JB69OghFRYWSpIkSX369JHc3d2lkJAQ5XpJSUmSu7u7\n9MEHH0iSJEkpKSmSm5ubtHXrVpXjfPLJJ9KECROUPx8+fFhyc3OTLly4oCx74403pD59+khyuVxl\n2zFjxkheXl7Kn2fNmiW5ublJO3fuVFlv8ODB0gsvvKD8+cKFC5Kbm5t0+PDhR34G69evl9zc3KS/\n/vpLWZadnS317t1bJcaymOfMmaOy/d69eyU3Nzfpm2++USnfsmWL5ObmJu3evVuSJEny9/eXhg4d\nqly+Y8cOqWvXrpKHh4fKufj4+EizZs1S/uzm5qbyc9l5jRw5UioqKlKWr1u3TnJzc5POnz9f6bmW\nbTtq1ChJoVBIkiRJCoVC6t69u+Tm5iadOXNGue6BAwckNzc36dy5c1U6z127dklubm7Sb7/9plwn\nNzdXGjJkSIWf59mzZ1X29+2336psX9HfivB0RLXPc0ZDo/RXqlAo1N7m5s2bJCQkMG7cOIyMjJTl\n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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "run_simulation1b(system)\n",
+ "plot_results(system, title='Constant growth model')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Proportional death, proportional birth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now let's get to a more realistic model where the number of births and deaths is proportional to the current population."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 141,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def run_simulation2(system):\n",
+ " \"\"\"Runs the constant growth model.\n",
+ " \n",
+ " Adds TimeSeries to `system` as `results`.\n",
+ " \n",
+ " system: system object\n",
+ " \"\"\"\n",
+ " results = TimeSeries()\n",
+ " results[system.t0] = system.p0\n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " births = system.birth_rate * results[t]\n",
+ " deaths = system.death_rate * results[t]\n",
+ " results[t+1] = results[t] + births - deaths\n",
+ " system.results = results"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "I kept the death rate at 1% and chose the birth rate to fit the data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 142,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "system.death_rate = 0.01\n",
+ "system.birth_rate = 0.027"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's what it looks like."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 145,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap03-fig03.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAEjCAYAAADaCAHrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVPX++PHXsO/7poIKCKggyKa470ualBmWisstl1zK\nSkvzmmlfzfRmuXbdK3fTJLcWu2aamikoIsjqgqCyI/s2zPn9wY/RicVBBUE/z8fDx2Pmc875nPeM\nzHvOfM5nkUmSJCEIgiA8VzSedgCCIAhCwxPJXxAE4Tkkkr8gCMJzSCR/QRCE55BI/oIgCM8hkfwF\nQRCeQyL5C9WaO3cubm5uKv/atWuHj48PQUFBhISEPO0QH1lmZiaFhYXK55Wv9WlrLHHUZOzYsfTt\n27fBjhPql9bTDkBo3D766CPMzc0BkCSJ/Px8Dh06xNy5c8nOzuaNN954yhHWzcmTJ5k9ezYhISEY\nGBgA8Nprr9GlS5enHJkgNCyR/IVa9e/fH3t7e5WyV199lSFDhrBu3TqCg4PR0dF5StHVXUREBLm5\nuSpl3t7eeHt7P6WIBOHpEM0+Qp3p6enRt29f8vPziY+Pf9rhCILwCMSVv/BIZDIZAOXl5QD07duX\nrl27olAoOHLkCGZmZvz4449YWFgQGhrK2rVruXz5MgAdOnTg7bffxt/fX1lf37596dKlCx07dmT9\n+vVkZmbStm1b3n33XQICAlTOrW59/4ynXbt2/PHHHwD069ePTp06sX37dubOnUtISAixsbHK42/f\nvs3KlSv5888/KSgowNHRkeDgYEaOHKncZ+7cuYSHh7N8+XKWL1/OlStXMDQ0ZMiQIcyePRs9PT3l\nvn/99RdbtmzhypUr5OfnY2FhQZ8+fZg9ezYmJiZqv+9z584lMjKSRYsWsXz5cqKjo7G2tmbGjBm8\n+OKLrF69mh9++IGysjK6devGJ598omy2A4iNjWXVqlWcP3+e0tJS2rZty+TJk+nfv7/Kec6ePcvq\n1auJiYnBysqKKVOmVBtPQkICX331FX///TdlZWW0a9eO6dOn06NHD7Vfk/B0iOQv1JlCoeD8+fPo\n6Ojg7OysLD969ChOTk7MmzePjIwMLCwsOH78ODNmzKBly5ZMnToVgH379jFhwgRWr15Nv379lMef\nPXuWQ4cOMXbsWKytrdm9ezcTJ05k69atdOrUCaBO9f0znm7duqGtrc1vv/3GRx99hIuLS7WvLykp\niZEjR1JSUkJwcDDW1tYcO3aMjz/+mJs3b/Lhhx8q983KyuLNN9/khRdeIDAwkFOnTrF9+3Z0dHSU\n+50+fZpJkybh4+PDO++8g0wm48yZM+zdu5ecnBxWrVpVp/c/PT2dt956i6CgIAIDA9m2bRvz5s3j\n8OHD5OXlMX36dK5du8bOnTvR19dn6dKlQEWT17hx4zAyMuJf//oXhoaGHDx4kOnTp7NgwQLGjBmj\n/H+YNGkSrVu35t133yUrK4slS5Ygk8mqfJGMHj1a+eWgra3NkSNHmDx5MitWrGDIkCF1el1CA5ME\noRpz5syRXF1dpaioKCkzM1PKzMyU0tLSpEuXLkkzZ86UXF1dpc8++0y5f58+faS2bdtKKSkpyrKy\nsjKpZ8+eUq9evaS8vDxleU5OjtSjRw+pR48eUmlpqfJ4V1dX6bffflPul5mZKfn5+UkjR458pPr+\nGY8kSdLq1aslV1dXKSkpqcprrfTuu+9Kbdu2lSIjI5Vl5eXl0pQpUyQ3NzcpLi5O5bht27apnOOF\nF16Qunfvrnz+5ptvSn369JFKSkpU9hs5cqTk7e1dYxzVqdxn+/btyrI//vhDcnV1rXKO119/XSWO\noKAgqWPHjtLdu3eVZcXFxdLw4cMlT09PKTMzU5IkSRo+fHiV9/ivv/5SnqNScHCw1L9/f6mgoEBZ\nVlZWJo0ePVrq2rWrMpbg4GCV44TGQbT5C7UaPnw4Xbp0oUuXLnTv3p3XXnuN48ePM3bsWGbNmqWy\nb8uWLbG1tVU+v3r1KikpKYwZMwYjIyNluYmJCcHBwaSmphIZGaksd3JyUml+sLCw4KWXXuLy5ctk\nZmbWub5/xqOO8vJy/vjjD7p37467u7uyXENDg7feegtJkvj9999VjnnhhRdUnrdt25aMjAzl8w0b\nNvDDDz+o3BjPzs7GyMhIpctpXQwYMED5uHXr1gD06NFD5Rz29vakp6cDkJGRweXLl3nppZews7NT\n7qOrq8ubb75JcXExZ8+eJTMzk6ioKIYOHaryHgcEBKh0Q83Ozub8+fP06tWL4uJisrKyyMrKIjc3\nlwEDBpCRkcGVK1ce6bUJDUM0+wi1+s9//oOVlRVQkQBNTExwdnZGV1e3yr6WlpYqz5OTkwFwdHSs\nsq+TkxMAd+7cUfa0adOmTZX9WrVqhSRJ3L59u871/TMedWRnZ1NYWFjtOSqbuG7fvq1SbmFhofJc\n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\nFi9eTFFRkXJ7TEwMwcHBeHl58eKLLxIVFaVyToVCwfr16+nTpw8dO3ZkxIgRnDx5ssFesyA8KoVU\ndcnTMV6jGOreg170xUrTGkODiqUU3d3dReKvhlpX/idOnODjjz+mR48eKuX9+/cnKyuLL774gkWL\nFtVLgI8jNjaWuLg4tfZt1apVlXVkIyIiSExMVOt4V1dX3Nzc6hzjg7788kuWLFlC69atmTt3LpMn\nT6ZDhw5s2rSJGzduMGvWLPz8/Bg9ejSXL19mwoQJjB07lkWLFpGcnMzChQtJTk5m/fr15OTkMGHC\nBAICAvjhhx+4efMmH3/8scr5VqxYwW+//cann35Ky5Yt+fPPP5kxYwabN2+mc+fOj/VaBKE+KCQF\nJ2+e5GTiSd7zn42p4f2lP410jBjQzJ/oe3extTVET08Lb29vmjdv/hQjbrzUSv46OjoYGxtXu028\nsU/OyJEj6du3LwAvvfQSn376KQsXLsTBwQFXV1c2b95MfHw8AFu3bsXDw4M5c+YAFStiLVy4kMmT\nJxMfH8+FCxcoKytjyZIlGBoa0qZNG1JTU5WLvBcUFLBt2zbWrFmj/FJv1aoVMTExbNy4USR/odFJ\nykliR8QOrmfdICk5j9E/L2PH3H9jbl6xwpZMJsPPz4/i4tNoaGjg7++PhYXFU4668VIr+Y8aNYpV\nq1bh5eWFldX9LlKFhYVs3LiRoKCgegvwefLgEor6+vpoaGio9MrR09NTNvvEx8fTq1cvleP9/PyU\n2+Lj43F0dFR21wXo2LGj8vG1a9coLS1l5syZaGjcb/0rKytT+T8WhKetRF7C4bjDHL9+HIWkIDom\nk8zMYgwUN9m15wrTp/or9zU2NqZTp07o6emp/O0LVdWY/N944w3lY0mSuHbtGv3798fHxwdLS0ty\nc3O5ePEicrkcGxubBgm2rtzc3B6rKcbT07NKU1B90tJS/e+QyWQ1tlPq6elVKatclE1LSwuZTMY/\nF2nT1tZWPq7s6rZmzRpatWqlst+DXwaC8DRdSb3Criu7yCrKUpa1cjDH6HZLHEp8yb2XT3GxHD29\n+58dS8umt5j601Bj8i8rK1N57uPjoyxPSUkBoG3biiXN0tLS6is+oQbOzs5cunRJpSwsLEy5LScn\nR7mIuqmpKQCRkZHKfVu1aoW2tjapqan07NlTWb527VrKy8uZOXNmA7wKQajeveJ77I3cy8W7F1XK\n3azcGNNnDCc0UikuvomNTTElJQXo6Zk+pUibrhqT//bt2xsyDqGOJk2axPDhw1m2bBlBQUHcvn2b\nRYsW0atXL5ydnbG1tWXdunV8+OGHzJo1i9TUVFavXq08Xl9fnwkTJrBixQoMDQ3p0KEDJ06cYN26\ndSxZsuQpvjLheXfm1hm+j/qe7Lw8Eq7dw7G1KbYW5gS1DyLAPoCcnBwsLFIoKZFRXi7n/Pnz9OnT\np8ovZ6F2Nb5bYWFh+Pr61rnC0NBQZduzUH9cXV1Zv349K1euZPv27ZiZmTF06FDeffddAIyMjPju\nu+/49NNPCQoKwsbGhkmTJilv+AK8++67aGtrs3z5cjIyMnBwcODTTz8VC/kIT5WERNLdLGLjslEo\nJJqX27Nw+IeY6Blz9+5dLl26RHl5OVDRRNmuXTuR+B+BTPpnw/D/FxgYiLOzM1OnTsXV1fWhFUVE\nRLBp0yZu3rzJ4cOHn2iQD1uFXhCEZ4ckSXxybAk/H4/BKb8vFpID773ni0yWqTLVvI6ODn5+fqKN\nvwYPy5s1fl3+8MMPrF27lhEjRtC6dWsGDhyIp6cn9vb26Ovrk5ubS2pqKmFhYZw6dYobN24QHBzM\nihUr6vUFCYLw7LicchkzPTNamd3vdCCTyXi/1wz85WlERmQzerQrmZk3uH37tnIfQ0NDOnfuLHr0\nPIYar/wrpaam8u2333LkyBHS09NVep9IkkTz5s0ZNGgQEyZMwNbWVq2T7tu3j82bN3P37l3atGnD\nBx98UOscQeLKXxCeLdlF2eyO3E14SjjkmjHDcxaeHVTzR3m5gtLSUsLCQsnOzlaWW1lZ4evrKyZn\ne4hHvvKvZGtry5w5c5gzZw7Xrl0jOTmZvLw8zM3Nad68OY6OjnUKKCQkhEWLFrFw4UL8/f3ZtWsX\n06ZN4/DhwyKxC8IzTiEp+P3G7xyKPURuQQGxsdncy7lNXtRuvnGZodJlU5IUnD17hsLCQmVZq1at\n8PDwEN2Rn4A63SVxdnbG2dn5kU8mSRJr1qxh0qRJvPrqqwDMmTOHc+fOcenSJZH8BeEZdvPeTXZE\n7CApJwkADU0ZhYVl2JW6o5/rxG+/JTJs2P38oqWlRcuWLYmJiUEmk9G+fXscHR3FHD1PSIPeIr9+\n/Tq3b99myJAhyjINDQ0OHjzYkGEIgtCAisqK+DHmR04mnlQZeNjK3IEh/d7g+L4C+g9oxcCBraoc\n26ZNG4qKirCzs2u0g0mbqgZN/jdv3gQgNzeXcePGER8fj5OTE7NmzVIOIhME4dkgSRIX715kT+Qe\nMguyyc8vw9xMD21NbV50fZH+Tv3RlGnSw70QW1tDysvLKS0tVWnLl8lkDTrK/nnSoA1n+fn5AMyd\nO5egoCA2b96Mi4sL48eP59q1aw0ZiiAI9SyzKJNNFzcRn3SX0NBUrl7NxMnYjYW9FzK4zWC0NCqm\nIbG1NaSoqIgzZ85w4cIFFIqq0zULT16DJv/KuWXeeusthg0bhru7O5988gmtW7dm9+7dDRmKIAj1\nzMrAigGOA0lKykNWqo9r3gsYX+2DlYHqxIGZmZn8+eef5OTkkJWVxZUrV6rMSyU8eQ3a7FPZZvfg\noDGZTIaTkxPJyckNGYogCE9YQWkBhjqq/e4D2w4jrVcRoXtMsDY3pXt31U4diYmJKsleJpNhZmYm\nbuo2ALWSf0lJCRs2bOCPP/6gsLCw2m/lX3/99aH1uLu7Y2BgwJUrV+jQoQNwf8ZQsRawIDRNxfJi\nDsYc5GzSWWZ2nINTs/trfGhrajO1zxhCjVPo0MEKXd2KlKNQKIiMjFRZLElXVxdfX18xYreBqJX8\nlyxZwr59++jUqRMuLi6P3MdWX1+f8ePHs3LlSqysrHB1dWXXrl3cunVLZdIxQRCahojUCHZd2UVG\nfiY3b+Yy/n+fseOdJbRqpTrLpp+fnfJxSUkJoaGhZGXdn6bZ1NQUf39/9PX1Gyz2551ayf/XX3/l\nvffeY/LkyY99wpkzZ6Kvr89nn31GZmYm7dq1Y+vWrTg5OT123YIgNIzcklx2X9mtnHI5PuEeaWmF\nWEiWfLfjMvM/6oGGRtWmm+zsbEJDQykuLlaWtWjRAi8vLzQ1NRssfkHN5F9aWvrEulvJZDKmTJnC\nlClTnkh9giA0HEmS+Cv5L/ZF7aOw7P7IW/c2zbFOcsGi2AVzRyOKi+UYGGirHJuZmcm5c+eUvXlk\nMhlt27bF2dlZtPE/BWol/+7du3Pq1CkCAgLqOx5BEBqpzMJMtkdsJzo9WqW8q0NXXm3/KhfMMjE0\n1MbPz67aZG5mZoaJiQn37t1DW1sbX19frK2tGyp84R/USv6BgYHMnz+f7OxsfHx8ql1CcNiwYU88\nOEEQGoe/kv5i15Vd5BUVkZCQTbNmhri2cCDYM5h21u0A6N279hk2NTU18fPz4/Lly3h6emJgYNAQ\noQs1UCv5v/3220DFpGwhISFVtstkMpH8BeEZZqxrTFpmLlevZlJeLmGV48mHr8zG1KjmhJ+Xl4eR\nkZHKrwB9fX3RgtBIqJX8jx8/Xt9xCILQiHnYeNDHpQdJ0Wdond8H43I74mPy8POrmvwlSeLGjRtc\nvXqV9u3bi84cjZRayb9FixbKx4WFhRQUFGBmZqYcsSsIwrPjbt5d8kvzcbF0USmf4BdMR43BHD18\nk3Hj3HFxMa9yrFwu5/Lly9y5cweAq1evYmpqKvruN0Jqj/D9+++/+eKLL4iKilIO8vL09OTdd98V\nA7QE4RmgkBT8du03DsUeQibXZVzLd+nk3VK5XU9Lj87+LfDzaY6WVtWxPnl5eYSFhZGXl6csMzMz\nE237jZRayf/ChQu8+eabODo68s4772BpaUlaWhq//PILkyZN4ttvvxWLtgtCE5aSn8K34d9yPfs6\nt5PzuZmYS/zp9expvQBz8/sdPGQyGVpaVXvy3L59m4iICORyubKsdevWuLu7i4VXGim1kv+qVavo\n0qULGzduVLl5M23aNCZPnsyaNWv47rvv6i1IQRDqh0JS8L/r/+NgzEHkCjmSAlJSCjAss8a6sAO7\ndkUzfbp3zccrFFy9epUbN24oyzQ1NenQoQMODg4N8RKER6RW8o+MjGTlypVV+u7KZDLGjBnD+++/\nXy/BCYJQf9IL0vkm/BuuZd2fTl1bS4vp/YL5e5cJDvYmBAbWvHJfUVERYWFhKuvrGhoa4ufnh4mJ\nSb3GLjw+tZK/iYmJyjqaDyooKBDDsgWhCZEkiT9v/cn+q/vJLy5EW6vi8+tg6sCEjhOwN7EnwCoD\nNzcLNDWrb7KRJInQ0FDu3bunLGvWrBleXl6iI0gToVZjXEBAAGvWrCE1NVWlPDU1lTVr1ogbvoLQ\nhGwM28j2yzuIu57O+b9TKCyUM8xtGB91/wh7k4opl9u3t6ox8UPFr/4OHTqgoaGhXF/X19dXJP4m\nRK0r/1mzZjFixAgGDRqEr68vVlZWZGRkEBYWhpGRER988EF9xykIwhPSzrode/88zt27BRgoLLCJ\nHcrgEUPQrOONWTMzM+VIXdGVs+lR63/b1taWkJAQRo0aRV5eHuHh4eTm5jJ69GhCQkLEjR1BaEJ6\ntOxBvw6daCX3xSdvFLZ69hQWltV6TEZGRpVf/gAODg4i8TdRavfzt7a2Zs6cOfUZiyAIT1hcZhzG\nOsY0M26mLJPJZHzU7326aSUjl0v07duy2umXoaJtPy4ujvj4eLS0tOjRoweGhrXP4SM0DTUm//Xr\n1/PKK69gY2PD+vXra62kcppmQRAaB7lCzqHYQ/x67VfKMox5v9MHeLS3VW7XkGnQu3fLWmqA4uJi\nLl68SGZmJgBlZWVERkbSuXPneo1daBg1Jv+VK1fStWtXbGxsWLlyZa2ViOQvCI1Han4qWy5tIS7t\nOnFxWWRnJ7Mwbivb5s+uMsd+TdLT07l06RIlJSXKMisrK7y8vOorbKGB1Zj8Y2Jiqn0sCELjJEkS\nZ5POsidyD6XlpchkkJ9fhrncAaNcN44du8nLL7vUWodCoSA2NpaEhARlmUwmw9XVFRcXF7HoyjNE\nrRu+a9eurfZmD1QM6168ePETDUoQhLopLCtk08VNbLu8jdLyUgAMdHWZ1ms8HQpfIXCgBy++WPOA\nLaiYtPHs2bMqiV9XV5eAgABcXV1F4n/GqHXDd926dfTs2RNbW9sq28LDw9m7dy/z589/4sEJgvBw\n17KuseniJu5mp6OnV/GRbmbcjIk+E7E3sSfVqwBb29pv0qakpBAeHk5Z2f1eP9bW1nh7e6Orq1uv\n8QtPR43Jf9SoUYSHhwMVPydfe+21Givp0KHDk49MEISH+jXhV/ZF/vD/2/aL8fW1ZYBrX4Lcg9DR\n1AF4aOKHiqadysQv1tZ9PtSY/BcvXsyxY8eQJInVq1czcuRI7OzsVPbR1NTE2NiY/v3713uggiBU\nlVeax5XIdHJzS9GSdLFK7MvoEaPrnLRtbW1xdHQkNTUVHx8fzM2rztUvPFtqTP7Ozs5MnToVqLgJ\nFBQUVG2zjyAIT8/LbV/m7w5X+PPUHdwKBtHRqz3l5VK10y5XkiSJ4uJi9PX1Vcrbt2+Pm5ubmKLh\nOaFWm/+MGTMAyM7OpqysTLmYiyRJFBYWEhYWRlBQUP1FKQgCCklBaXkpelr359fX0tBiweDZnNFP\no7mdCZ6e1rXWUVJSohyh36tXL3R0dJTbNDQ0xNz7zxG1kn9sbCyzZ89W6QXwIJlMJpK/INSjnOIc\nNl/cTNLNQj7o9S4tWhgrtxnrGjN4oHEtR1dIS0sjPDxc2Xc/IiICX19f0a7/nFIr+S9fvpx79+4x\nZ84cTpw4gY6ODn369OHUqVOcOnWKbdu21XecgvDcik6P5r9/b+Ri1C0yM4vJTtjClnnvVLuUYnXK\ny8uJjo5WWXAFEMsrPufU+usJDw9n5syZTJgwgSFDhlBUVMTo0aNZv349/fv3Z/v27fUdpyA8dxSS\ngsOxh1n19yqyC3LIzi5BBqRl5HP8eKJadeTk5PDnn3+qJP7Kvvvt27cXV/3PMbWu/EtLS2ndujVQ\nsS7ngyN+X3nlFT755JN6CU4Qnle5JblsubiFmIyKz5qBgTYdXFogXfTnlZ7d6du39nl5JEni+vXr\nxMTEoFAolOV2dnZ4enqKvvuCesm/efPmJCcn4+fnR+vWrcnPz+f27du0aNECXV1dcnJy6jtOQXhu\nxGXGsSF0I/mlecqytlZteWPAG2T1lXB0NKv1+KKiIsLDw8nIyFCWaWpq4u7uTsuWLcXVvgComfz7\n9+/PF198gaGhIQMGDMDJyYlVq1YxZcoUvv322zrN55+QkMDQoUOrlO/cuRM/Pz/1IxeEZ4wkSfwc\n/zP/PbGTO3fy6ehtg7aWJkNdhjLUdSgaMg1MHR9eT0ZGhkriNzMzw9vbGyMjo3qMXmhq1O7qmZiY\nyPfff8+AAQP46KOPmDFjBocPH0ZTU5Mvv/xS7RPGxcVhbm7O4cOHVcrNzGq/mhGEZ92v135l2cGt\npKUXAZB8vZSVY+fSzrpdneqxt7cnJSWF1NRU2rRpg6urq+jCKVShVvLX19dn7dq1lJZWTBjVo0cP\nDh8+TFRUlPKnpLri4uJo06YN1ta190cWhOdNr1a9+L75z6SlJ2Aqb45fQRCOxrXPwgkgl8vR0rr/\nUZbJZHh6elJQUICFhUV9hiw0YWqv5AWoDAhp2bJlnZJ+pfj4eJycnOp8nCA86/S19flk6Pt8mXuQ\n7tYDGf6ya63dOeVyOVevXiUrK4sePXqgqamp3Karqytu6gq1qjH5Dxw4sE43hn799Ve19ouPj6ek\npISRI0dy+/ZtXFxceP/99/H09FT7XILQ1OWV5PFz+J8MdOuLmdn9EbutzFqx8q23H/rZy8zMJDw8\nnMLCQqBizQ13d/d6jVl4ttSY/H18fJ54r4Di4mKSkpKwsLDgww8/REdHhx07dhAcHExISAjOzrXP\nNy4Iz4LotBg+DvmSq9dv87dNFl+8P0bls1bb5668vJzY2FiuX7+unGYFKnr4SJIkevIIaqsx+X/+\n+edP/GR6enpcuHABHR0dZRPS559/TlRUFLt27eLjjz9+4ucUhMaictDW95cOcvVaKhJwLOUHfvrN\nj6ED2z70+OzsbMLDw8nPz1eWaWtr4+HhQYsWLUTiF+pErTb/ixcvPnQfHx8ftU74z+5mGhoatGnT\nhrt376p1vCA0RVlFWWy+uJlrWdcwMtLG3sGY1Fty+lq8Qifv2u+dKRQK4uLiSEhIULnat7a2xsvL\nq8rsnIKgDrWS/+jRD58fPDo6+qH1REZGMm7cOLZt24aHhwdQ8TM2JiaGwYMHqxOKIDQ5YXfC2BGx\ng8KyQmXZQJ9OtHcfxODe7dHQqPmzlZOTw6VLl8jLuz/gS0tLi/bt24sBW8JjUSv5VzdxW2FhIaGh\noRw8eJA1a9aodbK2bdvSokULFixYwCeffIKBgQGbNm0iOzubcePG1S1yQWjkisuKWfzjen6LPYmn\npzUaMhkaMg0C3QIZ1GYQGrKH971PT09XSfyWlpZ07NhRTMomPDa1kn+nTp2qLe/duzcGBgb897//\nZcOGDQ8/mZYWmzdvZvny5bz11lsUFRXh4+PDjh07sLS0rFvkgtCIJeckM3nTIm6k3QHgVmIuPu0c\nmegzEWcL9Ts2ODs7c/fuXfLy8mjXrh2tW7cWV/vCE1Gnfv7V8fPzY9OmTWrvb2try4oVKx73tILQ\nqBnpGmFoJkFaxXPdzNZ81O3fmOjXPMVCeXk5ZWVl6Ond7/opk8nw9vZGJpNhaPjwtXgFQV2PPeb7\nxIkT4o9SEP7BTM+MeUOnY21uzFj38eyft7jWxJ+VlcWpU6cICwtTuakLFZ0kxGdMeNLUuvJ/4403\nqpSVl5eTkpLCrVu3mDRp0hMPTBCaivJyBXt//YvAnv4YGd0fBe/dzJuj723GWK/mpC+Xy4mJieHm\nzZvKpH/z5k0cHdWYwU0QHoNayb+srKxKmUwmw9nZmYkTJzJixIgnHpggNAXR128zZ+dXJORFcyt5\nKnMnv6iyvbbEn56eTkREhHKULlTcF3twmgZBqC9qJX+xUpcgVBV2J4zVf20mPu8WAHvjdjLkqg+e\n7ZvXelxpaSlXr14lKSlJpdzGxgZPT0/Rb19oEHW64Xvy5EnCwsLIycnBysqKgIAA/P396ys2QWiU\n8kvz2X1lN6F3QtEzARtrfTIyixns2RXXNjX3WpMkiTt37hAVFaVcRB0qJkx0d3cXo3SFBqVW8s/O\nzmbSpElERkaio6ODhYUFmZmZfP3113Tr1o1169aJGQSFZ55cruDvxDBCru0lr+R+33tfd0decRpF\n97Y1j3KXJInQ0FBSUlJUyps3b46Hh4f4/AgNTq3kv3jxYpKTk1m/fj29e/dWlh8/fpx///vffPHF\nF/z73/+urxgF4amLirvNvF1rSdOJpUMHK2RUXKF3a9mNoPZB6GvX3lQjk8lUBmbp6enRoUMH7Ozs\n6jVuQaiJWsn/1KlTzJs3TyXxA/Tr14+srCy++uorkfyFZ1bYzUgmbv6UYgqgEFJSCmjX2p6xXmPx\nsPFQux43NzdSUlKwsbGhXbt2KguwCEJDU+uvT1NTE2Nj42q3WVtbV9sbSBCeFQ7WNtg56HAzqQBN\nTRnupt583HsaBtrVT7Egl8tJSEigdevWKgO2tLS06NWrl0j6QqOg1iCv0aNH89VXX5GamqpSnp+f\nz8aNGwkODq6X4AShMbAxtGHmoLE4tbBl3YSPWTpydo2JPy0tjZMnTxIfH09UVFSV7SLxC42FWn+J\naWlppKWlMWDAAHx9fbGxseHevXtcvHiRgoICdHR0lAPBZDIZW7ZsqdegBaG+hEbdYP///mLx9NdV\nllAc6DKAno49akz6RUVFREVFqUxNfufOHRwdHcU6ukKjpFbyT0xMpG3bisUm5HI5d+5UTFZVWVZe\nXk55eXk9hSgI9U+SJD7buZs9EftQUI5rSCveCOqm3K4h06g28UuSxI0bN4iNjUUulyvLdXR0aN++\nPebm5g0SvyDUlRjkJTz3UvNT2R6xnXMFl5BTCsC3Ydt4fag/BgY6NR6XnZ3NlStXyMnJUSl3cHCg\nffv2ytXqBKExqlMDZEJCAufPnyc/Px9zc3N8fX1xcnKqr9gEoV7JFXKOXTvG0bijyBVymjU3JCOz\nCFNNS5aMfLvGxF9aWkpMTAy3bt1SmYTN2NiYDh06iOnJhSZBreSvUChYsGABP/zwg8ofu0wm46WX\nXmLp0qViZKLQZJSXK9j182kiNY9xT56uLNeUafLei2N4uf0wdLRqvmq/d+8eiYmJ94/T1MTFxQVn\nZ2c0NB57olxBaBBqJf+NGzfy448/MmvWLIYNG4aVlRXp6ekcPnyY1atX4+zsLGb2FJqEqNi7LNi9\nnujCUKyt9WnbtuIqvZVZK8Z6jsXB1OGhddjY2GBnZ0dKSgq2trZ4eHiIlbWEJket5L9//37eeust\nJk6cqCyzs7Nj0qRJlJSUsH//fpH8hSZhV+y3XC0MBSAtvYjWDjCu00j6OPapdlnFsrIyCgsLMTU1\nVSl3d3fHwcFBjNAVmiy1fqOmp6fj6+tb7TYfHx+V7m2C0JhN7PE6NtYGaGrK6OveieVDFtPPqV+V\nxN/tlv8AACAASURBVC9JErdu3eLEiRNcuHBBpScPgIGBgUj8QpOm1pW/g4MDly5dokuXLlW2Xbp0\nCWtr6ycemCA8rvhrGRjq69K8+f3R6Y7mjkwb8Do2+nb0du1a7b2qe/fuERkZSXZ2trIsISFB2bVZ\nEJ4FaiX/V199lS+//BIDAwOGDBmClZUVGRkZHD16lA0bNjBlypT6jlMQ1JabW8K6vb+yP3YvnS17\ns27uRJUk/1rH6hcfKikpISYmhqSkJJWODfr6+lWafQShqVMr+Y8dO5bo6Gg+//xzli1bpiyXJInA\nwECmTp1abwEKQl3kluSy5dIOdlz7CYWGxOmsX/jfqZ4M6OVW4zEKhYKbN28SFxenMk+VhoYGzs7O\ntGnTRkzLIDxz1J7YbdmyZUycOJHQ0FBycnIwMTHB398fFxeX+o5REB5KISk4efMkP8b8SLG8mBYt\njEhKysPSWhfDZgU1Hpeenk5UVBR5eXkq5ba2tri7u4uF04VnVp0uZ5o1a4aDgwOmpqZYWFjg4PDw\nbnGCUJ8yMgqJvB3PmZwj3Mq5pSxv2dKYHk4BvNPvX5jqVd9kI5fLCQsLU7naNzQ0xMPDAxsbm3qP\nXRCeJrUHef3nP/9hx44dyOVyZXuovr4+U6dOZfLkyfUapCD8U0mJnB+PXmXT6V1kGUXj62uLhkZF\nu76tkS2jO4ymrVXtN2i1tLRwc3MjMjISLS0tXFxccHJyEgO1hOeCWsl/zZo1bNu2jXHjxjFo0CAs\nLS3JyMjgl19+YfXq1RgaGjJmzJj6jlUQlBIyr7E8dDGFWgVQDEnJebRxtGSIyxAGOg9ES0P1T1uS\nJLKysqpMvdCqVStKSkqqzL0vCM86tQd5TZs2jenTpyvLHBwc8Pb2xtDQkO+++04kf6FBOdu0ws3F\nkkvRBRgb69DFyYfpvf6FlYFVlX0zMjKU7frdu3fHzMxMuU1DQ0N04RSeS2r9vs3Pz8fT07Pabb6+\nvqSlpT3RoAThQXl5pURFZaiU6WnpMXPAvwjwcmbjxE9YMHh2lcRfUFDAhQsX+Ouvv8jNzUWSJK5e\nvarSjVMQnldqJf/evXuzZ8+earcdPXr0/7V351FNXevfwL8hIYRREmaRQQIBBWQQZJQ6vdaRom21\nVtvq9TrUrquu9kcdarn3rdb6tlqhVtvqba2tQ6vvta3UjiJgcUAmsVIGARllRiBMEZL9+4Pr0RSp\ncSAEeT5rZS04++TkeUzyeNhnn70RERHxQC9+6dIljB49GqmpqQ/0fPJ4U6kYTp0qwfJ/7kf0/l1o\naVGotY+zD8Qnz22Hr52v2jj+mzdvIicnB0lJSaiurua28/l8WFhYUPEnBBp2+wQEBCA2NhazZ8/G\nzJkzYWVlhaamJiQlJSEjIwOLFy/Gxx9/DKBnpk9Nbvpqb2/H66+/TovAkD7Vtdbj/d8+wDVBPgBg\n99c/Y8OySK6dx+NByL89+2Zf4/UBYMSIEfDw8IChoaF2gidEx2lU/Ddv3gwAkMvliI2N7dX+2Wef\ncT9rWvy3bdsGGxsbtalxCQEApUqJU8WnEF8QDxNXOfA7YGQoQL1FJoDIXvszxlBdXY3c3Fy0tamP\n6ZdIJPD09FTr5yeEaFj88/LyHumLJicnIykpCfv27UNkZO8vMxl6urtVKCy8AYH1DRy6fAjX5T1L\nhYrNRfAcbYlI3yl4xvPu0zLweDyUlpaqFX5jY2OMGjUKtra2tNYEIXeh9XvWGxsb8cYbb2Dr1q00\nXwoBAOTlNeDAkSyktvyC4UH1MDbW59pGmI3AuvCFcBH/9Ypxo0ePxpkzZyAQCCCTyeDs7Ezj9Qn5\nC1ov/v/85z8xadIkREREqF2MI0OTSqXCR/EnkNj+Pbr0O9FWKISPjxVEAhEi3SMxaeQktemWFQoF\niouLIZPJwOfzue1mZmbw8/ODlZUVrZ1LiAa0Wvy/+eYb/PHHHzhx4oQ2X5boMB6PByvfBihPdYKv\nx4OVlSF8bHywwHsBJIYSbr/u7m4UFRWhuLgY3d3dEAqFkEqlaseyt7fXdviEDFpaLf7Hjx9HTU0N\nwsPDAYAbcrds2TJERUXhrbfe0mY4ZADU1bXDyur2koc8Hg8vhy3B5co/MNxSgiUBL8DH1odrV6lU\nKC0txdWrV6FQ3B7qefXqVTg5OdFsm4Q8IK1+c7Zv347Ozk7u97q6OixcuBBbtmxBWFiYNkMhWtbR\n0YXvvivCt7+dx7oVT8JvzHCuzcLIAptnrYOzuTMMBAYAek4MKisrkZ+fj/b2drVjmZmZYdSoUWrd\nPoSQ+9Nn8a+pqbmvA9nY2Nz3PgYGBtz2P8+5Qh4vX31zGZ9fPIxa4zxsPVqNQx6vQyi8XbzdLXvm\n22eMoba2Fnl5eWhpaVE7hqGhITw8PGBvb08jeAh5SH0W/yeeeOK+vmC5ubmPJCDyeGGMIaUsBemm\nx3DD6BrQDVQZZ6K0oQJudk699k9PT+81EEAoFMLV1RXOzs50tk/II9Jn8d+6dStX/Jubm7F9+3aE\nhIRg+vTp3B2+p0+fRlJSEtavX/9AL25ra4v8/PwHi5zorO5uFfT0eKhqvY5Dvx9CUWMRAMDVredG\nq2ljxsNGIr7rcyUSCVf8+Xw+XFxcIJVKoa+vf9f9CSEPps/iP3fuXO7nV155BVFRUdiyZYvaPrNn\nz8aWLVvw448/Yv78+f0XJRk0ioubsP/LbAg983FdlAUVU3Ftoxwd8bz38/C09gQAdHZ29ppG2dnZ\nGSUlJbCxsYGbmxvXNUgIebQ0uuB79uxZ7N69+65tEydOxLFjxx5pUGRwuny5Dpv3HkehKBHdma0I\nCLCFUJ8Pvh4fU6VTMcNtBoR8Idra2lBQUIDKykpERETAzMyMOwafz8fEiRPpBi1C+plGxV8sFuPy\n5ct3HZFz8eJFjS72ksefQlKGIosf0NnRDb6Kh9bWmwhyHYOF3gthZ2qH9vZ25F7NRXl5OTfMNz8/\nH4GBgWrHocJPSP/TqPg/++yz2L17Nzo7OzF58mSIxWI0NDTgp59+wpdffomNGzf2d5xkEPAf7ovx\nYzyRfjUfYzzssch/PkIdQtHZ2Ynff/8dZWVlUKlUas9RqVRQKpV0IZcQLdOo+L/88suQy+X49NNP\nsXfvXm67gYEB1qxZQ6t4DTFKpQoJCWVo71QgKtKd287X42PNpL8jxTUFc0fNhUAlQE5ODkpLS3sV\nfUtLS3h4eEAsvvuFX0JI/9Ko+PN4PKxbtw6rVq1CVlYWWlpaIBaL4efnByMjo3sfgDw25PKb+H/v\n/4azN35GJ78JAf7bMWLE7T57F7ELRpqP7LPoSyQSuLu7w9Ky93KLhBDtua87fE1NTR941S4y+DHG\nkN14Eb/pf4paYTMA4OOTJ7BlxSK1/Xg8HlpbW9UKv1gs5oo+3aBFyMDrs/hPnTr1vr6kP//88yMJ\niOimipYKHP79MIoai+AoFaExWw5HB1O4juuGSqXqdZFWJpOhrq4O5ubmcHd3h5WVFRV9QnRIn8Xf\n39+fvqxDXEWFHKkZ5VC6XkHitURuzL6RkT6mT/DEPPdnYNBigKSkJEyYMEHtPwCJRIKwsDCIxWL6\nHBGig/os/tu2beN+PnnyJEJCQiCRSPranTxGGGM4ejQPR1NOo1CUDFmzCBJxz9q3fD0+JtpPhAtz\nQfWVaq5rp7y8HE5O6tM10OeFEN2l0YDqTZs2IS0trb9jITqCgeFE7QH8YfgDbvLaUFzcDAYGN1M3\nzLOYB8MKQ1yvuK7Wp19XVzeAERNC7pdGF3xtbGzQ0dHR37EQHaHH08OUYC9cvn4FJqZCjJU6YaJR\nOAxaDSCXy9X2lUgkkMlkNHqHkEFGo+K/YMECbN26FdnZ2fDw8Ljr8M7Zs2c/8uBI/2ts7EBiYjnm\nzHGDnt7tvvn5vnNxqTwLHnqusOPZgd/OBwPj2i0tLSGTySCRSKhPn5BBSKPi/8477wAAjhw5ctd2\nHo9HxX8Q+umnazj8wzkUClJgMGwVZk3x5tqM9I3w9vT/i5TkFHR1dXHbra2t4ebmRv35hAxyGhX/\nhISE/o6DaFmLogWn6o4jXXQaDMCuU19iYshbMDa+PcumiaEJnJ2dUVhYCFtbW7i5uWHYsGEDFzQh\n5JHRqPjfuTB2e3s72traYG5uTnOsD0Ldqm6cvnYaJwtOot2sAyIRH1Z8U7hLupF1JR3hQeFq+7u4\nuMDe3h6mpqYDFDEhpD9ofIdvamoqtm/fjpycHG5GxjFjxmDt2rUICQnptwDJw2to6MDJk0VwCW/F\nj9fiUd9eD6gAw1YRnrB2g42RFaRiKZrqmtDW1gZjY2PuuUKhEEKhcACjJ4T0B42Kf1paGpYuXYqR\nI0di9erVsLCwQG1tLX766ScsW7YMn3/+OQICAvo7VvIAEhPL8Nk3SSjQT8awpja4OJhDJBdB2CqE\nscAYLjYuEIt6JlcTCASQy+VqxZ8Q8njSqPjHxcUhJCQEe/fuVRvZsWrVKixfvhy7du3CgQMH+i1I\n8uAy2hKQLvr/EPH0oV8zDMY8UxgI9OFk7gQ7UzvwwINIJIKLiwucnJwgENzXdE+EkEFKo2/6lStX\nEBsb22tIH4/Hw8KFC/Hqq6/2S3Dk4T0ZGIDkrCRYqcxgbiaCk7kDHMwcINATwMTEBK6urrC3t6cF\nVAgZYjQq/mZmZmhvb79rW1tbGy3EoQPq6trx1X8uY/5cb1hb3+628bL2QrC/B4S1AjibO0MkEEEi\nkUAqlcLGxobG6BMyRGlU/IODg7Fr1y6MHTtWbcnGmpoa7Nq1iy74DrBTSVex87uvUSnIRPWhGdi8\n5m/cmTyPx0P0k68h9XwqDA0NIZVKaQEVQohmxf+1117D008/jSeffBJjx46FpaUl6uvrkZGRARMT\nE0RHR/d3nOQuFN0KnL52Gv+p/B7dohZ48m1wvT4H2dkF8PPz4PYTCoQICwujrh1CCEfjuX2++eYb\nfPbZZ8jIyEBFRQXMzMzw/PPPY8mSJbCysurvOMkdFN0KJF5LREJOArobuyHpMIaeiQDd3SrYSIxx\nvb4IvsxdrUuHCj8h5E59Fv+LFy/Cz8+Pu5HLysoK69at01pgpLequia8+/UhdBgXwLhLAH4XH/ro\neX+sJWYYKXaGi60LpC7SAY6UEKLr+iz+L774IgwNDREYGIiwsDCEhobCzc1Nm7GRO3z4wxF8n/Iz\nxHoiGOrrw8yy5yK7SCCCo5kjvEZ6QSqV0jKJhBCN9Fn8P/zwQ2RkZCAjIwPvvfcelEolLC0tERoa\nyj2ou0d7jMUqWPANocf00NWlAroFkNm6IMAjAFIXKU2/QAi5L30W/ylTpmDKlCkAgI6ODly6dAkZ\nGRlIS0vDv/71L3R2dsLV1ZX7q4AWdn90CkurYS02hZnZ7SGbT/vPRsL532AoN4S3kwxPhk2As5Mz\nTb1ACHkgGl3wNTQ0REhICDeks7u7G2lpafj6669x8OBBHDhwALm5uRq9YHV1NbZu3YoLFy5ApVJh\n/PjxWL9+vdoQ0qHqx5SLOJp4Ap2dDZjs/iT+/mIU12ZmYIaN89bAhJlgBN2URQh5SBrfy69QKJCa\nmorz588jNTUV+fn54PF48Pb2RlhYmEbHYIxh+fLlkEgk+OKLLwAAW7Zswcsvv4zjx48/WAaDnEql\nQnpROpIuJaG8rBrdCgUEPD1cKsxCW9tUGBvfXjhn9IhRAxgpIeRx8pfFv6CgACkpKUhJSUFGRgYU\nCgUcHR0RFhaGVatWITg4GCYmJhq/WH19PaRSKV577TWMGDECALB48WK88soraG5uHhJzxcvlN5GZ\nWYOy8huw9qjCxZyLkLf2LI0oMuCDxwPAAJ5Iifr6ZrXiTwghj0qfxT8iIgJ1dXUwMzNDUFAQNm7c\niLCwMK5oPwgrKyvs3LmT+726uhpff/01vL29h0ThVyi6sf6NHyAX/gEY1MCqUR98/u3uGx6PB6mz\nA/5P4ESEeI+jUTuEkH7TZ/Gvra2FWCzGM888g9DQUAQEBDzSxVtWrVqFhIQEDBs2jOsCetzJlU1o\nsvkFeh09Rb2jQw8mJnrg6fEw0nEkngx4EiNtRg5wlISQoaDP4r9//36kpKTgzJkz+Pe//w2RSMSN\n+Q8PD4dU+nA3Eq1ZswYrV67Enj17sGTJEnz77bePzUXf+vp2/PprKWQyM4wde3sVNAtDC5jbmaKz\noh2GhgIYDRPCx2MMpo+dDokxrYlLCNEeHru1LNdfqK+vR0pKCs6ePYtz586hoaEBtra2CA0NRXh4\nOEJDQ2Fubv5AAXR0dGDChAlYsmQJVq5cedd9KioqMHnyZCQkJDxUt5M2nDtXgcNHUtFlUAJLsT7e\nWv+K2qyn58vO44dzPyBkdAgmj54MA4HBwAVLCHls3atuajTax9LSElFRUYiK6hl6mJubi7NnzyI9\nPR3r16+HUqlETk7OPY9TX1+P1NRUzJw5k9tmaGgIBwcH1NTUaJqTTmpra8PV4qu4dC0VbcPy0I2b\nuN5ugMuXi+DnJ+P2C3IIQtD8IOjxaKgmIWTg3NeyTS0tLcjKykJWVhYuX76MK1euQKlUwtPTU6Pn\nX79+Ha+++iocHR3h7e0NAJDL5bh27RrmzJlz/9EPIKVShYyMKtjYqJB/LRd/lP2BmtYaKJkS+oYq\n8FV8GBvzUKcoAXC7+FPRJ4Togr8s/iUlJcjKykJmZiaysrJQXFwMlUoFV1dXBAcHY+HChQgKCtJ4\nuKeXlxcCAgKwadMmbN68GQKBADt27IBEIuH+qhgMkpIK8euvmWjpLoGJXQeU+m1q7WYSffDMeRg3\nehzGuY8boCgJIaRvfRb/4OBgNDc3gzGG4cOHIzg4GCtWrEBwcPADz+mjp6eHXbt24d1338WKFSug\nUCgQHh6OgwcPDqpFw1NLfkMlsqHU70JrEw9WVj1j8bsMu2BuY46JnhMR7BAMIZ+mXiCE6KY+i39Q\nUBBCQ0MREhICR0fHR/aCEokE27Zte2TH608qlQrFxVWQSoerjbl39DHG70U3IeDpQWDEQ4dZJ9yl\nMkyRTYG7hTuNzyeE6Lw+i39cXJw249ApbW3t+OWXbFy6nIfmzjr8zysvYsQIW679SY8pOOV8GsPE\nIoR7hOMJ5ydgYWQxgBETQsj9ua8Lvo8zpVKJmpoalJWVoaiiCKk5BWjqagD4DD8kXMDyl25fk5AY\nShD91FpIxVLo8x/djW+EEKItQ7r4M8ZQX9+I4uJS1DVcR2VTJapaq9De1Q5m1A3WzMB4DGUdJb2e\n62Hp0fuAhBAySAzZ4l9SUoWTP6Tg2vUyKA1bYGCugAoqrl1gztAl6oTM3QEzR4cMYKSEEPLoDdni\nX3DjKtIqz0LJ6wKvA7AyNQJPyHDT5CZ4ZjwEOAVgvNN4OA1zogu4hJDHzmNd/BljqK6uRXp6PsaP\n94W5uRnXJnWyh0LUDp6CD7leB5ipAqOkLhjvNB6B9oEQCUQDGDkhhPSvx674M8bQ0tKCiooK/PZb\nDgrLKyFnjegGw5zZT3D7uYhdYOE2DHJlKxb5zMB4p3AMNx0+gJETQoj2PDbFv729HZWVlaisrERD\nUwNq22qRLy9FA08O8IDUK+mImhXBdeHweDzEzI6GxFACgd5j889ACCEaGdRVTy7vwG+/5SA3twQM\nrbAcAVS3VqOxsxEAoCdUoYspIee3Q9+8Bowxtf57a2PrgQqdEEIG1KAu/lVVjTiVnIJ2vRtQCJpg\naWAAHg9gPIYuwy50GXfB0A6YLpuMcMdwWvScEEL+a1AXf4VZI6pFeeAr+WCMQQ4VBBY9hd/d2h2h\nDqHws/WjOfMJIeRPBnXx97DygMBaD4ruThhYA2aWFghzCEOYYxgsjSwHOjxCCNFZg7r46/P1ETlx\nEurb6xHuGI7RVqNpvnxCCNHAoC7+APD0qKfpJixCCLlPg/40mQo/IYTcv0Fx5q9UKgEA1dXVAxwJ\nIYQMDrfq5a36+WeDovjX1dUBABYuXDjAkRBCyOBSV1cHJyenXtt5jDE2APHcl87OTly5cgVWVlbg\n8/kDHQ4hhOg8pVKJuro6eHl5QSTqPVfZoCj+hBBCHq1Bf8GXEELI/aPiTwghQxAVf0IIGYKo+BNC\nyBBExZ8QQoYgnSv+MTExeOONN9S2ffvtt5g1axZ8fX3x7LPP4uzZs2rthw4dgru7u9pj9OjRavt8\n/vnnmDhxInx8fLBkyRKUlJToVA43b97Etm3bEBYWBj8/Pyxfvhzl5eWDJoddu3b1eg9uPT788EOt\n5/Ag70F5eTlWrlyJgIAAhIeHY9OmTWhpaVHbR5ffAwAoKSnBsmXLEBAQgIiICHzwwQfo7u7Wag71\n9fVYt24dwsPDERAQgKVLl6KgoIBrT0lJwVNPPYUxY8Zg9uzZSE5OVnt+Q0MD1qxZg4CAAISEhOC9\n997Tag4PG/8tN2/eRGRkJL777rtebdr8HPWJ6QiVSsViY2OZTCZjGzdu5LbHx8czd3d39vHHH7Pi\n4mJ28OBB5u3tzS5cuMDtExMTw1auXMlqa2u5R11dHdd+9OhR5ufnx3788UeWl5fHVqxYwSZPnswU\nCoXO5LB+/XoWERHBzp07x/Lz89kLL7zAZs2axVQq1aDIobW1Ve3fv7a2lsXExLCQkBBWXV2ttRwe\nNP6uri42bdo0tmrVKlZYWMgyMjLYtGnT2D/+8Q/uGLr+HjQ1NbHQ0FD2wgsvsJycHJaWlsamTZvG\nNmzYoLUclEolmz9/Pps3bx7Lzs5mV69eZatXr2YhISGssbGRXb16lXl5ebE9e/awwsJCtnPnTubp\n6ckKCgq4YyxYsIA9//zzLDc3lyUlJbHg4GD2/vvvayWHRxE/Y4zJ5XL297//nclkMvbtt9+qtWnr\nc3QvOlH8y8rK2KJFi1hQUBCbMGGC2gc+MjKSvfbaa2r7v/HGG2zRokXc7wsWLGBxcXF9Hn/q1Kns\ngw8+4H5vbW1lvr6+7MSJEzqRQ1lZGZPJZOzcuXNce1FREZswYQIrKSkZFDn8WWZmJvPw8GDJycnc\ntv7O4WHiz8/PZzKZjOXl5XHtBw8eZH5+flqL/2Fz2L9/P/Pz82M3btzg2tPT05lMJmPl5eVaySEn\nJ4fJZDJWWFjIbVMoFMzHx4d988037M033+z1mVm0aBHbtGkTY6zncyOTyVhZWRnXfvz4cebn58cV\nx/7M4WHjZ4yxs2fPssmTJ7M5c+bctfhr43OkCZ3o9snMzISdnR3i4+MxYsQItbbS0lIEBASobRs1\nahSysrK4PwULCwshlUrveuyGhgaUlJRg3Lhx3DZjY2N4eXkhPT1dJ3JISUmBRCJBSEgI1+7i4oLE\nxEQ4OTkNihzuxBjD22+/jalTpyIiIgKAdt6Hh4l/2LBh0NPTw9GjR6FQKNDY2IiffvoJXl5eWov/\nYXMoLS2Fm5sbzM3NufZb3Z/p6elaycHOzg6ffPIJRo4cyW27Nflic3Mz0tPT1V4fAIKCgrjXT09P\nh729PRwcHLj2cePGoa2tDbm5uf2ew8PGDwCnT59GVFQUvvrqq17H19bnSBM6MbfPU089haeeeuqu\nbdbW1qiqqlLbVllZia6uLrS0tKCrqwvNzc04c+YMdu3ahY6ODgQGBiI6Oho2Njbc5EY2Nja9jvso\nJ4p7mBxKSkrg4OCA+Ph47Nu3D42NjfD398fGjRtha2s7KHKQSCTc9oSEBPzxxx/YsWMHt00bOTxM\n/DY2Nti0aRO2b9+Ow4cPQ6VSQSqV4uDBg1qL/2FzsLa2RmJiIlQqFbdkaWVlJYCeoqONHMRiMSZM\nmKC27csvv0RnZyfCw8MRFxf3l69fU1MDa2vrXu0AUFVVBYFA0K85PGz8ALBp06Y+j6+tz5EmdOLM\n/69ERkbi0KFDOH/+PJRKJS5cuID//Oc/AICuri5cvXoVACAQCLBz50688847KCkpweLFi9HZ2YmO\njg4AgIGB+lKOQqEQCoVCJ3JobW1FcXEx9u/fjw0bNiAuLg4NDQ146aWXoFAoBkUOdzpw4ACmTZum\nNpnUQOdwr/hVKhWuXbuGkJAQHDlyBJ9++in4fD7Wrl0LpVI54PFrksP06dPR0NCA9957Dx0dHaiv\nr8eWLVsgEAjQ1dU1IDkkJCTg/fffx5IlSyCVStHZ2QmhUNjn63d0dPSKT19fHzweb0C+C/cb/73o\nwufoFp048/8ry5cvR2NjI5YtWwalUglXV1csXboUO3bsgKmpKcLDw3H+/Hm1M09XV1dEREQgOTkZ\n9vb2AHquvN/p5s2bMDQ01IkcBAIB5HI54uLiuD93P/jgA4SHhyM5ORnDhw/X+Rxuqa6uxsWLF3Hg\nwAG159+aWGqgcrhX/CdOnEB8fDwSExNhZGQEAHBycsKUKVOQnJzMnX3q8ntgY2ODuLg4xMTE4PPP\nP4eRkRFWr16N/Px8mJqaav09OH78ON58803MmDED0dHRAHqK3p9PFu58fZFI1Cu+rq4uMMZgZGSk\n1RweJP57GejvwZ10/sxfKBQiJiYGmZmZOHPmDOLj4yESiWBpacl9Se8s/EDPn1BisRhVVVWws7MD\ncHta6Ftqa2t7/ek1UDnY2NjAyMhIrZ/TwsIC5ubmqKioGBQ53JKQkAArK6te/aIDncO94s/OzoaL\ni4taLg4ODhCLxSgrKxvw+DXJAQAmTZqElJQUJCcn4/z583j66afR2NgIBwcHrebw0UcfYcOGDXju\nuefw7rvvct1QdnZ2qK2t7fP1bW1t7xof0NNVoq0cHjT+e9GFz9EtOl/8d+7cib1790IoFMLKygoA\ncOrUKYSFhQEAvvjiC4SHh6v9b1xZWYnGxka4ubnBwsICzs7OuHjxItfe1taGK1euIDAwUCdyCAgI\nQHt7O4qKirjn1NXV4caNG3B0dBwUOdxy64LYrS/LLQOdw73it7W1RUlJidoZWW1tLZqamuDk5DTg\n8WuSQ3p6Ol566SUolUpYW1tDKBTi1KlTMDIygr+/v9Zy2LdvH2JjY7F69Wq8+eabaqvtjR07IGcA\nhAAABeZJREFUFmlpaWr7p6amcheyx44di/LycrVrG6mpqTA2NoaHh4dWcniY+O9FFz5HHK2OLdLA\nokWL1Ia3HT16lPn7+7OkpCRWVlbGNm/ezHx9fVlRURFjjLHS0lLm6+vLoqOjWWFhIUtPT2dz5sxh\nCxYs4I5x+PBh5uvry77//nuWn5/PVqxYwaZOndpv42rvNweVSsWef/55FhkZyTIzM1lubi574YUX\n2LRp07gYdT2HW6ZOnco++uijux5Tmzncb/zV1dUsICCArV69mhUUFLDs7Gz23HPPsaioKNbV1aX1\n+B8kh4aGBhYQEMC2bdvGysrK2C+//ML8/f3V3o/+ziE3N5eNGjWKbdiwodd9H21tbSwvL495enqy\nuLg4VlhYyGJjY5m3tzc3tFKlUrF58+ax+fPnsytXrnDj/O8cGtmfOTxs/H92t6Ge2v4c9UXniz9j\njO3evZtFREQwX19ftmjRIpadna3WnpWVxRYtWsT8/PzYuHHj2Pr161lTU5PaPh9//DELCwtjvr6+\n7G9/+5vaOGJdyKG5uZlt3LiRBQYGMl9fX7Zq1SpWVVU1qHJgjDE/Pz92+PDhPo+rrRweJP78/Hy2\ndOlSFhgYyMLCwlh0dDRraGgYkPgfNIe0tDT2zDPPsDFjxrApU6aw/fv39zpuf+awY8cOJpPJ7vrY\nvXs3Y4yxxMRENmPGDObl5cUiIyPZ2bNn1Y5RW1vLVq1axXx8fFhoaCjbsWMHUyqVWsnhUcR/p7sV\n//6M/37QYi6EEDIE6XyfPyGEkEePij8hhAxBVPwJIWQIouJPCCFDEBV/QggZgqj4E0LIEETFnwxp\nMTExcHd373M1poSEBLi7u2PPnj1ajoyQ/kXj/MmQ1trailmzZoHH4+H777+HsbEx1yaXyzFjxgzY\n2triq6++Ap/PH8BICXm06MyfDGkmJiZ46623cP36dezcuVOt7d1330VzczO2bdtGhZ88dqj4kyEv\nIiICc+bMwaFDh5CdnQ0ASEtLw7Fjx/Dqq6+qrRJ35MgRTJ8+HV5eXpg8eTL27duHP//xfPjwYcyZ\nMwc+Pj4YM2YM5s6di19//ZVrP3bsGPz8/HDo0CGEhIQgKCgIFRUV2kmWkP+ibh9C0LNE38yZM2Fr\na4vDhw9j7ty5EIvF+OKLL7hZHXfv3o0PP/wQixcvRlhYGLKzs7Fnzx4sXryYm+99//792L59O9as\nWQMfHx80NTVh7969KCgoQEJCAqytrXHs2DHExMRAKpUiOjoaN27cQFRU1ECmT4Yirc8mRIiO+vXX\nX5lMJmMLFy5kfn5+3KLnjDHW1NTEvL292dtvv632nE8//ZSNHj2aVVdXM8YY27x5M9u5c6faPtnZ\n2Uwmk7FffvmFMdYzO6dMJmM//vhjP2dESN+o24eQ/5oyZQpmzpyJtLQ0rF+/Xm0B9czMTCgUCkyc\nOBHd3d3cY9KkSeju7saFCxcA9KzfunbtWjQ3N+PSpUv47rvvcOTIEQC9l7scNWqU9pIj5E90fhlH\nQrQpPDwcJ0+eREREhNr2pqYmAMDixYvv+rxbqzuVlJQgJiYGqampEAqFcHFxgZubGwD0ujZw56ph\nhGgbFX9CNHBrneK4uDhuXeg72djYQKlUYvny5TAxMcHx48fh7u4OgUCAvLw8xMfHaztkQv4SdfsQ\nogFfX1/o6+ujvr4e3t7e3EOhUCA2Nhb19fWor69HaWkp5s2bB09PTwgEPedWZ86cAQCoVKqBTIEQ\nNXTmT4gGLC0t8eKLL2L79u1obm6Gv78/KisrsXPnTpibm8PV1RX6+vqws7PDgQMHYGFhARMTE5w5\ncwZffvklAKCjo2OAsyDkNjrzJ0RD0dHRWLt2LeLj47Fs2TLExsZiwoQJOHDgAIRCIXg8Hvbs2QML\nCwu8/vrrWLt2LX7//Xd88skncHJyQnp6+kCnQAiHxvkTQsgQRGf+hBAyBFHxJ4SQIYiKPyGEDEFU\n/AkhZAii4k8IIUMQFX9CCBmCqPgTQsgQRMWfEEKGoP8FTmjSe7qAMKUAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "run_simulation2(system)\n",
+ "plot_results(system, title='Proportional model')\n",
+ "savefig('chap03-fig03.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The model fits the data pretty well for the first 20 years, but not so well after that."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** In this implementation, we compute the number of deaths and births separately, but since they are both proportional to the current population, we can combine them.\n",
+ "\n",
+ "Write a function called `run_simulation2b` that implements a model with a single parameter, `alpha`, that represents the net growth rate, which is the difference between the birth and death rates. For example, if `alpha=0.01`, the population should grow by 1% per year.\n",
+ "\n",
+ "Choose the value of `alpha` that fits the data best."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 157,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap03-fig03.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAEjCAYAAADaCAHrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVPX++PHXsO/7poIKCKggyKa470ualBmWisstl1zK\nSkvzmmlfzfRmuXbdK3fTJLcWu2aamikoIsjqgqCyI/s2zPn9wY/RicVBBUE/z8fDx2Pmc875nPeM\nzHvOfM5nkUmSJCEIgiA8VzSedgCCIAhCwxPJXxAE4Tkkkr8gCMJzSCR/QRCE55BI/oIgCM8hkfwF\nQRCeQyL5C9WaO3cubm5uKv/atWuHj48PQUFBhISEPO0QH1lmZiaFhYXK55Wv9WlrLHHUZOzYsfTt\n27fBjhPql9bTDkBo3D766CPMzc0BkCSJ/Px8Dh06xNy5c8nOzuaNN954yhHWzcmTJ5k9ezYhISEY\nGBgA8Nprr9GlS5enHJkgNCyR/IVa9e/fH3t7e5WyV199lSFDhrBu3TqCg4PR0dF5StHVXUREBLm5\nuSpl3t7eeHt7P6WIBOHpEM0+Qp3p6enRt29f8vPziY+Pf9rhCILwCMSVv/BIZDIZAOXl5QD07duX\nrl27olAoOHLkCGZmZvz4449YWFgQGhrK2rVruXz5MgAdOnTg7bffxt/fX1lf37596dKlCx07dmT9\n+vVkZmbStm1b3n33XQICAlTOrW59/4ynXbt2/PHHHwD069ePTp06sX37dubOnUtISAixsbHK42/f\nvs3KlSv5888/KSgowNHRkeDgYEaOHKncZ+7cuYSHh7N8+XKWL1/OlStXMDQ0ZMiQIcyePRs9PT3l\nvn/99RdbtmzhypUr5OfnY2FhQZ8+fZg9ezYmJiZqv+9z584lMjKSRYsWsXz5cqKjo7G2tmbGjBm8\n+OKLrF69mh9++IGysjK6devGJ598omy2A4iNjWXVqlWcP3+e0tJS2rZty+TJk+nfv7/Kec6ePcvq\n1auJiYnBysqKKVOmVBtPQkICX331FX///TdlZWW0a9eO6dOn06NHD7Vfk/B0iOQv1JlCoeD8+fPo\n6Ojg7OysLD969ChOTk7MmzePjIwMLCwsOH78ODNmzKBly5ZMnToVgH379jFhwgRWr15Nv379lMef\nPXuWQ4cOMXbsWKytrdm9ezcTJ05k69atdOrUCaBO9f0znm7duqGtrc1vv/3GRx99hIuLS7WvLykp\niZEjR1JSUkJwcDDW1tYcO3aMjz/+mJs3b/Lhhx8q983KyuLNN9/khRdeIDAwkFOnTrF9+3Z0dHSU\n+50+fZpJkybh4+PDO++8g0wm48yZM+zdu5ecnBxWrVpVp/c/PT2dt956i6CgIAIDA9m2bRvz5s3j\n8OHD5OXlMX36dK5du8bOnTvR19dn6dKlQEWT17hx4zAyMuJf//oXhoaGHDx4kOnTp7NgwQLGjBmj\n/H+YNGkSrVu35t133yUrK4slS5Ygk8mqfJGMHj1a+eWgra3NkSNHmDx5MitWrGDIkCF1el1CA5ME\noRpz5syRXF1dpaioKCkzM1PKzMyU0tLSpEuXLkkzZ86UXF1dpc8++0y5f58+faS2bdtKKSkpyrKy\nsjKpZ8+eUq9evaS8vDxleU5OjtSjRw+pR48eUmlpqfJ4V1dX6bffflPul5mZKfn5+UkjR458pPr+\nGY8kSdLq1aslV1dXKSkpqcprrfTuu+9Kbdu2lSIjI5Vl5eXl0pQpUyQ3NzcpLi5O5bht27apnOOF\nF16Qunfvrnz+5ptvSn369JFKSkpU9hs5cqTk7e1dYxzVqdxn+/btyrI//vhDcnV1rXKO119/XSWO\noKAgqWPHjtLdu3eVZcXFxdLw4cMlT09PKTMzU5IkSRo+fHiV9/ivv/5SnqNScHCw1L9/f6mgoEBZ\nVlZWJo0ePVrq2rWrMpbg4GCV44TGQbT5C7UaPnw4Xbp0oUuXLnTv3p3XXnuN48ePM3bsWGbNmqWy\nb8uWLbG1tVU+v3r1KikpKYwZMwYjIyNluYmJCcHBwaSmphIZGaksd3JyUml+sLCw4KWXXuLy5ctk\nZmbWub5/xqOO8vJy/vjjD7p37467u7uyXENDg7feegtJkvj9999VjnnhhRdUnrdt25aMjAzl8w0b\nNvDDDz+o3BjPzs7GyMhIpctpXQwYMED5uHXr1gD06NFD5Rz29vakp6cDkJGRweXLl3nppZews7NT\n7qOrq8ubb75JcXExZ8+eJTMzk6ioKIYOHaryHgcEBKh0Q83Ozub8+fP06tWL4uJisrKyyMrKIjc3\nlwEDBpCRkcGVK1ce6bUJDUM0+wi1+s9//oOVlRVQkQBNTExwdnZGV1e3yr6WlpYqz5OTkwFwdHSs\nsq+TkxMAd+7cUfa0adOmTZX9WrVqhSRJ3L59u871/TMedWRnZ1NYWFjtOSqbuG7fvq1SbmFhofJc\n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\nFi9eTFFRkXJ7TEwMwcHBeHl58eKLLxIVFaVyToVCwfr16+nTpw8dO3ZkxIgRnDx5ssFesyA8KoVU\ndcnTMV6jGOreg170xUrTGkODiqUU3d3dReKvhlpX/idOnODjjz+mR48eKuX9+/cnKyuLL774gkWL\nFtVLgI8jNjaWuLg4tfZt1apVlXVkIyIiSExMVOt4V1dX3Nzc6hzjg7788kuWLFlC69atmTt3LpMn\nT6ZDhw5s2rSJGzduMGvWLPz8/Bg9ejSXL19mwoQJjB07lkWLFpGcnMzChQtJTk5m/fr15OTkMGHC\nBAICAvjhhx+4efMmH3/8scr5VqxYwW+//cann35Ky5Yt+fPPP5kxYwabN2+mc+fOj/VaBKE+KCQF\nJ2+e5GTiSd7zn42p4f2lP410jBjQzJ/oe3extTVET08Lb29vmjdv/hQjbrzUSv46OjoYGxtXu028\nsU/OyJEj6du3LwAvvfQSn376KQsXLsTBwQFXV1c2b95MfHw8AFu3bsXDw4M5c+YAFStiLVy4kMmT\nJxMfH8+FCxcoKytjyZIlGBoa0qZNG1JTU5WLvBcUFLBt2zbWrFmj/FJv1aoVMTExbNy4USR/odFJ\nykliR8QOrmfdICk5j9E/L2PH3H9jbl6xwpZMJsPPz4/i4tNoaGjg7++PhYXFU4668VIr+Y8aNYpV\nq1bh5eWFldX9LlKFhYVs3LiRoKCgegvwefLgEor6+vpoaGio9MrR09NTNvvEx8fTq1cvleP9/PyU\n2+Lj43F0dFR21wXo2LGj8vG1a9coLS1l5syZaGjcb/0rKytT+T8WhKetRF7C4bjDHL9+HIWkIDom\nk8zMYgwUN9m15wrTp/or9zU2NqZTp07o6emp/O0LVdWY/N944w3lY0mSuHbtGv3798fHxwdLS0ty\nc3O5ePEicrkcGxubBgm2rtzc3B6rKcbT07NKU1B90tJS/e+QyWQ1tlPq6elVKatclE1LSwuZTMY/\nF2nT1tZWPq7s6rZmzRpatWqlst+DXwaC8DRdSb3Criu7yCrKUpa1cjDH6HZLHEp8yb2XT3GxHD29\n+58dS8umt5j601Bj8i8rK1N57uPjoyxPSUkBoG3biiXN0tLS6is+oQbOzs5cunRJpSwsLEy5LScn\nR7mIuqmpKQCRkZHKfVu1aoW2tjapqan07NlTWb527VrKy8uZOXNmA7wKQajeveJ77I3cy8W7F1XK\n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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "def run_simulation2b(system, alpha = .017):\n",
+ " results = TimeSeries()\n",
+ " results[system.t0] = system.p0\n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " results[t+1] = results[t]*(1+alpha)\n",
+ " system.results = results\n",
+ " \n",
+ "run_simulation2b(system)\n",
+ "plot_results(system, title='Proportional model')\n",
+ "savefig('chap03-fig03.pdf')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 158,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Factoring out the update function"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The functions that run the model all look the same except the body of the loop. So we can factor that part out into a function."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 159,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def update_func1(pop, t, system):\n",
+ " \"\"\"Compute the population next year.\n",
+ " \n",
+ " pop: current population\n",
+ " t: current year\n",
+ " system: system object containing parameters of the model\n",
+ " \n",
+ " returns: population next year\n",
+ " \"\"\"\n",
+ " births = system.birth_rate * pop\n",
+ " deaths = system.death_rate * pop\n",
+ " return pop + births - deaths"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now the name `update_func1` refers to a function object."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 160,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 160,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "update_func1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Which we can confirm by checking its type."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 161,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "function"
+ ]
+ },
+ "execution_count": 161,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "type(update_func1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`run_simulation` takes the update function as a parameter and calls it just like any other function."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 162,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def run_simulation(system, update_func):\n",
+ " \"\"\"Simulate the system using any update function.\n",
+ " \n",
+ " Adds TimeSeries to `system` as `results`.\n",
+ "\n",
+ " system: System object\n",
+ " update_func: function that computes the population next year\n",
+ " \"\"\"\n",
+ " results = TimeSeries()\n",
+ " results[system.t0] = system.p0\n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " results[t+1] = update_func(results[t], t, system)\n",
+ " system.results = results"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's how we use it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 163,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "run_simulation(system, update_func1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Remember not to put parentheses after `update_func1`. What happens if you try?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 164,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\nKv6EENID/S9s8sixJDKW5AAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_results(system, title='Proportional model, factored')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** When you run `run_simulation`, it runs `update_func1` once for each year between `t0` and `t_end`. To see that for yourself, add a print statement at the beginning of `update_func1` that prints the values of `t` and `pop`, then run `run_simulation` again."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Combining birth and death"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Since births and deaths get added up, we don't have to compute them separately. We can combine the birth and death rates into a single net growth rate."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 165,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def update_func1b(pop, t, system):\n",
+ " \"\"\"Compute the population next year.\n",
+ " \n",
+ " pop: current population\n",
+ " t: current year\n",
+ " system: system object containing parameters of the model\n",
+ " \n",
+ " returns: population next year\n",
+ " \"\"\"\n",
+ " net_growth = system.alpha * pop\n",
+ " return pop + net_growth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's how it works:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 166,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\nzqtQKBgxYgQeHh5MmzaNy5cvs2vXLnJycpTnUmJiIkOGDCE/P5+RI0dSt25dtmzZUiK5lEbdZbOy\nsggICODevXsMGzYMa2trTp06xZdffsmtW7f49NNP1d43Ozs7ZsyYwfz58+nRowc9evTAzMxMua2Z\nM2fi4eHB1KlTiY6OZsuWLcTGxrJ3797yd0aqZtOmTZPkcrkUHh4uJSUlSUlJSdKDBw+kCxcuSJMn\nT5bkcrn05ZdfKufv0qWL1LJlS+n+/fvKsvz8fMnHx0fq3LmzlJGRoSxPS0uTvL29JW9vbykvL0+5\nvFwul/7880/lfElJSZKHh4c0aNCgp1rfk/FIkiQtWbJEksvl0p07d0rsa7EpU6ZILVu2lMLCwpRl\nhYWFUlBQkGRvby9FRkaqLLdhwwaVbfTp00fq1KmT8vXo0aOlLl26SLm5uSrzDRo0SHJ1dS0zjtIU\nz7Nx40Zl2d9//y3J5fIS2xgyZIhKHP7+/lKbNm2ke/fuKctycnKk/v37S87OzlJSUpIkSZLUv3//\nEsf433//VW6jWEBAgNS9e3fp4cOHyrL8/Hxp2LBhUocOHZSxBAQEqCynrsmTJ0vOzs7SrVu3lGXJ\nycmSu7u79P7771dqnwICAiS5XC4dPnxYOd+mTZskuVyu/HxJkiQpFArJx8dHGjx4sLKs+LP5999/\nK8tSUlKktm3bSv3791c5Hk8eH7lcLh06dEglNk9PT5X1q3sc1X1fSlMcy6ZNm5Rlubm5Uu/evaUO\nHTpI+fn5kiSV/AwWv/7ll19U1nfq1ClJLpdLu3fvVpYVn1tffPGFyryBgYGSg4NDic//42bPni25\nuLhIKSkpKuUffPCBJJfLleXF25g/f77KfKNHj5Zat24tZWVlSZIkSV999ZVkb2+vcg4nJiZKXl5e\nJc7/J6m77JIlSyQHBwcpIiJCZfmFCxdKcrlcunr1aqX27c6dO5JcLpeWLFminGf37t2SXC6X3n33\nXZVlp0+fLsnlcun27dtl7ockSVKNVVX179+f9u3b0759ezp16sTgwYM5dOgQgYGBBAcHq8zbuHFj\nrKyslK+vXLnC/fv3GT58OAYGBspyIyMjAgICiI+PJywsTFnerFkzunfvrnxtZmbGG2+8waVLl0hK\nSqr0+p6MRx2FhYX8/fffdOrUCQcHB2W5hoYG48ePR5IkDh8+rLJMnz59VF63bNmSxMRE5etVq1ax\ne/dulUYEKSkpGBgYqDQLrowePXoo/2/SpAkA3t7eKtuwsbEhISEBKPoVdenSJd544w2sra2V89Sp\nU4fRo0eTk5PDyZMnSUpKIjw8HF9fX5Vj7OXlpVIlkZKSwpkzZ+jcuTM5OTkkJyeTnJxMeno6PXr0\nIDExkcuXLz/VvkHRr8qjR4/SuXNnbG1tleWmpqZs2bKFWbNmqb1Pj5d7e3srXzdt2hRA5SpVJpPR\nsGFD5XErJpfLVW5ampiY0K9fP8LDw0vM+zhdXV1ee+01lRiaNm2q/HyoexzVfV/KY2RkxODBg5Wv\ndXR0GDx4MImJiSrnTWk8PDzU2gbA66+/rvLaycmJ/Pz8cn/tz5kzh8OHD2NiYqIsy8zMpE6dOgAl\nzpMnz7lWrVpRUFCgrBI7duwYTk5OKuewubk5vr6+Fcav7rIHDx5ELpdjaWmpfN+Sk5OV32FHjhx5\nqn0rzZPbdnJyAij3swc1WFX1zTffYGFhARR9eRoZGWFnZ6fc6ceZm5urvC6uoys+QR/XrFkzAO7e\nvatsxdG8efMS89na2iJJEnFxcZVe35PxqCMlJYWsrKxSt1FcLRcXF6dS/vglJRSdkI/XYWtqanLn\nzh0WL15MdHQ0t2/fVmn//jQe3zdNTc0SZcXl0v+vay2Oubz9unv3rnK+xo0bl5ivWbNmhIaGAkXV\neQAbN25k48aNpcZ479499XfoCampqWRlZakkjWJyuRyAS5cuARXvUzETExO0tB6dSuoct2KlbaP4\nGMXFxWFpaVnqfpiYmKChofq77/HPh7rHUVtbW2Wbj3v8fSlPo0aNVPa/uKx4H9q0aVPmspU5l56c\nt27dugDl3l+QyWSkpKSwatUqrl27xu3bt7l7967yfXjynlBp5xw8uucaFxen8oOgWPH3RHnUXfb2\n7dvk5OSU2Xy5+PNf2X0rzZP7q84xhRpMHG5ubiWa45al+EQs9uTJV9q04hPiyf+LFX8QSjuZK1rf\nk/Goo7xtFL/BTzY/fvKL4Unr1q3j66+/pmnTpnh4eNCzZ09cXFzYuHEj+/fvr3SMQIkvAHjUYKE0\n6uyXtra2ch2l3Rx+/ANe/L4MHz5c5SrxcaX9EFBX8fqfxz4VK+2YVbSN8hRvv7z3v6LPhrrHsfiH\nRkXvS3lK20919gEqdy49zfH89ddfmTp1KvXq1cPLywsfHx8cHR05fvw4q1atqvQ2ZDJZqceqvM9M\nZZctLCzE3d1d5V7Y4+rVqwdUft9KU9H7U5ZadXNcXQ0bNgTgxo0bJabdvHkTQKWK4fbt2yXmi4mJ\nQVNTExsbG2V2VXd9T8PMzAw9Pb3nto3c3FyWLl1Ku3btWL9+vcqXV2Vvij8Ldd+Lhg0bIpPJiImJ\nKTHf4608itenqalZ4uZwdHQ0sbGx6OrqPnW8pqam1K1bt9TPxLp160hISGD06NFq7dPz8ORVJqB8\njqH4V/vTUPc4qvu+lOfevXtIkqTypVu8D6VdyVSnhQsXYmtry+7du5UP5gJP/cPKxsam1GNVfIX3\nPJZt2LAhDx8+LPG+paWl8e+//yqvlp/3vlVGrWuOqw4HBwdl66jMzExleWZmJlu2bMHS0hJHR0dl\n+eXLl7l48aLydWJiIvv27cPLywtjY+NKr680xZm7rF8empqaeHt7c+LECcLDw5XlkiSxZs0aZDKZ\nSp11RXJycsjOzqZJkyYqSePq1aucOXMGgIKCArXX97SKj82+fftUmjfm5eXxww8/oKOjQ8eOHTEz\nM8PT05N9+/ap3Ke5cOGCyvGoV68ejo6OhISEqFS75efnM3PmTN5///1n2i8tLS06duzI0aNHVaq8\n0tLSWLduHXfu3FF7n56H8PBwrly5onxd/Nn08PBQq0VTWdQ9juq+L+VJSkri0KFDytdZWVls3bqV\nhg0b0qpVq0rFXXwFou7VTkVSU1Np0KCByhfrvXv3OHjwIPDoykxdPXv2JCoqimPHjinLMjIyKm6F\nVIllu3btSkREBEePHlUp//7775k8ebLyGTd19+15H1N4Qa84tLW1mTVrFh988AEDBw7krbfeAmDX\nrl08ePCAJUuWqFyC6ejoMHbsWJUmcAqFQtmstbLrK01xXeHatWvx8fEptS5z6tSpnD59msDAQGXT\n4D///JNTp07x9ttvV6oKxtjYGBcXF/bs2YOBgQFNmzYlKiqKnTt3KmN9+PAhxsbGaq/zac2aNYuR\nI0fy1ltvMXToUPT19dm3bx/h4eHMmjULIyMjAKZNm8bw4cMZNGgQw4cPJzs7mx9//LHEF2Tx+gYO\nHMjQoUMxMTHhl19+4dKlSwQHB5f5hZqYmMiJEyewt7enZcuWZcYbHByMv78//v7+ygYRO3bsICsr\niylTplRqn56VsbExo0eP5u2330ZTU5PNmzdTUFDAjBkznnnd6h5Hdd+X8vbh448/ZuTIkZiYmLB7\n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\npFf+H1sFbMS2u8i2AAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "system.alpha = system.birth_rate - system.death_rate\n",
+ "\n",
+ "run_simulation(system, update_func1b)\n",
+ "plot_results(system, title='Proportional model, combined birth and death')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, might be changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n",
+ "\n",
+ "Write a function called `update_func1c` that takes `pop`, `t`, and `system` as parameters. The system object, `system`, should contains two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should compute and return the simulated population one year later.\n",
+ "\n",
+ "Note: Don't forget the `return` statement."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": true,
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "def update_func1c(pop, t, system):\n",
+ " if (t < 1980):\n",
+ " net_growth = system.alpha1 * pop\n",
+ " return pop + net_growth\n",
+ " else:\n",
+ " net_growth = system.alpha2 * pop\n",
+ " return pop + net_growth"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 169,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Quadratic growth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's the implementation of the quadratic growth model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 170,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def update_func2(pop, t, system):\n",
+ " \"\"\"Compute the population next year.\n",
+ " \n",
+ " pop: current population\n",
+ " t: current year\n",
+ " system: system object containing parameters of the model\n",
+ " \n",
+ " returns: population next year\n",
+ " \"\"\"\n",
+ " net_growth = system.alpha * pop + system.beta * pop**2\n",
+ " return pop + net_growth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And here are the results. Can you find values for the parameters that make the model fit better?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 171,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap03-fig04.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\nCCHkwVHxJ4SQcYiKPyGEjENU/AkhZByi4k8IIePQqCv+CQkJePXVV5Xazp49i8WLF8Pb2xvPPfcc\nLly4oNR/4sQJuLm5KT2mTZumtM3Ro0cxa9YseHl5Yd26daioqBhVOfT29iIxMRGhoaHw8fHBxo0b\nUV1dPWZyOHDgwKD3YODx/vvvqz2Hh3kPqqursXnzZvj5+SEsLAzx8fFoa2tT2mY0vwcAUFFRgQ0b\nNsDPzw/h4eHYv38/+vv71ZqDVCrFK6+8grCwMPj5+WH9+vUoKSnh+jMyMrB06VLMmDEDTz/9NNLT\n05We39jYiK1bt8LPzw/BwcF499131ZrDcOMf0NvbiyVLluCrr74a1KfO42hIbJRQKBRs3759TCQS\nsd27d3PtqampzM3NjX300UesvLycHT9+nHl6erJLly5x2yQkJLDNmzcziUTCPRoaGrj+L774gvn4\n+LDvvvuOFRUVsU2bNrE5c+YwmUw2anLYuXMnCw8PZ7/99hsrLi5mq1evZosXL2YKhWJM5NDR0aH0\n+5dIJCwhIYEFBwczsVisthweNv6+vj42f/58Fhsby8rKylhOTg6bP38++8tf/sLtY7S/By0tLSwk\nJIStXr2aFRQUsKysLDZ//ny2a9cuteUgl8vZ888/z5YvX87y8/NZaWkp27JlCwsODmZNTU2stLSU\neXh4sIMHD7KysjKWlJTEpk+fzkpKSrh9rFixgq1cuZIVFhayX375hQUFBbH33ntPLTk8ivgZY6y9\nvZ39+c9/ZiKRiJ09e1apT13H0f2MiuJfVVXFYmJiWGBgIIuIiFA64JcsWcJ27NihtP2rr77KYmJi\nuJ9XrFjBkpOTh9z/3Llz2f79+7mfOzo6mLe3N/v6669HRQ5VVVVMJBKx3377jeu/ceMGi4iIYBUV\nFWMih9/Lzc1l7u7uLD09nWsb6RyGE39xcTETiUSsqKiI6z9+/Djz8fFRW/zDzeHIkSPMx8eHNTc3\nc/3Z2dlMJBKx6upqteRQUFDARCIRKysr49pkMhnz8vJiZ86cYa+99tqgYyYmJobFx8czxm4fNyKR\niFVVVXH9p0+fZj4+PlxxHMkchhs/Y4xduHCBzZkzh0VHR9+z+KvjOFLFqLjsk5ubC1tbW6SmpmLS\npElKfZWVlfDz81Nqmzp1KvLy8riPgmVlZXB2dr7nvhsbG1FRUYGAgDsreRkaGsLDwwPZ2dmjIoeM\n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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "system.alpha = 0.025\n",
+ "system.beta = -0.0018\n",
+ "\n",
+ "run_simulation(system, update_func2)\n",
+ "plot_results(system, title='Quadratic model')\n",
+ "savefig('chap03-fig04.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To understand the quadratic model better, let's plot net growth as a function of population."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 172,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "pop_array = linspace(0.001, 15, 100)\n",
+ "net_growth_array = system.alpha * pop_array + system.beta * pop_array**2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's what it looks like. Remember that the x axis is population now, not time.\n",
+ "\n",
+ "The function `sns.set` sets the style for the plots. I added a grid to this one to make it easier to read."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 173,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap03-fig05.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "sns.set(style='whitegrid', font_scale=1.5)\n",
+ "plot(pop_array, net_growth_array, '-')\n",
+ "decorate(xlabel='Population (billions)',\n",
+ " ylabel='Net growth (billions)',\n",
+ " legend=False)\n",
+ "savefig('chap03-fig05.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Using `sns.set` to reset the plot style."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 174,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "sns.set(style='white', font_scale=1.5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the book we found that the net growth is 0 when the population is $-\\alpha/\\beta$:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 175,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "13.88888888888889"
+ ]
+ },
+ "execution_count": 175,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "-system.alpha / system.beta"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This is the equilibrium the population tends toward."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** In the book, I presented a different way to parameterize the quadratic model:\n",
+ "\n",
+ "$ \\Delta p = r p (1 - p / K) $\n",
+ "\n",
+ "where $r=\\alpha$ and $K=-\\alpha/\\beta$. Write a version of `update_func2` that implements this version of the model. Test it by computing system variables `r` and `K` equivalent to `alpha` and `beta`, and confirm that you get the same results. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 182,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "def update_func2b(pop, t, system):\n",
+ " net_growth = (system.r * pop)*(1-(pop/system.K))\n",
+ " return pop + net_growth"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 183,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap03-fig04.pdf\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\nCCHkwVHxJ4SQcYiKPyGEjENU/AkhZByi4k8IIePQqCv+CQkJePXVV5Xazp49i8WLF8Pb2xvPPfcc\nLly4oNR/4sQJuLm5KT2mTZumtM3Ro0cxa9YseHl5Yd26daioqBhVOfT29iIxMRGhoaHw8fHBxo0b\nUV1dPWZyOHDgwKD3YODx/vvvqz2Hh3kPqqursXnzZvj5+SEsLAzx8fFoa2tT2mY0vwcAUFFRgQ0b\nNsDPzw/h4eHYv38/+vv71ZqDVCrFK6+8grCwMPj5+WH9+vUoKSnh+jMyMrB06VLMmDEDTz/9NNLT\n05We39jYiK1bt8LPzw/BwcF499131ZrDcOMf0NvbiyVLluCrr74a1KfO42hIbJRQKBRs3759TCQS\nsd27d3PtqampzM3NjX300UesvLycHT9+nHl6erJLly5x2yQkJLDNmzcziUTCPRoaGrj+L774gvn4\n+LDvvvuOFRUVsU2bNrE5c+YwmUw2anLYuXMnCw8PZ7/99hsrLi5mq1evZosXL2YKhWJM5NDR0aH0\n+5dIJCwhIYEFBwczsVisthweNv6+vj42f/58Fhsby8rKylhOTg6bP38++8tf/sLtY7S/By0tLSwk\nJIStXr2aFRQUsKysLDZ//ny2a9cuteUgl8vZ888/z5YvX87y8/NZaWkp27JlCwsODmZNTU2stLSU\neXh4sIMHD7KysjKWlJTEpk+fzkpKSrh9rFixgq1cuZIVFhayX375hQUFBbH33ntPLTk8ivgZY6y9\nvZ39+c9/ZiKRiJ09e1apT13H0f2MiuJfVVXFYmJiWGBgIIuIiFA64JcsWcJ27NihtP2rr77KYmJi\nuJ9XrFjBkpOTh9z/3Llz2f79+7mfOzo6mLe3N/v6669HRQ5VVVVMJBKx3377jeu/ceMGi4iIYBUV\nFWMih9/Lzc1l7u7uLD09nWsb6RyGE39xcTETiUSsqKiI6z9+/Djz8fFRW/zDzeHIkSPMx8eHNTc3\nc/3Z2dlMJBKx6upqteRQUFDARCIRKysr49pkMhnz8vJiZ86cYa+99tqgYyYmJobFx8czxm4fNyKR\niFVVVXH9p0+fZj4+PlxxHMkchhs/Y4xduHCBzZkzh0VHR9+z+KvjOFLFqLjsk5ubC1tbW6SmpmLS\npElKfZWVlfDz81Nqmzp1KvLy8riPgmVlZXB2dr7nvhsbG1FRUYGAgDsreRkaGsLDwwPZ2dmjIoeM\n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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "system.alpha = 0.025\n",
+ "system.beta = -0.0018\n",
+ "system.r = system.alpha\n",
+ "system.K = -system.alpha/system.beta\n",
+ "\n",
+ "run_simulation(system, update_func2b)\n",
+ "plot_results(system, title='Quadratic model')\n",
+ "savefig('chap03-fig04.pdf')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 184,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** On the Wikipedia page about world population estimates, the first table contains estimates for prehistoric populations. The following cells process this table and plot some of the results."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Select `table1`, which is the second table on the page."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 185,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
Population Reference Bureau (1973–2015)[6]
\n",
+ "
United Nations Department of Economic and Social Affairs (2015)[7]
\n",
+ "
Maddison (2008)[8]
\n",
+ "
HYDE (2010)[citation needed]
\n",
+ "
Tanton (1994)[9]
\n",
+ "
Biraben (1980)[10]
\n",
+ "
McEvedy & Jones (1978)[11]
\n",
+ "
Thomlinson (1975)[12]
\n",
+ "
Durand (1974)[13]
\n",
+ "
Clark (1967)[14]
\n",
+ "
\n",
+ "
\n",
+ "
Year
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
-10000
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
2M[15]
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
4.0
\n",
+ "
1–10M
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
-9000
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
4.
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
-8000
\n",
+ "
5.0
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
5.
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
5–10M
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
-7000
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
8.
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
-6000
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
11.
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Population Reference Bureau (1973–2015)[6] \\\n",
+ "Year \n",
+ "-10000 NaN \n",
+ "-9000 NaN \n",
+ "-8000 5.0 \n",
+ "-7000 NaN \n",
+ "-6000 NaN \n",
+ "\n",
+ " United Nations Department of Economic and Social Affairs (2015)[7] \\\n",
+ "Year \n",
+ "-10000 NaN \n",
+ "-9000 NaN \n",
+ "-8000 NaN \n",
+ "-7000 NaN \n",
+ "-6000 NaN \n",
+ "\n",
+ " Maddison (2008)[8] HYDE (2010)[citation needed] Tanton (1994)[9] \\\n",
+ "Year \n",
+ "-10000 NaN 2M[15] NaN \n",
+ "-9000 NaN 4. NaN \n",
+ "-8000 NaN 5. NaN \n",
+ "-7000 NaN 8. NaN \n",
+ "-6000 NaN 11. NaN \n",
+ "\n",
+ " Biraben (1980)[10] McEvedy & Jones (1978)[11] Thomlinson (1975)[12] \\\n",
+ "Year \n",
+ "-10000 NaN 4.0 1–10M \n",
+ "-9000 NaN NaN NaN \n",
+ "-8000 NaN NaN NaN \n",
+ "-7000 NaN NaN NaN \n",
+ "-6000 NaN NaN NaN \n",
+ "\n",
+ " Durand (1974)[13] Clark (1967)[14] \n",
+ "Year \n",
+ "-10000 NaN NaN \n",
+ "-9000 NaN NaN \n",
+ "-8000 5–10M NaN \n",
+ "-7000 NaN NaN \n",
+ "-6000 NaN NaN "
+ ]
+ },
+ "execution_count": 185,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "table1 = tables[1]\n",
+ "table1.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Not all agencies and researchers provided estimates for the same dates. Again `NaN` is the special value that indicates missing data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 186,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
Population Reference Bureau (1973–2015)[6]
\n",
+ "
United Nations Department of Economic and Social Affairs (2015)[7]
\n",
+ "
Maddison (2008)[8]
\n",
+ "
HYDE (2010)[citation needed]
\n",
+ "
Tanton (1994)[9]
\n",
+ "
Biraben (1980)[10]
\n",
+ "
McEvedy & Jones (1978)[11]
\n",
+ "
Thomlinson (1975)[12]
\n",
+ "
Durand (1974)[13]
\n",
+ "
Clark (1967)[14]
\n",
+ "
\n",
+ "
\n",
+ "
Year
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1913
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
1793.
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1920
\n",
+ "
NaN
\n",
+ "
1860.0
\n",
+ "
1863.
\n",
+ "
1912.
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
1968.
\n",
+ "
\n",
+ "
\n",
+ "
1925
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
2000.0
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1930
\n",
+ "
NaN
\n",
+ "
2070.0
\n",
+ "
NaN
\n",
+ "
2092.
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
2145.
\n",
+ "
\n",
+ "
\n",
+ "
1940
\n",
+ "
NaN
\n",
+ "
2300.0
\n",
+ "
2299.
\n",
+ "
2307.
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
2340.
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Population Reference Bureau (1973–2015)[6] \\\n",
+ "Year \n",
+ "1913 NaN \n",
+ "1920 NaN \n",
+ "1925 NaN \n",
+ "1930 NaN \n",
+ "1940 NaN \n",
+ "\n",
+ " United Nations Department of Economic and Social Affairs (2015)[7] \\\n",
+ "Year \n",
+ "1913 NaN \n",
+ "1920 1860.0 \n",
+ "1925 NaN \n",
+ "1930 2070.0 \n",
+ "1940 2300.0 \n",
+ "\n",
+ " Maddison (2008)[8] HYDE (2010)[citation needed] Tanton (1994)[9] \\\n",
+ "Year \n",
+ "1913 1793. NaN NaN \n",
+ "1920 1863. 1912. NaN \n",
+ "1925 NaN NaN NaN \n",
+ "1930 NaN 2092. NaN \n",
+ "1940 2299. 2307. NaN \n",
+ "\n",
+ " Biraben (1980)[10] McEvedy & Jones (1978)[11] Thomlinson (1975)[12] \\\n",
+ "Year \n",
+ "1913 NaN NaN NaN \n",
+ "1920 NaN NaN NaN \n",
+ "1925 NaN 2000.0 NaN \n",
+ "1930 NaN NaN NaN \n",
+ "1940 NaN NaN NaN \n",
+ "\n",
+ " Durand (1974)[13] Clark (1967)[14] \n",
+ "Year \n",
+ "1913 NaN NaN \n",
+ "1920 NaN 1968. \n",
+ "1925 NaN NaN \n",
+ "1930 NaN 2145. \n",
+ "1940 NaN 2340. "
+ ]
+ },
+ "execution_count": 186,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "table1.tail()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Some of the estimates are in a form we can't read as numbers. We could clean them up by hand, but for simplicity I'll replace any value that has an `M` in it with `NaN`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 187,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "table1.replace('M', np.nan, regex=True, inplace=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Again, we'll replace the long column names with more convenient abbreviations."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 188,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "table1.columns = ['prb', 'un', 'maddison', 'hyde', 'tanton', \n",
+ " 'biraben', 'mj', 'thomlinson', 'durand', 'clark']"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This function plots selected estimates."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 189,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def plot_prehistory(table):\n",
+ " \"\"\"Plots population estimates.\n",
+ " \n",
+ " table: DataFrame\n",
+ " \"\"\"\n",
+ " plot(table.prb, 'ro', label='PRB')\n",
+ " plot(table.un, 'co', label='UN')\n",
+ " plot(table.hyde, 'yo', label='HYDE')\n",
+ " plot(table.tanton, 'go', label='Tanton')\n",
+ " plot(table.biraben, 'bo', label='Biraben')\n",
+ " plot(table.mj, 'mo', label='McEvedy & Jones')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here are the results. Notice that we are working in millions now, not billions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 190,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\ngg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "plot_prehistory(table1)\n",
+ "decorate(xlabel='Year', \n",
+ " ylabel='World population (millions)',\n",
+ " title='Prehistorical population estimates')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can use `xlim` to zoom in on everything after Year 0."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 197,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\nmjZtKrVr105tf3t7e+nGjRtyWXh4uGRvby+NHTtWLuvRo4fUqFEj+XX16tWlqVOnqsW+YMECyd3d\nXYqLi5MkSZLOnTsn2dnZSTt27JDrzJkzR7Kzs5OOHDmitu+UKVMkOzs76cSJE5IkSdLixYslOzs7\naeXKlWr1duzYIdnZ2Unnzp2TJEmSTpw4IdnZ2UnLly9Xqzd69Gjp888/l2JiYqSVK1dK9vb20t27\nd9XqzJ07V7Kzs5PPPXPb2mTU6dixo5SUlCSXz58/X7Kzs5NOnTolSZIk/fLLL5KdnZ30888/q+2/\nevVqyc7OTtq0aVO22ssqtszlmV/reu6SJEl2dnbSuHHj5NdhYWGSnZ2dtHjxYkmSJCk0NFSyt7eX\nhgwZIqWlpcn1rl69Ktnb20vDhw9X269BgwZSfHy8XG/fvn2SnZ2dtHXr1ix/vg8fPpQcHBykuXPn\nqpX/9ddf0ueffy7NmDFDra1r167JdZKSkqQOHTqo7Zvx+/SmzO/lHj16SHZ2dtKxY8fksk2bNkl2\ndnZS586d5bK0tDSpfv36UpcuXSRJkiSVSiW5uLhIPj4+au2/evVKcnR0lLy9veWyjPdzWFiY2nGb\nNGmi9jNKTk6WunfvLtWrV09+P+jyu1aQidt9+VSHDh2oW7cudevWxdXVlS5duhAcHIynpyejR49W\nq1u+fHlKliwpv/7zzz8JCwujSZMmxMTEEB0dTXR0NK9fv6ZRo0bcunVLbVi4jY0Nn3/+ufy6TJky\nmJub8/z58yzjK1WqFPv37ycwMFDuEB45ciQ7duzA2Ng4y/2OHTuGra2txhXa4MGDAQgODlYrr127\ndpZtAZw4cQI9PT169OihVj5u3Dh27dqFsbExAwYM4MyZM2pXn69fv0ZPL/3t/z7Dgvv06aM2cMXL\nywtIP7+Mf01MTPDw8FDbr2fPnpiYmMj1dG3vfX3Mcz9+/DiSJDFgwAD5tjNAjRo1+Oqrrzh58iQp\nKSlyeYMGDdRGsjk4OADw7NmzLI9x5MgR0tLScHNzk9+30dHRWFhYULVqVU6cOAGkv/8A5s2bx8WL\nF0lNTUWpVBIYGKjx+6ELAwMDvv76a/l1xYoVgfTbcxkUCgVlypSR49fX1+fs2bNMmzZNra0XL15g\nYmLy1p/tixcvuHDhAg0aNOD169fyecbGxtK0aVOeP3/O9evX5XN9n9+1gkLc7sun5syZg4WFBQB6\nenqYmppia2uLgYGBRt0SJUqovX748CEAs2fPZvbs2Vrbf/TokZzYMu8P6YM0kpOTs4xvypQpjBw5\nkgkTJjB58mScnJxo2rQpHTt2pGjRolnuFx4ervZhkMHS0hJTU1MiIiLeem6ZRUREUKJECUxMTDTa\ns7S0lF8nJyezYMECbt68ycOHDwkPD5f7rNLS0t56DG0yD4E3MzPDzMxMjj88PJxy5cpp3EZUKpWU\nK1dO4zzf1d6H+FjnntHvlPEB/iZbW1tOnz7Nixcv5DJzc3O1OhlJ+G3HzHjvdu3aVev2jJ+ni4sL\nPXv2ZOPGjfz++++YmZnh6upK27Ztadiwoc7nlMHMzIzChf/9OCxUqBCg+f4rVKiQ3NeUEc+JEycI\nDg7m/v37PHjwQO4rkt6yClLGs1sbN25k48aNWutERkYC7/+7VlCIJJVPubi4aAxBz0rGL1SGjA+B\nESNG4OTkpHWfSpUqyd9n/FWdHXXr1uX48ePy15kzZ5g5cybr1q0jMDBQ4wMqw9t+cdPS0jQ+1N8V\n25uDI7Jy8eJF+vbti5GREfXq1aNjx4589tlnPHz4UOOvYF1p68NKTU2V483ueb6rvay86/w/5rm/\n65wg/Twyhny/z/sqo53ly5dTpEiRt9adOHEinp6eHDp0iFOnTnHo0CH27t1Lly5dsn1ubyaoN715\nxZiZJEkMHjyY48ePU7NmTZydnenSpQu1a9emV69ebz1exv+bh4dHlv2+lStXBt7/d62gEEmqACpT\npgyA/MH0pmvXrhETE/POD4C3UalU3Lp1i1KlStG6dWtat25NWloaP//8M7Nnz2bfvn1ZzmJRpkwZ\n7t+/r1H+7Nkz4uLisLa2zlYspUuX5uzZs8THx6vd+rh58yZr165l0KBBLF68mCJFirBv3z61X+gV\nK1Zk61hvCgsLU0v00dHRvHr1ChsbGyD9PK9evUpycrJaAlKpVISHh6sNXNGlvYwPfJVKpbbf227J\nAh/13DP+aPq///s/atSoobbt/v37GBkZUaxYMeLi4rLddoaM9661tTVVq1ZV23by5En5ivn58+eE\nhoZSt25d+vfvT//+/Xnx4gVDhgxh27ZtjB07NsevMi5evMjx48cZPHgwI0aMkMtTUlJ4+fLlW5/n\nyzjPQoUKafyO3r17l/DwcAwNDT/od62gEH1SBZCjoyOWlpZs3LiR+Ph4uTwuLk6+bZD56is7Xrx4\nQZcuXVi5cqVcpqenR7Vq1eTv4d8rvDdv7zRq1Ih79+5x9OhRtTZXrVoFkO1bNQ0aNCAtLY3t27er\nlW/ZsoUDBw5gYWHBy5cvMTc3V/uQfvXqlTw8WZerscw2bdqkdmWRMQqvadOmAPLzbJs3b1bb75df\nfiE+Pl7jPN/VXsaty1u3bsl1UlJSOHz48FvjzM656+npvfVWXKNGjQBYvXq1Wqw3b97k7NmzNGjQ\n4K1XHrrIOMbKlSvVjnHr1i0GDRrE+vXrgfQh6r1795b7bQCKFy9OhQoVUCgU8nsw49/3uaX7Li9f\nvgT+veLJsG3bNhITE9X65zJfYVtZWeHo6EhQUJBa/3BycjLff/89w4cPJyUlRefftYJMXEkVQPr6\n+kyaNAkfHx/c3d359ttvMTAwYPv27Tx69Ii5c+dmeXtDFyVLlqRt27b88ssvJCYm4uzszMuXL9m0\naRMWFha0bNkSQB5mvHv3biRJokOHDnh7e3P48GFGjhxJt27dsLGx4dy5cxw+fJhmzZrRoEGDbMXi\n5uaGq6srfn5+hIaGUq1aNa5cucLOnTsZMmQIZmZm1K9fn9WrVzNixAhcXV159uwZv/32m3wV8mYi\n19X58+fp378/jRo14o8//mDXrl20b99eHmqfMc+in58fd+7cwdHRkRs3bhAYGIiTkxOdOnXKVnt1\n6tTB0tKSZcuWkZSURIkSJdi1a9c7Bz5k59zNzc25cOEC27Ztw9XVVaOtKlWq4OnpycaNG/Hy8qJJ\nkyY8e/aMjRs3Ympq+l4DFjKzs7OTj/Hy5UuaNGkiv7eMjY3lK5b27dvz888/M3DgQLp160bJkiW5\nceMGO3fupEOHDvJVdUZyXrx4MV988QV169b94BgzODs7Y2JiwsyZM4mIiKBYsWKcP3+e/fv3Y2Bg\noPGzBQgICKB+/fo0btyYSZMm0atXLzp27Ei3bt0wMzNj3759/PHHH4wePVr+/dHld60gE0mqgGrR\nogXFihVj+fLlLFu2DD09PapUqcLy5cvlv1Y/xPTp0ylXrhz79u1j3759GBoaUrduXXx8fORfSFtb\nWzw9PQkMDOT69et88cUXlC9fnq1bt7Jw4UL2799PbGws5cqV47vvvqN3797ZjkNPT49ly5axdOlS\n9uzZw+7duylfvjy+vr5069YNgGHDhpGamsr+/fs5fvw4VlZW1KtXjz59+tC6dWvOnTsnX7Ho6qef\n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\nyMhQ5s2bp8TGxip5eXlKenq60qNHD2XlypVKZmamsmLFCqVXr162oa1Wq1WZOHGi8uCDDyqpqam2\n+RRXD01tLiZPnlxtyLQzrt3HH3+s9OnTR/nqq6+UX375RXnyySeVkSNHNovh/ddez40bNyo9e/ZU\ndu7cqZw+fVr5/PPPlZiYGOXzzz9XFEWu59XS0tKUbt26KS+++KLd/Eej0djon81mn6QuXbqkvPHG\nG8rAgQOVfv36Kc8884ySn5/f2GG5rPPnzytz585V4uLilJiYGGXatGnKL7/8Ytv+zTffKHfffbfS\ns2dP5d5771X27dtXbf+cnBxl5syZSkxMjDJkyBDl7bffViwWS0OfRqO79ktVUZxz7davX6/Ex8cr\nffr0UX73u9/VOk+oqbn2elqtVuW9995TRo4cqfTs2VMZOXKk8umnn1bbR65nlbffflvp2rVrjT9r\n165VFKVxP5tS9FAIIYTLatbPpIQQQrg2SVJCCCFcliQpIYQQLkuSlBBCCJclSUoIIYTLkiQlhBDC\nZUmSEqKeLVy4kKioKLtqppft2bOHqKgo1q1b18CRCeH6ZJ6UEPWstLSUe+65B41Gw1dffYWPj49t\nW0lJCXfffTft2rXj008/pUWLFo0YqRCuR+6khKhnrVq14tVXX+XcuXMsX7682ra33nqLoqIilixZ\nIglKiBpIkhKiAQwbNoz77ruPjz76iCNHjgCg1+vZvn07c+fOJSIiwvbeTz75hISEBHr27Mntt9/O\npk2buLbD4+OPP+a+++4jJiaG3r17M378eP75z3/atm/fvp2+ffvy0UcfMXjwYAYNGsTZs2cb5mSF\ncCLp7hOigRQVFTF69GjatWvHxx9/zPjx4wkICGDr1q22VafXrl3LmjVrmDp1KvHx8Rw5coR169Yx\ndepUW32f999/n2XLlvHMM88QExNDYWEhGzduJCMjgz179hASEsL27dtZuHAhERERzJs3j4sXLzJu\n3LjGPH0hfpNmXfRQiIbk5+fHokWLmDVrFr/73e84d+4c69evtyWooqIiNmzYwKOPPsoLL7wAwNCh\nQ/Hy8uLtt99mypQptG3bluzsbKZPn84TTzxhO7ZOp+OBBx7gyJEj3HnnnQBYrVb+93//l9tuu63h\nT1YIJ5HuPiEa0B133MHo0aPR6/XMnz+f9u3b27YdOnQIk8nEiBEjqKystP38z//8D5WVlfz4448A\nvPzyy8yePZuioiJ++ukn/u///o9PPvkEwK6Cardu3Rru5ISoB3InJUQDGzp0KLt372bYsGHV2gsL\nCwGYOnVqjftdrnZ66tQpFi5cyP79+9FqtXTu3JnIyEgAu2dX3t7eTo5eiIYlSUoIF9G6dWsAVq5c\nSVhYmN32tm3bYrFYeOKJJ2jVqhU7duwgKioKd3d30tPT2bVrV0OHLES9k+4+IVxEnz59aNmyJXl5\nefTq1cv2YzKZWLFiBXl5eeTl5XH69GkmTpxIjx49cHev+j1z7969QNVzKCGaErmTEsJFtGnThilT\nprBs2TKKioro168f2dnZLF++HH9/f7p06ULLli3R6XRs2bKFoKAgWrVqxd69e/nwww8BKC8vb+Sz\nEMK55E5KCBcyb948Zs+eza5du5g+fTorVqxg+PDhbNmyBa1Wi0ajYd26dQQFBfH8888ze/Zsjh49\nyoYNG+jYsSMHDx5s7FMQwqlknpQQQgiXJXdSQgghXJYkKSGEEC5LkpQQQgiXJUlKCCGEy5IkJYQQ\nwmVJkhJCCOGyJEkJIYRwWZKkhBBCuKz/ByMlQGdaI70dAAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "plot_prehistory(table1)\n",
+ "decorate(xlim=[0, 2000], xlabel='Year', \n",
+ " ylabel='World population (millions)',\n",
+ " title='Prehistorical population estimates')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "See if you can find a model that fits these data well from Year -1000 to 1940, or from Year 0 to 1940.\n",
+ "\n",
+ "How well does your best model predict actual population growth from 1950 to the present?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 243,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\nysjIkNOTkpKk9u3bS927d9c43tnZWbp27ZqcFhYWJjk7O0tffvmlnDZw4ECpTZs28nb9+vWl6dOn\na9R98eLFUs+ePaXExERJkiTp7NmzkpOTk7Rt2zY5z/z58yUnJyfp0KFDGsdOmzZNcnJyko4fPy5J\nkiQtW7ZMcnJyktasWaORb9u2bZKTk5N09uxZSZIk6fjx45KTk5O0atUqjXzjx4+X3n77bSkuLk5a\ns2aN5OzsLN25c0cjz4IFCyQnJyf52l8sOy/ZeXr16iWlpaXJ6YsWLZKcnJykkydPSpIkSb/88ovk\n5OQk/fjjjxrHr127VnJycpI2btxYoPLyq9uL6S9ua3vtkiRJTk5O0sSJE+Xt0NBQycnJSVq2bJkk\nSZIUEhIiOTs7S2PGjJHUarWc7/Lly5Kzs7P0+eefaxzXqlUrKSkpSc63d+9eycnJSdq8eXO+f9+H\nDx9KLi4u0oIFCzTSb926Jb399tvSrFmzNMq6cuWKnCctLU3q0aOHxrHZ76fnvfhaHjhwoOTk5CQd\nPXpUTtu4caPk5OQk9enTR05Tq9VSy5Ytpb59+0qSJEkqlUpyc3OTfH19NcpPSEiQXF1dpZEjR8pp\n2a/n0NBQjfO2a9dO42+Unp4uDRgwQGrevLn8etDmvVaeiea+UqpHjx54eHjg4eGBp6cnffv25ciR\nIwwaNIjx48dr5K1RowZVq1aVt//66y9CQ0Np164dcXFxxMTEEBMTQ2pqKm3atOHGjRsaw8Lt7e15\n++235W1bW1vMzc2JiorKt37VqlUjMDCQ7du3yx3C48aNY9u2bRgbG+d73NGjR3F0dMx1hzZ69GgA\njhw5opHu7u6eb1kAx48fR0dHh4EDB2qkT5w4kZ07d2JsbMyIESM4ffq0xt1namoqOjpZL//XGRY8\ndOhQjYErPj4+QNb1Zf9rYmKCt7e3xnEfffQRJiYmcj5ty3tdhXntx44dQ5IkRowYITc7AzRo0IB3\n332XEydOkJGRIae3atVKYySbi4sLAE+fPs33HIcOHUKtVuPl5SW/bmNiYrCwsKBu3bocP34cyHr9\nASxcuJALFy6QmZmJUqlk+/btud4f2jAwMKBFixbytoODA5DVPJdNoVBga2sr119fX58zZ84wY8YM\njbKePXuGiYnJS/+2z5494/z587Rq1YrU1FT5OuPj42nfvj1RUVFcvXpVvtbXea+VF6K5r5SaP38+\n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\nOLB48WKGDRtGYGDgK9dLEgRB+De4cDOSR1GJQNbnd4dmNbGxMEGp7MD+mCbcUKmwUSrpaW6Ou6lp\nidZVqyB15MiRQjnZzZs3uXTpEoGBgfJSDvPnz6dp06acOHGCixcv0rBhQ3lGi3HjxhEcHMzPP//M\nzJkzuXTpEsHBwRw+fBg7OztcXFz46quvmDlzJmPGjEGpVLJu3Tp8fHzo9M+ErQsXLsTT05MDBw5o\nfbcnCIJQXj16mkjQX5HytvtbVbGxMCE+KB7LfTH0jVChtFZi3tkcU/uSDVCgZZ+Ura2t/FO5cmWU\nSiVWVlYa6dqwtrZmzZo1ODg4yGnZK7jGxcVx4cIFmjZtqnHMO++8w4ULFwC4cOECtra22NnZyfub\nNm1KUlISN27cIDo6mvv372uUYWxsjKurq1zGv5mXlxcrV6586b6wsDCcnZ3lO9MXOTs7s3PnzqKs\npiAIRSQ1LYOD5x7Iz7raWJjQxKUq8UHxRKyLIC08DUktkRaeRsS6COKD4l9RYtHT+oGnc+fO0bt3\nb5o0aULLli2pX78+ffv25Y8//tD6ZJUrV6Z169Yaz1lt2LCB1NRUPD09efz4MVWrVtU4xsrKiseP\nHwMQGRmJlZVVrv0AERERcr6XlSFoJzAwkMOHD5d0NQRBKCSSJHEsOJTElHQAKij16PBODXR0FMTs\ni8nzmJj9eacXJ62a+4KCgvj4449xcHDg888/p0qVKjx58oT9+/czfPhw1q9fT5MmTQp88iNHjrBo\n0SJ8fHxwdHQkNTU1V7+RUqkkLS0NyFrGPHvJkGz6+vooFArS0tJIScmac+rFPM+XURoExcezLyaG\nCJUKa6WSzqWg3fdFdnZ2TJs2DXd3dypVqlTS1REE4Q1d/zuau+Fx8nZbdztMjLI+b1URqjyPUT3K\nO704aXUntXTpUjw8PNi1axeffPIJvXv3ZsyYMezatQsPDw/8/f0LfOLt27fz+eef07lzZ7788ksg\nK7ikp6dr5FOpVBgaGgJQoUIFVCrNP1p6ejqSJGFkZCSPOnwxz/NllLSg+HjWRUQQnpaGWpIIT0tj\nXUQEQfElf1v9vC+//JL09HRmz55d0lURBOENRcWmcOrPR/J2PUcLHGxyvnwqrfMeVKa0KfnBZloF\nqWvXruHt7S33H2VTKBR4e3tz9erVAp101apVTJ48mX79+jFv3jy5+c/a2ponT55o5H3y5IncfFet\n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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "pop_sys = System(t0=1, t_end=2016, p0=table1.mj[1], r=0.00132, K = 100000)\n",
+ "run_simulation(pop_sys, update_func2b)\n",
+ "\n",
+ "newfig()\n",
+ "plot_prehistory(table1)\n",
+ "plot(pop_sys.results, label='model')\n",
+ "\n",
+ "decorate(xlim=[0, 2000], xlabel='Year', \n",
+ " ylabel='World population (millions)',\n",
+ " title='Prehistorical population estimates')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 246,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAakAAAEjCAYAAACIB/7lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdYFFf78PHv0pRiQ8GKDQXzxALYojEWEI0SYsQuWDAq\nUWIMUWMnltg72FuseWLFihpj/amxYInlMRF9TQRFUVERVOq8f5CdsCzoEgER7891ecmemTlzD+7u\n7SkzR6MoioIQQgiRDxm96QCEEEKIrEiSEkIIkW9JkhJCCJFvSZISQgiRb0mSEkIIkW9JkhJCCJFv\nSZLKZ0aMGIGjo6POn/feew8XFxc6depESEhIjp7P1dWVHj16vHK/Hj164Orqmu36ExMTuXfv3r8J\nLVNbt27F0dGRU6dO5VideVF3Xnnda4iIiFB/joyMxNHRkeDg4JwK741If03w79/Lr+vhw4c8e/Ys\nz8/7tjN50wGIzI0cOZISJUoAoCgKcXFx7NixgxEjRvDo0SP69OmTp/F88cUXPH/+PFvH3L59mz59\n+uDn54eXl1eOxFG/fn2mT5+Ovb19jtQn/vH5559jY2PD1KlTAbC2tmb69Ok4Ojq+4cj+vS1btjB+\n/HguXryolv2b9/LrOnLkCEOHDiUkJAQLC4s8PffbTpJUPtWyZUsqVKigU9axY0fatm3LggUL8PHx\nwczMLM/i+fDDD7N9TGRkJH/++WeOxmFnZ4ednV2O1inSHDt2jPbt26uvLSwsaNeu3RuM6PWdOXOG\nhIQEnbJ/815+XRcvXiQ2NjbPz1sQSHffW6Rw4cK4uroSFxdHeHj4mw5HCCFynSSpt4xGowEgJSUF\nSBtTGjNmDKNGjaJ27do0bdqUmJgYAM6fP4+vry/Ozs44OzvTp08fnW6P9Hbs2IGHhwc1a9akdevW\n/Pe//9XZnrEfPzExkUmTJuHm5kbNmjVp1qwZ48eP58mTJ0Da2EjPnj2BtK7L9F1Gjx49Yty4cXz0\n0Ufq+ZYuXapeE0BwcDC1atVi//79fPjhhzg7O7Np06ZMx1wSExMJDg6mVatW1K5dO9P6/vrrL4YP\nH07Tpk2pWbMmDRo04Isvvsh2stee/+LFiwwYMAAnJyeaNGnClClTePHihc6+z58/Z9asWbi6ulKz\nZk1cXV2ZOXOmTleTofVlNdZkyBjUq65dO/YEEBISotaX1ZjUpk2baNeuHbVq1eKDDz5gyJAhREZG\nqtu1x23bto05c+bQtGlTatWqRadOnTh58qTBv+fPPvtMPceIESOIjo7W2eePP/7g888/54MPPqB2\n7dq0b9+ezZs3q9t79OihjuE6OjoyYsQItTz9e7lHjx74+fnxyy+/8Omnn1KrVi08PDw4cuQIcXFx\nBAYGUr9+fRo1akRgYKDOv4uiKPz3v/+lY8eOODs7U6tWLT7++GOWLl2K9olzI0aMYP78+QC4ubnp\njAFfv34df39/6tWrR506dejatSv/93//p3Odr/qsFXTS3fcWSU1N5fTp05iZmemMyezevZuqVasy\natQoHjx4gLW1NcePH8fPz48aNWowePBgEhMT2bp1K97e3vzwww/Uq1dPPf7SpUtcu3YNHx8frK2t\n+emnnxg3bhw2Nja0bNky01gmTJjArl276NmzJ3Z2doSHh7N+/Xr++usvVq5cSf369fniiy9YvHgx\nXbp0oW7dugA8efKErl27cvv2bbp27UqVKlU4fvw4s2bN4n//+x9z585Vz5GcnExgYCC+vr4kJiZS\nt25dLly4oBeLv78/R48exdPTE19fXy5evMisWbN4+PAhI0eO5MGDB3Tu3BkrKyt8fHwoUaIEV69e\nZePGjVy5coWDBw9iamqarX+LwYMHY2try5AhQ7h69SqrVq3i+vXrrFixAkj7YvH19eXChQt4eXlR\ns2ZNLl68yLJlyzh79ixr1qzROeer6vu3DLl27djTt99+S7169ejcuTP29vZ6SRdg2rRprFy5kkaN\nGvHtt98SHR3NunXrOHHiBJs2bdLpop43bx7m5ub06dOHpKQkVq5ciZ+fH4cPH1bHWzMzf/58goOD\nad26NZ07d+bevXusW7eO06dPs3nzZqytrYmJieHzzz+nRIkSDBgwgEKFCrF7925Gjx5NoUKF8PT0\n5IsvviA1NZWwsDCmT59OxYoVszznlStXOH/+PD179qRIkSIsWbKEr7/+mvfeew9zc3O++eYbwsLC\n2LBhA7a2tnz55ZcAzJ07l8WLF9O+fXs6d+5MfHw827ZtY9asWVhaWuLt7U2XLl2Ii4tj//79jBw5\nkurVqwNpSbZ79+6UKlUKPz8/TE1N2bVrF/3792fWrFm0bdsWePVnrcBTRL4yfPhwxcHBQbly5Yry\n8OFD5eHDh0p0dLRy/vx5ZfDgwYqDg4MyefJkdf8WLVooNWrUUO7evauWpaSkKG5ubkrXrl2V5ORk\n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\nUkIIISqt/wewMuQc3gRjJAAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "newfig()\n",
+ "plot_prehistory(table1)o\n",
+ "plot(pop_sys.results, label='model')\n",
+ "decorate(xlim=[1950, 2000], xlabel='Year', \n",
+ " ylabel='World population (millions)',\n",
+ " title='Prehistorical population estimates')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 248,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.6.1"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/code/chap04-fig01.pdf b/code/chap04-fig01.pdf
new file mode 100644
index 00000000..78f6ddf0
Binary files /dev/null and b/code/chap04-fig01.pdf differ
diff --git a/code/chap04-fig02.pdf b/code/chap04-fig02.pdf
new file mode 100644
index 00000000..3cea54f8
Binary files /dev/null and b/code/chap04-fig02.pdf differ
diff --git a/code/chap04mine.ipynb b/code/chap04mine.ipynb
new file mode 100644
index 00000000..3a9a5d63
--- /dev/null
+++ b/code/chap04mine.ipynb
@@ -0,0 +1,1034 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Modeling and Simulation in Python\n",
+ "\n",
+ "Chapter 4: Predict\n",
+ "\n",
+ "Copyright 2017 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# If you want the figures to appear in the notebook, \n",
+ "# and you want to interact with them, use\n",
+ "# %matplotlib notebook\n",
+ "\n",
+ "# If you want the figures to appear in the notebook, \n",
+ "# and you don't want to interact with them, use\n",
+ "# %matplotlib inline\n",
+ "\n",
+ "# If you want the figures to appear in separate windows, use\n",
+ "# %matplotlib qt5\n",
+ "\n",
+ "# To switch from one to another, you have to select Kernel->Restart\n",
+ "\n",
+ "%matplotlib inline\n",
+ "import math\n",
+ "from modsim import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Functions from the previous chapter"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def plot_estimates(table):\n",
+ " \"\"\"Plot world population estimates.\n",
+ " \n",
+ " table: DataFrame with columns `un` and `census`\n",
+ " \"\"\"\n",
+ " un = table.un / 1e9\n",
+ " census = table.census / 1e9\n",
+ " \n",
+ " plot(census, ':', color='darkblue', label='US Census')\n",
+ " plot(un, '--', color='green', label='UN DESA')\n",
+ " \n",
+ " decorate(xlabel='Year',\n",
+ " ylabel='World population (billion)')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def plot_results(system):\n",
+ " \"\"\"Plot the estimates and the model.\n",
+ " \n",
+ " system: System object with `results`\n",
+ " \"\"\"\n",
+ " \n",
+ " plot_estimates(table2)\n",
+ " plot(system.results, '--', color='gray', label='model')\n",
+ " decorate(xlabel='Year', \n",
+ " ylabel='World population (billion)')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def run_simulation(system, update_func):\n",
+ " \"\"\"Run a model.\n",
+ " \n",
+ " Adds TimeSeries to `system` as `results`.\n",
+ "\n",
+ " system: System object\n",
+ " update_func: function that computes the population next year\n",
+ " \"\"\"\n",
+ " results = Series([])\n",
+ " results[system.t0] = system.p0\n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " results[t+1] = update_func(results[t], t, system)\n",
+ " system.results = results"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "### Reading the data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# The data directory contains a downloaded copy of\n",
+ "# https://en.wikipedia.org/wiki/World_population_estimates\n",
+ "\n",
+ "from pandas import read_html\n",
+ "filename = 'data/World_population_estimates.html'\n",
+ "tables = read_html(filename, header=0, index_col=0, decimal='M')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "metadata": {
+ "collapsed": true,
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "table2 = tables[2]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "table2.columns = ['census', 'prb', 'un', 'maddison', \n",
+ " 'hyde', 'tanton', 'biraben', 'mj', \n",
+ " 'thomlinson', 'durand', 'clark']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "plot_estimates(table2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "### Running the quadratic model"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's the update function for the quadratic growth model with parameters `alpha` and `beta`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def update_func2(pop, t, system):\n",
+ " \"\"\"Update population based on a quadratic model.\n",
+ " \n",
+ " pop: current population in billions\n",
+ " t: what year it is\n",
+ " system: system object with model parameters\n",
+ " \"\"\"\n",
+ " net_growth = system.alpha * pop + system.beta * pop**2\n",
+ " return pop + net_growth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Select the estimates generated by the U.S. Census, and convert to billions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "census = table2.census / 1e9"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Extract the starting time and population."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "t0 = census.index[0]\n",
+ "p0 = census[t0]\n",
+ "t_end = census.index[-1]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Initialize the system object."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ " x y vx vy\n",
+ "0.000 0.000000 1.000000 28.284271 28.284271\n",
+ "0.051 1.434929 2.422229 27.988924 27.491730\n",
+ "0.102 2.855017 3.804389 27.702226 26.712880\n",
+ "0.153 4.260697 5.147165 27.423836 25.947141\n",
+ "0.204 5.652384 6.451211 27.153433 25.193958"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "system.results.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And the last few. The last value of `y` is negative, indicating that the ball hit the ground before the end of the simulation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
x
\n",
+ "
y
\n",
+ "
vx
\n",
+ "
vy
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
4.896
\n",
+ "
100.274761
\n",
+ "
3.580383
\n",
+ "
15.135822
\n",
+ "
-21.336469
\n",
+ "
\n",
+ "
\n",
+ "
4.947
\n",
+ "
101.044011
\n",
+ "
2.483281
\n",
+ "
15.030816
\n",
+ "
-21.686507
\n",
+ "
\n",
+ "
\n",
+ "
4.998
\n",
+ "
101.807902
\n",
+ "
1.368423
\n",
+ "
14.925643
\n",
+ "
-22.032810
\n",
+ "
\n",
+ "
\n",
+ "
5.049
\n",
+ "
102.566424
\n",
+ "
0.235998
\n",
+ "
14.820318
\n",
+ "
-22.375365
\n",
+ "
\n",
+ "
\n",
+ "
5.100
\n",
+ "
103.319572
\n",
+ "
-0.913800
\n",
+ "
14.714856
\n",
+ "
-22.714157
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " x y vx vy\n",
+ "4.896 100.274761 3.580383 15.135822 -21.336469\n",
+ "4.947 101.044011 2.483281 15.030816 -21.686507\n",
+ "4.998 101.807902 1.368423 14.925643 -22.032810\n",
+ "5.049 102.566424 0.235998 14.820318 -22.375365\n",
+ "5.100 103.319572 -0.913800 14.714856 -22.714157"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "system.results.tail()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Visualizing the results\n",
+ "\n",
+ "We can extract the x and y components as `Series` objects."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "xs = system.results.x\n",
+ "ys = system.results.y"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The simplest way to visualize the results is to plot x and y as functions of time."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap10-fig01.pdf\n"
+ ]
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "plot(xs, label='x')\n",
+ "plot(ys, label='y')\n",
+ "\n",
+ "decorate(xlabel='Time (s)',\n",
+ " ylabel='Position (m)')\n",
+ "\n",
+ "savefig('chap10-fig01.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can plot the velocities the same way."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "vxs = system.results.vx\n",
+ "vys = system.results.vy"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The x velocity slows down due to drag. The y velocity drops quickly while drag and gravity are in the same direction, then more slowly after the ball starts to fall."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "plot(vxs, label='vx')\n",
+ "plot(vys, label='vy')\n",
+ "\n",
+ "decorate(xlabel='Time (s)',\n",
+ " ylabel='Velocity (m/s)')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Another way to visualize the results is to plot y versus x. The result is the trajectory of the ball through its plane of motion."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap10-fig02.pdf\n"
+ ]
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "plot(xs, ys, label='trajectory')\n",
+ "\n",
+ "decorate(xlabel='x position (m)',\n",
+ " ylabel='y position (m)')\n",
+ "\n",
+ "savefig('chap10-fig02.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can also animate the flight of the ball. If there's an error in the simulation, we can sometimes spot it by looking at animations."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "decorate(xlabel='x position (m)',\n",
+ " ylabel='y position (m)',\n",
+ " xlim=[0, 105],\n",
+ " ylim=[-5, 35],\n",
+ " legend=False)\n",
+ "\n",
+ "for x, y in zip(xs, ys):\n",
+ " plot(x, y, 'bo', update=True)\n",
+ " sleep(0.01)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's a function that encapsulates that code and runs the animation in (approximately) real time."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def animate2d(xs, ys, speedup=1):\n",
+ " \"\"\"Animate the results of a projectile simulation.\n",
+ " \n",
+ " xs: x position as a function of time\n",
+ " ys: y position as a function of time\n",
+ " \n",
+ " speedup: how much to divide `dt` by\n",
+ " \"\"\"\n",
+ " # get the time intervals between elements\n",
+ " ts = xs.index\n",
+ " dts = np.diff(ts)\n",
+ " dts = np.append(dts, 0)\n",
+ "\n",
+ " # decorate the plot\n",
+ " newfig()\n",
+ " decorate(xlabel='x position (m)',\n",
+ " ylabel='y position (m)',\n",
+ " xlim=[xs.min(), xs.max()],\n",
+ " ylim=[ys.min(), ys.max()],\n",
+ " legend=False)\n",
+ "\n",
+ " # loop through the values\n",
+ " for x, y, dt in zip(xs, ys, dts):\n",
+ " plot(x, y, 'bo', update=True)\n",
+ " sleep(dt / speedup)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "animate2d(system.results.x, system.results.y)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Run the simulation for a few different launch angles and visualize the results. Are they consistent with your expectations?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Finding the range"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next we'll find the time and distance when the ball hits the ground."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "condition.set(duration=7*s)\n",
+ "system = make_system(condition)\n",
+ "run_odeint(system, slope_func)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We have to interpolate y to find the landing time, then interpolate x to find the range."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def interpolate_range(results):\n",
+ " \"\"\"Computes the range of the ball when it lands.\n",
+ " \n",
+ " results: TimeFrame with x and y\n",
+ " \n",
+ " returns: distance in meters\n",
+ " \"\"\"\n",
+ " xs = results.x\n",
+ " ys = results.y\n",
+ " t_end = ys.index[-1]\n",
+ " \n",
+ " if ys[t_end] > 0:\n",
+ " msg = \"\"\"The final value of y is still positive;\n",
+ " looks like the simulation didn't run\n",
+ " long enough.\"\"\"\n",
+ " raise ValueError(msg)\n",
+ " \n",
+ " t_peak = ys.argmax()\n",
+ " descent = ys.loc[t_peak:]\n",
+ " T = interp_inverse(descent, kind='cubic')\n",
+ " \n",
+ " t_land = T(0)\n",
+ " X = interpolate(xs, kind='cubic')\n",
+ " return X(t_land)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's the result."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(102.72237841710975)"
+ ]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "interpolate_range(system.results)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$. How much farther would a ball hit with the same velocity and launch angle travel?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Hint: rather than modify `condition`, make a copy\n",
+ "\n",
+ "condition2 = Condition(condition)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(109.07212101030548)"
+ ]
+ },
+ "execution_count": 44,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "condition2.rho = 1 * kg/m**3\n",
+ "system2 = make_system(condition2)\n",
+ "run_odeint(system2, slope_func)\n",
+ "interpolate_range(system2.results)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Optimal launch angle\n",
+ "\n",
+ "To find the launch angle that maximizes range, we need a function that takes launch angle and returns range."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def range_func(angle, condition): \n",
+ " \"\"\"Computes range for a given launch angle.\n",
+ " \n",
+ " angle: launch angle in degrees\n",
+ " condition: Condition object\n",
+ " \n",
+ " returns: distance in meters\n",
+ " \"\"\"\n",
+ " condition.set(angle=angle)\n",
+ " system = make_system(condition)\n",
+ " run_odeint(system, slope_func)\n",
+ " x_range = interpolate_range(system.results)\n",
+ " return x_range"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's test `range_func`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Wall time: 277 ms\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array(109.07212101030548)"
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%time range_func(45, condition)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And sweep through a range of angles."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "30.0 102.22512880611951\n",
+ "33.0 105.61073422582602\n",
+ "36.0 107.97200490961362\n",
+ "39.0 109.32525682573122\n",
+ "42.0 109.68662225002511\n",
+ "45.0 109.07212101030548\n",
+ "48.0 107.49791212235652\n",
+ "51.0 104.98068732786591\n",
+ "54.0 101.53816371252147\n",
+ "57.0 97.1896982361027\n",
+ "60.0 91.95703077946803\n"
+ ]
+ }
+ ],
+ "source": [
+ "angles = linspace(30, 60, 11)\n",
+ "sweep = SweepSeries()\n",
+ "\n",
+ "for angle in angles:\n",
+ " x_range = range_func(angle, condition)\n",
+ " print(angle, x_range)\n",
+ " sweep[angle] = x_range"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plotting the `Sweep` object, it looks like the peak is between 40 and 45 degrees."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "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 = $('');\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",
+ " this.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",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\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 = $('');\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 = $('');\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 = $('');\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 = $('')\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 = $('');\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 = $('');\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 = $('');\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 = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\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",
+ " '', {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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"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 overriden (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(\"\");\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('');\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'] = '';\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 = $('')\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 = $('');\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 = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var 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= 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": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving figure to file chap10-fig03.pdf\n"
+ ]
+ }
+ ],
+ "source": [
+ "newfig()\n",
+ "plot(sweep)\n",
+ "decorate(xlabel='Launch angle (degree)',\n",
+ " ylabel='Range (m)',\n",
+ " legend=False)\n",
+ "\n",
+ "savefig('chap10-fig03.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can use `max_bounded` to search for the peak efficiently."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Wall time: 2.9 s\n"
+ ]
+ }
+ ],
+ "source": [
+ "%time res = max_bounded(range_func, [0, 90], condition)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The result is an `OptimizeResult` object."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "scipy.optimize.optimize.OptimizeResult"
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "type(res)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "With the following variables."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ " fun: 109.69517452156008\n",
+ " message: 'Solution found.'\n",
+ " nfev: 9\n",
+ " status: 0\n",
+ " success: True\n",
+ " x: 41.603102863878036"
+ ]
+ },
+ "execution_count": 51,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "res"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "So the optimal angle is about 41 degrees, and the resulting range is 103 meters."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Exercise:** Add a print statement to `range_func` that prints `angle`. Then run `max_bounded` again so you can see how many times it calls `range_func` and what the arguments are."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Turning off units\n",
+ "\n",
+ "Each time `range_func` runs, it calls `odeint`, which runs `slope_func` many times. And each time `slop_func` runs, it checks the units for all computations, which takes some time. We can speed up the whole process by removing the units from the computation (now that we are satisfied that they are correct).\n",
+ "\n",
+ "Because of the way we organized the code, all units are in the `Condition` object, so we can \"turn off units\" by defining a new `Condition` object with no units:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "condition = Condition(g = 9.8,\n",
+ " mass = 145e-3,\n",
+ " diameter = 73e-3,\n",
+ " rho = 1.2,\n",
+ " C_d = 0.3,\n",
+ " angle = 45,\n",
+ " velocity = 40,\n",
+ " duration = 7)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now `range_func` and `max_bounded` are substantially faster."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Wall time: 52.3 ms\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array(102.72237841710975)"
+ ]
+ },
+ "execution_count": 53,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%time range_func(45, condition)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Wall time: 468 ms\n"
+ ]
+ }
+ ],
+ "source": [
+ "%time res = max_bounded(range_func, [0, 90], condition)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### The Manny Ramirez problem\n",
+ "\n",
+ "Finally, let's solve the Manny Ramirez problem:\n",
+ "\n",
+ "*What is the minimum effort required to hit a home run in Fenway Park?*\n",
+ "\n",
+ "Fenway Park is a baseball stadium in Boston, Massachusetts. One of its most famous features is the \"Green Monster\", which is a wall in left field that is unusually close to home plate, only 310 feet along the left field line. To compensate for the short distance, the wall is unusually high, at 37 feet.\n",
+ "\n",
+ "Although the problem asks for a minimum, it is not an optimization problem. Rather, we want to solve for the initial velocity that just barely gets the ball to the top of the wall, given that it launches at the optimal angle.\n",
+ "\n",
+ "And we have to be careful about what we mean by \"optimal\". For this problem, we don't want the longest range, we want the maximum height at the point where it reaches the wall.\n",
+ "\n",
+ "If you are ready to solve the problem on your own, go ahead. Otherwise I will walk you through the process with an outline and some starter code.\n",
+ "\n",
+ "As a first step, write a function called `height_func` that takes a launch angle and a condition as parameters, simulates the flights of a baseball, and returns the height of the baseball when it reaches a point 94.5 meters (310 feet) from home plate."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "condition = Condition(g = 9.8,\n",
+ " mass = 145e-3,\n",
+ " diameter = 73e-3,\n",
+ " rho = 1.2,\n",
+ " C_d = 0.3,\n",
+ " angle = 45,\n",
+ " velocity = 40,\n",
+ " duration = 7)\n",
+ "def height_func(angle, condition):\n",
+ " condition.angle = angle\n",
+ " system = make_system(condition)\n",
+ " run_odeint(system, slope_func)\n",
+ " \n",
+ " Ts = interp_inverse(system.results.x)\n",
+ " t_wall = Ts(94.5)\n",
+ " height = interpolate(system.results.y)\n",
+ " return height(t_wall)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Test your function with a launch angle of 45 degrees:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(11.025366370142653)"
+ ]
+ },
+ "execution_count": 58,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "height_func(45, condition)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now use `max_bounded` to find the optimal angle. Is it higher or lower than the angle that maximizes range?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "res = max_bounded(height_func, [0, 90], condition)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The following lines compute the height of the ball at the wall, given that it's launched at the optimal angle."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(11.045254540088495)"
+ ]
+ },
+ "execution_count": 60,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "angle = res.x\n",
+ "height = height_func(angle, condition)\n",
+ "height"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we need to find the height of the ball at the wall, for a given velocity, given that it's launched at the optimal angle.\n",
+ "\n",
+ "Write a function called `best_height` that takes velocity and a `Condition` object as parameters. It should use `max_bounded` to find the optimal launch angle, then compute and the highest possible height of the ball at the wall, for the given velocity."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "def best_height(velocity, condition):\n",
+ " condition.velocity = velocity\n",
+ " res = max_bounded(height_func, [0, 90], condition)\n",
+ " \n",
+ " angle = res.x\n",
+ " height = height_func(angle, condition)\n",
+ " return height"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Use this code to test `best_height`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(11.045254540088495)"
+ ]
+ },
+ "execution_count": 62,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "best_height(40, condition)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Finally, we want to use `fsolve` to find the initial velocity that makes the height of the ball exactly 11 meters when it reaches the wall.\n",
+ "\n",
+ "To use `fsolve`, we need an error function that returns 0 when we have the right velocity. Write a function called `error_func` that takes a velocity and a `Condition` object, uses `best_height` to find the height of the ball at the wall, and returns the difference between the result and the target value (11 meters)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "def error_func(velocity, condition):\n",
+ " height = best_height(velocity, condition)\n",
+ " return height-11"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Test your error function like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.045254540088494721"
+ ]
+ },
+ "execution_count": 64,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "error_func(40, condition)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Then use `fsolve` to find the answer to the problem, the minimum velocity that gets the ball out of the park."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Solution goes here\n",
+ "velocity = fsolve(error_func, 40, condition)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 39.98870758])"
+ ]
+ },
+ "execution_count": 67,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Solution goes here\n",
+ "velocity"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And just to check, run `best_height` with the value you found. The result should be 11 meters."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(11.000000000003928)"
+ ]
+ },
+ "execution_count": 68,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "best_height(velocity, condition)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.6.1"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/code/project 2/better labels.png b/code/project 2/better labels.png
new file mode 100644
index 00000000..993d508a
Binary files /dev/null and b/code/project 2/better labels.png differ
diff --git a/code/project 2/better.png b/code/project 2/better.png
new file mode 100644
index 00000000..15e9788f
Binary files /dev/null and b/code/project 2/better.png differ
diff --git a/code/project 2/fraction model.png b/code/project 2/fraction model.png
new file mode 100644
index 00000000..e17b4554
Binary files /dev/null and b/code/project 2/fraction model.png differ
diff --git a/code/project 2/initial better.png b/code/project 2/initial better.png
new file mode 100644
index 00000000..9ea9d058
Binary files /dev/null and b/code/project 2/initial better.png differ
diff --git a/code/project 2/initial pop.png b/code/project 2/initial pop.png
new file mode 100644
index 00000000..f51a627c
Binary files /dev/null and b/code/project 2/initial pop.png differ
diff --git a/code/project 2/model.png b/code/project 2/model.png
new file mode 100644
index 00000000..44377220
Binary files /dev/null and b/code/project 2/model.png differ
diff --git a/code/rabbits-mine.ipynb b/code/rabbits-mine.ipynb
new file mode 100644
index 00000000..e1b5d85a
--- /dev/null
+++ b/code/rabbits-mine.ipynb
@@ -0,0 +1,773 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Modeling and Simulation in Python\n",
+ "\n",
+ "Rabbit example\n",
+ "\n",
+ "Copyright 2017 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# If you want the figures to appear in the notebook, \n",
+ "# and you want to interact with them, use\n",
+ "# %matplotlib notebook\n",
+ "\n",
+ "# If you want the figures to appear in the notebook, \n",
+ "# and you don't want to interact with them, use\n",
+ "# %matplotlib inline\n",
+ "\n",
+ "# If you want the figures to appear in separate windows, use\n",
+ "# %matplotlib qt5\n",
+ "\n",
+ "# To switch from one to another, you have to select Kernel->Restart\n",
+ "\n",
+ "%matplotlib inline\n",
+ "\n",
+ "from modsim import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This notebook develops a simple growth model, like the ones in Chapter 3, and uses it to demonstrate a parameter sweep.\n",
+ "\n",
+ "The system we'll model is a rabbit farm. Suppose you start with an initial population of rabbits and let them breed. For simplicity, we'll assume that all rabbits are on the same breeding cycle, and we'll measure time in \"seasons\", where a season is the reproductive time of a rabbit.\n",
+ "\n",
+ "If we provide all the food, space and other resources a rabbit might need, we expect the number of new rabbits each season to be proportional to the current population, controlled by a parameter, `birth_rate`, that represents the number of new rabbits per existing rabbit, per season. As a starting place, I'll assume `birth_rate = 0.9`.\n",
+ "\n",
+ "Sadly, during each season, some proportion of the rabbits die. In a detailed model, we might keep track of each rabbit's age, because the chance of dying is probably highest for young and old rabbits, and lowest in between. But for simplicity, we'll model the death process with a single parameter, `death_rate`, that represent the number\n",
+ "of deaths per rabbit per season. As a starting place, I'll assume `death_rate = 0.5`.\n",
+ "\n",
+ "Here's a system object that contains these parameters as well as:\n",
+ "\n",
+ "* The initial population, `p0`,\n",
+ "* The initial time, `t0`, and\n",
+ "* The duration of the simulation, `t_end`, measured in seasons."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
value
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
t0
\n",
+ "
0.0
\n",
+ "
\n",
+ "
\n",
+ "
t_end
\n",
+ "
10.0
\n",
+ "
\n",
+ "
\n",
+ "
p0
\n",
+ "
10.0
\n",
+ "
\n",
+ "
\n",
+ "
birth_rate
\n",
+ "
0.9
\n",
+ "
\n",
+ "
\n",
+ "
death_rate
\n",
+ "
0.5
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "t0 0.0\n",
+ "t_end 10.0\n",
+ "p0 10.0\n",
+ "birth_rate 0.9\n",
+ "death_rate 0.5\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "system = System(t0 = 0, \n",
+ " t_end = 10,\n",
+ " p0 = 10,\n",
+ " birth_rate = 0.9,\n",
+ " death_rate = 0.5)\n",
+ "\n",
+ "system"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's a version of run_simulation, similar to the one in Chapter 3, with both births and deaths proportional to the current population."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def run_simulation(system):\n",
+ " \"\"\"Runs a proportional growth model.\n",
+ " \n",
+ " Adds TimeSeries to `system` as `results`.\n",
+ " \n",
+ " system: System object with t0, t_end, p0,\n",
+ " birth_rate and death_rate\n",
+ " \"\"\"\n",
+ " results = TimeSeries()\n",
+ " results[system.t0] = system.p0\n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " births = system.birth_rate * results[t]\n",
+ " deaths = system.death_rate * results[t]\n",
+ " results[t+1] = results[t] + births - deaths\n",
+ " system.results = results"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can run the simulation and display the results:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
value
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
10.000000
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
14.000000
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
19.600000
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
27.440000
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
38.416000
\n",
+ "
\n",
+ "
\n",
+ "
5
\n",
+ "
53.782400
\n",
+ "
\n",
+ "
\n",
+ "
6
\n",
+ "
75.295360
\n",
+ "
\n",
+ "
\n",
+ "
7
\n",
+ "
105.413504
\n",
+ "
\n",
+ "
\n",
+ "
8
\n",
+ "
147.578906
\n",
+ "
\n",
+ "
\n",
+ "
9
\n",
+ "
206.610468
\n",
+ "
\n",
+ "
\n",
+ "
10
\n",
+ "
289.254655
\n",
+ "
\n",
+ "
\n",
+ "
11
\n",
+ "
404.956517
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "0 10.000000\n",
+ "1 14.000000\n",
+ "2 19.600000\n",
+ "3 27.440000\n",
+ "4 38.416000\n",
+ "5 53.782400\n",
+ "6 75.295360\n",
+ "7 105.413504\n",
+ "8 147.578906\n",
+ "9 206.610468\n",
+ "10 289.254655\n",
+ "11 404.956517\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "run_simulation(system)\n",
+ "system.results"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Notice that the simulation actually runs one season past `t_end`. That's an off-by-one error that I'll fix later, but for now we don't really care.\n",
+ "\n",
+ "The following function plots the results."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def plot_results(system, title=None):\n",
+ " \"\"\"Plot the estimates and the model.\n",
+ " \n",
+ " system: System object with `results`\n",
+ " \"\"\"\n",
+ " newfig()\n",
+ " plot(system.results, 'bo', label='rabbits')\n",
+ " decorate(xlabel='Season', \n",
+ " ylabel='Rabbit population',\n",
+ " title=title)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And here's how we call it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\nyIIo+AAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_results(system, title='Proportional growth model')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's suppose our goal is to maximize the number of rabbits, so the metric we care about is the final population. We can extract it from the results like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def final_population(system):\n",
+ " t_end = system.results.index[-1]\n",
+ " return system.results[t_end]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And call it like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "404.95651696640027"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "final_population(system)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To explore the effect of the parameters on the results, we'll define `make_system`, which takes the system parameters as function parameters(!) and returns a `System` object:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def make_system(birth_rate=0.9, death_rate=0.5):\n",
+ " \n",
+ " system = System(t0 = 0, \n",
+ " t_end = 10,\n",
+ " p0 = 10,\n",
+ " birth_rate = birth_rate,\n",
+ " death_rate = death_rate)\n",
+ " return system"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can make a `System`, run a simulation, and extract a metric:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "404.95651696640027"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "system = make_system()\n",
+ "run_simulation(system)\n",
+ "final_population(system)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To see the relationship between `birth_rate` and final population, we'll define `sweep_birth_rate`:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def sweep_birth_rate(birth_rates, death_rate=0.5):\n",
+ " \n",
+ " for birth_rate in birth_rates:\n",
+ " system = make_system(birth_rate=birth_rate,\n",
+ " death_rate=death_rate)\n",
+ " run_simulation(system)\n",
+ " p_end = final_population(system)\n",
+ " plot(birth_rate, p_end, 'gs', label='rabbits')\n",
+ " \n",
+ " decorate(xlabel='Births per rabbit per season',\n",
+ " ylabel='Final population')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The first parameter of `sweep_birth_rate` is supposed to be an array; we can use `linspace` to make one."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 0. , 0.05, 0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 ,\n",
+ " 0.45, 0.5 , 0.55, 0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85,\n",
+ " 0.9 , 0.95, 1. ])"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "birth_rates = linspace(0, 1, 21)\n",
+ "birth_rates"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can call `sweep_birth_rate`.\n",
+ "\n",
+ "The resulting figure shows the final population for a range of values of `birth_rate`.\n",
+ "\n",
+ "Confusingly, the results from a parameter sweep sometimes resemble a time series. It is very important to remember the difference. One way to avoid confusion: LABEL THE AXES.\n",
+ "\n",
+ "In the following figure, the x-axis is `birth_rate`, NOT TIME."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "birth_rates = linspace(0, 1, 21)\n",
+ "sweep_birth_rate(birth_rates)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The code to sweep the death rate is similar."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def sweep_death_rate(death_rates, birth_rate=0.9):\n",
+ " \n",
+ " for death_rate in death_rates:\n",
+ " system = make_system(birth_rate=birth_rate,\n",
+ " death_rate=death_rate)\n",
+ " run_simulation(system)\n",
+ " p_end = final_population(system)\n",
+ " plot(death_rate, p_end, 'r^', label='rabbits')\n",
+ " \n",
+ " decorate(xlabel='Deaths per rabbit per season',\n",
+ " ylabel='Final population')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And here are the results. Again, the x-axis is `death_rate`, NOT TIME."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "death_rates = linspace(0.1, 1, 20)\n",
+ "sweep_death_rate(death_rates)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the previous sweeps, we hold one parameter constant and sweep the other.\n",
+ "\n",
+ "You can also sweep more than one variable at a time, and plot multiple lines on a single axis.\n",
+ "\n",
+ "To keep the figure from getting too cluttered, I'll reduce the number of values in `birth_rates`:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 0.4, 0.6, 0.8, 1. ])"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "birth_rates = linspace(0.4, 1, 4)\n",
+ "birth_rates"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "By putting one for loop inside another, we can enumerate all pairs of values.\n",
+ "\n",
+ "The results show 4 lines, one for each value of `birth_rate`.\n",
+ "\n",
+ "(I did not plot the lines between the data points because of a limitation in `plot`.)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\nRK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "for birth_rate in birth_rates:\n",
+ " for death_rate in death_rates:\n",
+ " system = make_system(birth_rate=birth_rate,\n",
+ " death_rate=death_rate)\n",
+ " run_simulation(system)\n",
+ " p_end = final_population(system)\n",
+ " plot(death_rate, p_end, 'c^', label='rabbits')\n",
+ " \n",
+ "decorate(xlabel='Deaths per rabbit per season',\n",
+ " ylabel='Final population')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If you suspect that the results depend on the difference between `birth_rate` and `death_rate`, you could run the same loop, plotting the \"net birth rate\" on the x axis.\n",
+ "\n",
+ "If you are right, the results will fall on a single curve, which means that knowing the difference is sufficient to predict the outcome; you don't actually have to know the two parameters separately."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\nRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "for birth_rate in birth_rates:\n",
+ " for death_rate in death_rates:\n",
+ " system = make_system(birth_rate=birth_rate,\n",
+ " death_rate=death_rate)\n",
+ " run_simulation(system)\n",
+ " p_end = final_population(system)\n",
+ " net_birth_rate = birth_rate - death_rate\n",
+ " plot(net_birth_rate, p_end, 'mv', label='rabbits')\n",
+ " \n",
+ "decorate(xlabel='Net births per rabbit per season',\n",
+ " ylabel='Final population')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "On the other hand, if you guess that the results depend on the ratio of the parameters, rather than the difference, you could check by plotting the ratio on the x axis.\n",
+ "\n",
+ "If the results don't fall on a single curve, that suggests that the ratio alone is not sufficient to predict the outcome. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\nM2fOHJo0aUJ6enqV11lZmX483M37aG9vT3BwMLt37zZpzX7zzTcm54WGhnLu3Dn8/Pzo2LGj+mfr\n1nmdCl8AAAL+SURBVK3q38GBAwdo1qwZL774opqIdDodBw4cuKP/HyqzefNm+vTpg16vx87OjrCw\nMN566y2AW75HovpIMhJ1xj/+8Q9sbW2ZO3cuRqNR7a9/6623+Omnn9i9ezdjx47l+PHjKIpCUVER\nAI0bNyYnJ4fk5GSysrIq1BsdHU1+fj5jx47lq6++4quvvmLs2LEUFBRUuXutlZUVU6dO5bvvvmP6\n9Ol8//33bNu2jaioKB588EGGDBlyx/e3adMmNmzYwN69e4mJieHkyZPExMTcUR23u9fKdO7cWZ0M\n8fXXX/Pjjz8ya9Ys8vPzefzxx6u8rkmTJvz+++/s37+foqKiu3ofAV5++WVOnjzJlClT+P7779mw\nYUOFyQ4RERHo9XpeeOEFvvzyS/bt28f06dPZunUrbdu2BcpaLlevXmXBggXs37+f7du3Ex4eTk5O\nDoWFhSbv0blz5/jxxx/VKd+3U56so6OjSU5OZu/evbz22mvY29urE2pEzZJkJOoMX19fRo0axYkT\nJ9iyZYv6vExqairjxo1j/vz5eHl5qVOoy5d3GTJkCF5eXkRHR7N9+/YK9fr7+/PRRx/h5OTEjBkz\neO2112jWrBkJCQn4+/tXGc+wYcNYvHgxJ0+eJCoqiqVLl9KnTx+2bNliMohvrjlz5rB9+3YmTJhA\nWloaq1atIiws7I7quN29VsbFxYX169fTuHFjXn/9dcaPH8/Ro0dZvnw5Xbt2rfK6iIgIcnJyePHF\nF/n999/v+n0MCQlh7dq1pKenM2nSJLZu3cq8efNMzmnRogWffPIJ7u7uxMbGEhUVxenTp1m8eDHP\nPPOMeu/R0dF88cUXREZGsnz5ckJCQnjzzTfJzc3l3LlzAIwYMQJbW1vGjRvHDz/8YNZ71KZNG9as\nWUN+fj4vv/wykyZNIi8vjw8++AAfHx+z6hD3RrYdF0IIYXHSMhJCCGFxkoyEEEJYnCQjIYQQFifJ\nSAghhMVJMhJCCGFxkoyEEEJYnCQjIYQQFifJSAghhMX9fynbOMZMAneAAAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "for birth_rate in birth_rates:\n",
+ " for death_rate in death_rates:\n",
+ " system = make_system(birth_rate=birth_rate,\n",
+ " death_rate=death_rate)\n",
+ " run_simulation(system)\n",
+ " p_end = final_population(system)\n",
+ " birth_ratio = birth_rate / death_rate\n",
+ " plot(birth_ratio, p_end, 'y>', label='rabbits')\n",
+ " \n",
+ "decorate(xlabel='Ratio of births to deaths',\n",
+ " ylabel='Final population')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.6.1"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/code/rabbits2.ipynb b/code/rabbits2.ipynb
deleted file mode 100644
index f77cb8cf..00000000
--- a/code/rabbits2.ipynb
+++ /dev/null
@@ -1,399 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Modeling and Simulation in Python\n",
- "\n",
- "Rabbit example\n",
- "\n",
- "Copyright 2017 Allen Downey\n",
- "\n",
- "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "%matplotlib inline\n",
- "\n",
- "from modsim import *"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Rabbit Redux\n",
- "\n",
- "This notebook starts with a version of the rabbit population growth model and walks through some steps for extending it.\n",
- "\n",
- "In the original model, we treat all rabbits as adults; that is, we assume that a rabbit is able to breed in the season after it is born. In this notebook, we extend the model to include both juvenile and adult rabbits.\n",
- "\n",
- "As an example, let's assume that rabbits take 3 seasons to mature. We could model that process explicitly by counting the number of rabbits that are 1, 2, or 3 seasons old. As an alternative, we can model just two stages, juvenile and adult. In the simpler model, the maturation rate is 1/3 of the juveniles per season.\n",
- "\n",
- "To implement this model, make these changes in the System object:\n",
- "\n",
- "0. Before you make any changes, run all cells and confirm your understand them.\n",
- "\n",
- "1. Then, add a second initial populations: `juvenile_pop0`, with value `0`.\n",
- "\n",
- "2. Add an additional variable, `mature_rate`, with the value `0.33`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
value
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
t0
\n",
- "
0.0
\n",
- "
\n",
- "
\n",
- "
t_end
\n",
- "
10.0
\n",
- "
\n",
- "
\n",
- "
adult_pop0
\n",
- "
10.0
\n",
- "
\n",
- "
\n",
- "
birth_rate
\n",
- "
0.9
\n",
- "
\n",
- "
\n",
- "
death_rate
\n",
- "
0.5
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- "t0 0.0\n",
- "t_end 10.0\n",
- "adult_pop0 10.0\n",
- "birth_rate 0.9\n",
- "death_rate 0.5\n",
- "dtype: float64"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "system = System(t0 = 0, \n",
- " t_end = 10,\n",
- " adult_pop0 = 10,\n",
- " birth_rate = 0.9,\n",
- " death_rate = 0.5)\n",
- "\n",
- "system"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now update `run_simulation` with the following changes:\n",
- "\n",
- "1. Add a second TimeSeries, named `juveniles`, to keep track of the juvenile population, and initialize it with `juvenile_pop0`.\n",
- "\n",
- "2. Inside the for loop, compute the number of juveniles that mature during each time step.\n",
- "\n",
- "3. Also inside the for loop, add a line that stores the number of juveniles in the new `TimeSeries`. For simplicity, let's assume that only adult rabbits die.\n",
- "\n",
- "4. During each time step, subtract the number of maturations from the juvenile population and add it to the adult population.\n",
- "\n",
- "5. After the for loop, store the `juveniles` `TimeSeries` as a variable in `System`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def run_simulation(system):\n",
- " \"\"\"Runs a proportional growth model.\n",
- " \n",
- " Adds TimeSeries to `system` as `results`.\n",
- " \n",
- " system: System object with t0, t_end, p0,\n",
- " birth_rate and death_rate\n",
- " \"\"\"\n",
- " adults = TimeSeries()\n",
- " adults[system.t0] = system.adult_pop0\n",
- " \n",
- " for t in linrange(system.t0, system.t_end):\n",
- " births = system.birth_rate * adults[t]\n",
- " deaths = system.death_rate * adults[t]\n",
- " \n",
- " adults[t+1] = adults[t] + births - deaths\n",
- " \n",
- " system.adults = adults"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Test your changes in `run_simulation`:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
value
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
0
\n",
- "
10.000000
\n",
- "
\n",
- "
\n",
- "
1
\n",
- "
14.000000
\n",
- "
\n",
- "
\n",
- "
2
\n",
- "
19.600000
\n",
- "
\n",
- "
\n",
- "
3
\n",
- "
27.440000
\n",
- "
\n",
- "
\n",
- "
4
\n",
- "
38.416000
\n",
- "
\n",
- "
\n",
- "
5
\n",
- "
53.782400
\n",
- "
\n",
- "
\n",
- "
6
\n",
- "
75.295360
\n",
- "
\n",
- "
\n",
- "
7
\n",
- "
105.413504
\n",
- "
\n",
- "
\n",
- "
8
\n",
- "
147.578906
\n",
- "
\n",
- "
\n",
- "
9
\n",
- "
206.610468
\n",
- "
\n",
- "
\n",
- "
10
\n",
- "
289.254655
\n",
- "
\n",
- "
\n",
- "
11
\n",
- "
404.956517
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- "0 10.000000\n",
- "1 14.000000\n",
- "2 19.600000\n",
- "3 27.440000\n",
- "4 38.416000\n",
- "5 53.782400\n",
- "6 75.295360\n",
- "7 105.413504\n",
- "8 147.578906\n",
- "9 206.610468\n",
- "10 289.254655\n",
- "11 404.956517\n",
- "dtype: float64"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "run_simulation(system)\n",
- "system.adults"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Next, update `plot_results` to plot both the adult and juvenile `TimeSeries`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def plot_results(system, title=None):\n",
- " \"\"\"Plot the estimates and the model.\n",
- " \n",
- " system: System object with `results`\n",
- " \"\"\"\n",
- " newfig()\n",
- " plot(system.adults, 'bo-', label='adults')\n",
- " decorate(xlabel='Season', \n",
- " ylabel='Rabbit population',\n",
- " title=title)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "And test your updated version of `plot_results`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plot_results(system, title='Proportional growth model')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "This notebook demonstrates the steps we recommend for starting your project:\n",
- "\n",
- "1. Start with one of the examples from the book, either by copying a notebook or pasting code into a new notebook. Get the code working before you make any changes.\n",
- "\n",
- "2. Make one small change, and run the code again.\n",
- "\n",
- "3. Repeat step 2 until you have a basic implementation of your model.\n",
- "\n",
- "If you start with working code that you understand and make small changes, you can avoid spending a lot of time debugging.\n",
- "\n",
- "One you have a basic model working, you can think about what metrics to measure, what parameters to sweep, and how to use the model to predict, explain, or design."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Bonus question\n",
- "\n",
- "Suppose you only have room for 30 adult rabbits. Whenever the adult population exceeds 30, you take any excess rabbits to market (as pets for kind children, of course). Modify `run_simulation` to model this strategy. What effect does it have on the behavior of the system? You might have to run for more than 10 seasons to see what happens."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "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.6.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 1
-}
diff --git a/code/rabbits2mine.ipynb b/code/rabbits2mine.ipynb
new file mode 100644
index 00000000..3d685fff
--- /dev/null
+++ b/code/rabbits2mine.ipynb
@@ -0,0 +1,377 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Modeling and Simulation in Python\n",
+ "\n",
+ "Rabbit example\n",
+ "\n",
+ "Copyright 2017 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "from modsim import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Rabbit Redux\n",
+ "\n",
+ "This notebook starts with a version of the rabbit population growth model and walks through some steps for extending it.\n",
+ "\n",
+ "In the original model, we treat all rabbits as adults; that is, we assume that a rabbit is able to breed in the season after it is born. In this notebook, we extend the model to include both juvenile and adult rabbits.\n",
+ "\n",
+ "As an example, let's assume that rabbits take 3 seasons to mature. We could model that process explicitly by counting the number of rabbits that are 1, 2, or 3 seasons old. As an alternative, we can model just two stages, juvenile and adult. In the simpler model, the maturation rate is 1/3 of the juveniles per season.\n",
+ "\n",
+ "To implement this model, make these changes in the System object:\n",
+ "\n",
+ "0. Before you make any changes, run all cells and confirm your understand them.\n",
+ "\n",
+ "1. Then, add a second initial populations: `juvenile_pop0`, with value `0`.\n",
+ "\n",
+ "2. Add an additional variable, `mature_rate`, with the value `0.33`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
value
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
t0
\n",
+ "
0.00
\n",
+ "
\n",
+ "
\n",
+ "
t_end
\n",
+ "
25.00
\n",
+ "
\n",
+ "
\n",
+ "
adult_pop0
\n",
+ "
10.00
\n",
+ "
\n",
+ "
\n",
+ "
birth_rate
\n",
+ "
0.90
\n",
+ "
\n",
+ "
\n",
+ "
death_rate
\n",
+ "
0.50
\n",
+ "
\n",
+ "
\n",
+ "
juvenile_pop0
\n",
+ "
0.00
\n",
+ "
\n",
+ "
\n",
+ "
mature_rate
\n",
+ "
0.33
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "t0 0.00\n",
+ "t_end 25.00\n",
+ "adult_pop0 10.00\n",
+ "birth_rate 0.90\n",
+ "death_rate 0.50\n",
+ "juvenile_pop0 0.00\n",
+ "mature_rate 0.33\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "system = System(t0 = 0, \n",
+ " t_end = 25,\n",
+ " adult_pop0 = 10,\n",
+ " birth_rate = 0.9,\n",
+ " death_rate = 0.5,\n",
+ " juvenile_pop0 = 0,\n",
+ " mature_rate = 0.33)\n",
+ "\n",
+ "system"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now update `run_simulation` with the following changes:\n",
+ "\n",
+ "1. Add a second TimeSeries, named `juveniles`, to keep track of the juvenile population, and initialize it with `juvenile_pop0`.\n",
+ "\n",
+ "2. Inside the for loop, compute the number of juveniles that mature during each time step.\n",
+ "\n",
+ "3. Also inside the for loop, add a line that stores the number of juveniles in the new `TimeSeries`. For simplicity, let's assume that only adult rabbits die.\n",
+ "\n",
+ "4. During each time step, subtract the number of maturations from the juvenile population and add it to the adult population.\n",
+ "\n",
+ "5. After the for loop, store the `juveniles` `TimeSeries` as a variable in `System`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def run_simulation(system):\n",
+ " \"\"\"Runs a proportional growth model.\n",
+ " \n",
+ " Adds TimeSeries to `system` as `results`.\n",
+ " \n",
+ " system: System object with t0, t_end, p0,\n",
+ " birth_rate and death_rate\n",
+ " \"\"\"\n",
+ " adults = TimeSeries()\n",
+ " adults[system.t0] = system.adult_pop0\n",
+ " juveniles = TimeSeries()\n",
+ " juveniles[system.t0] = system.juvenile_pop0\n",
+ " \n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " births = system.birth_rate * adults[t]\n",
+ " deaths = system.death_rate * adults[t]\n",
+ " juveniles_matured = juveniles[t] * system.mature_rate\n",
+ " \n",
+ " adults[t+1] = adults[t] + juveniles_matured - deaths\n",
+ " juveniles[t+1] = juveniles[t] + births - juveniles_matured\n",
+ " \n",
+ " system.juveniles = juveniles\n",
+ " system.adults = adults"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Test your changes in `run_simulation`:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "run_simulation(system)\n",
+ "# system.adults\n",
+ "# system.juveniles"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, update `plot_results` to plot both the adult and juvenile `TimeSeries`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def plot_results(system, title=None):\n",
+ " \"\"\"Plot the estimates and the model.\n",
+ " \n",
+ " system: System object with `results`\n",
+ " \"\"\"\n",
+ " newfig()\n",
+ " plot(system.adults, 'bo-', label='adults')\n",
+ " plot(system.juveniles, 'ro-', label='juveniles')\n",
+ " decorate(xlabel='Season', \n",
+ " ylabel='Rabbit population',\n",
+ " title=title)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And test your updated version of `plot_results`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEjCAYAAAAc4VcXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXl4TVf3xz83s8SYSIhEYkzSmoKYSszU8DO0Wq/XrFXz\nWK2iw1ulozmo1tCB0qqiNZcqWhQJWkOlYqqECAmCyJzz+2O7N7kZuCHJTW7W53ny5Jx9zj1n7RvO\n9+y111pbp2mahiAIgiDkEitzGyAIgiAUTURABEEQhMdCBEQQBEF4LERABEEQhMdCBEQQBEF4LERA\nBEEQhMdCBKSYMGXKFHx9fY1+nnrqKRo0aMCLL77Ixo0bzW3iYxMTE8P9+/cN+/q+mpvCYseTkJaW\nRkREhGF/w4YN+Pr6cvjwYTNalXsWLlyIr6+vUV/y83PFBRtzGyAULFOnTqVcuXIAaJrGvXv32LRp\nE1OmTOHWrVu89NJLZrYwd+zbt4/XXnuNjRs34ujoCMB//vMfmjVrZmbLij737t1j8ODBtGrVirFj\nx5rbHKEQIgJSzGjfvj2enp5GbS+88AJdunRh8eLF9O/fHzs7OzNZl3tOnDjBnTt3jNrq169P/fr1\nzWSR5XD79m1OnjxJq1atzG2KUEgRF5aAg4MDbdu25d69e4SFhZnbHEEQiggiIAIAOp0OgNTUVADa\ntm3LW2+9xbRp06hbty4tW7bk5s2bAISEhDB48GDDm/7AgQMJDg42ul7btm158803WbduHe3atcPf\n358+ffpw6NChLPc29XqZ7Rk+fDiLFi0CoF27dgwYMADIfu7hypUrvP766zRt2pQ6derQvXt3vv/+\ne6NzpkyZQqdOnThx4gT9+/enXr16PPPMM8ycOZOEhASjc//44w+GDh1KkyZNqFWrFoGBgbzzzjtZ\nRkOmcOHCBUaOHElAQABNmjRh5syZfP/990a+94ULF1KnTh127dpF8+bNqV+/PuvWrQPg1q1bvPvu\nuwQGBlK7dm2effZZli5davhbfv311/j6+nLmzBnDPe/evcvTTz9Nt27djGz56quv8PPzY+vWrbRr\n1w6ARYsWZZkHiImJ4bXXXiMgIIAGDRowevRorl69+tB+6udPQkNDGTduHPXr16dp06Z8/PHHpKam\nsnHjRp599lnDv5XQ0FCjzz+qn3ouX77M2LFjadSoEU2aNOHjjz8mOTk5iz2xsbHMmDHDcL3OnTvz\n9ddfI9WdTEdcWAJpaWkcOXIEOzs7qlevbmjfunUr1apVY9q0aURHR+Ps7Mzu3bsZM2YMXl5ejBw5\nEoB169YxePBggoKCDA8dgIMHD7Jp0yYGDBiAq6sr3377LUOHDuWLL76gcePGALm6XmZ7mjdvjq2t\nLbt27WLq1KnUrFkz2/6Fh4fTu3dvEhMT6d+/P66uruzcuZO3336bS5cuMXnyZMO5N2/e5OWXX6Zz\n5850796d3377jVWrVmFnZ2c4b//+/bzyyis0aNCAcePGodPpOHDgAGvXriU2NpYFCxaY/N1fvXqV\nvn37AvDSSy9hY2PD6tWr2bx5c5ZzU1JSeOeddxgyZAhJSUk0bNiQ2NhY+vTpw5UrV+jTpw9Vq1bl\nwIEDzJkzh7///pv58+fTsmVLPvjgAw4dOsRTTz0FQHBwMKmpqYSFhREbG0uZMmUMfatVqxZNmjRh\n6tSpfPjhh3To0IEOHTrg7OxssGXatGkEBATw2muvce7cOdasWUNERAQ//fTTI/s8bNgwGjZsyJQp\nU9i5cydffPEFZ8+e5Z9//mHQoEFomsaSJUsYN24c27Ztw8bGxqR+AkRHR9OnTx+Sk5MZNGgQDg4O\nrFmzhlu3bhnZcP/+ffr3709kZCR9+/alYsWKHDp0iA8++IBLly7xv//9z+S/YbFGE4oFb7zxhubj\n46OdPn1ai4mJ0WJiYrTr169rx48f18aPH6/5+PhoH3zwgeH8Nm3aaH5+ftq1a9cMbcnJyVrLli21\nVq1aaXfv3jW0x8bGaoGBgVpgYKCWlJRk+LyPj4+2a9cuw3kxMTFaQECA1rt378e6XmZ7NE3TgoKC\nNB8fHy08PDxLX/VMmDBB8/Pz006dOmVoS01N1YYPH675+vpqZ8+eNfrcypUrje7RuXNnrUWLFob9\nl19+WWvTpo2WmJhodF7v3r21+vXr52hHdkydOlV7+umntXPnzhnarl27pvn7+xv1S9/Pzz//3Ojz\ns2bNyvI9a5qmvfvuu5qPj4+2d+9eTdM0rV27dtqwYcMMxz/44AMtMDBQ8/Hx0Xbv3q1pmqYlJCRo\ndevW1YKCgjRN07Tw8HDNx8fHsK9pmrZ+/XrNx8dHGzlypNH9pkyZovn4+GiXL1/Osa/6z44dO9bQ\ndufOHa1WrVqan5+f4e+gaZo2d+5czcfHR7t48WKu+vnRRx9pvr6+Rn/r6OhorWnTplm+z1q1ammh\n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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_results(system, title='Proportional growth model')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This notebook demonstrates the steps we recommend for starting your project:\n",
+ "\n",
+ "1. Start with one of the examples from the book, either by copying a notebook or pasting code into a new notebook. Get the code working before you make any changes.\n",
+ "\n",
+ "2. Make one small change, and run the code again.\n",
+ "\n",
+ "3. Repeat step 2 until you have a basic implementation of your model.\n",
+ "\n",
+ "If you start with working code that you understand and make small changes, you can avoid spending a lot of time debugging.\n",
+ "\n",
+ "One you have a basic model working, you can think about what metrics to measure, what parameters to sweep, and how to use the model to predict, explain, or design."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Bonus question\n",
+ "\n",
+ "Suppose you only have room for 30 adult rabbits. Whenever the adult population exceeds 30, you take any excess rabbits to market (as pets for kind children, of course). Modify `run_simulation` to model this strategy. What effect does it have on the behavior of the system? You might have to run for more than 10 seasons to see what happens."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "def run_simulation1(system):\n",
+ " \"\"\"Runs a proportional growth model.\n",
+ " \n",
+ " Adds TimeSeries to `system` as `results`.\n",
+ " \n",
+ " system: System object with t0, t_end, p0,\n",
+ " birth_rate and death_rate\n",
+ " \"\"\"\n",
+ " adults = TimeSeries()\n",
+ " adults[system.t0] = system.adult_pop0\n",
+ " juveniles = TimeSeries()\n",
+ " juveniles[system.t0] = system.juvenile_pop0\n",
+ " \n",
+ " for t in linrange(system.t0, system.t_end):\n",
+ " births = system.birth_rate * adults[t]\n",
+ " deaths = system.death_rate * adults[t]\n",
+ " juveniles_matured = juveniles[t] * system.mature_rate\n",
+ " \n",
+ " #extra = adults[t] - 30\n",
+ " adults[t+1] = adults[t] + juveniles_matured - deaths #- extra\n",
+ " if adults[t+1] > 30:\n",
+ " adults[t+1] = 30\n",
+ " juveniles[t+1] = juveniles[t] + births - juveniles_matured\n",
+ " \n",
+ " system.juveniles = juveniles\n",
+ " system.adults = adults"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEjCAYAAAAomJYLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXl8TOf3x9+TlVhCInYJQoJYgqCWqF3xs7S09bWU1k4o\nVUWri9JVbbG1tiqlRa1BLVWitEjsW+z7EgSJiESW+/vjMTOZLEzIOjnv12tecu/cuffcSTyf+5xz\nnnN0mqZpCIIgCEISrLLaAEEQBCF7IgIhCIIgpIgIhCAIgpAiIhCCIAhCiohACIIgCCkiAiEIgiCk\niAiEBTBmzBg8PT1NXpUrV6ZWrVq8+eabrFmzJqtNfGHCwsKIiooybOvvNavJLna8DAkJCVy7ds2w\nvXr1ajw9Pdm3b18WWpV2ZsyYgaenp8m9ZOTnchM2WW2AkH6MHTuWwoULA6BpGpGRkaxfv54xY8Zw\n//593nvvvSy2MG0EBgby4YcfsmbNGhwcHAB4++23qV+/fhZblvOJjIykd+/evPrqqwwdOjSrzRGy\nKSIQFkSLFi0oXbq0yb4uXbrQtm1bZs2aRY8ePbCzs8si69LO0aNHiYiIMNlXs2ZNatasmUUWWQ4P\nHjzg2LFjvPrqq1ltipCNEReThZMnTx6aNWtGZGQkZ8+ezWpzBEHIQYhA5AJ0Oh0A8fHxADRr1oxx\n48bx8ccfU716dRo3bsy9e/cACA4Opnfv3oYn9XfeeYegoCCT8zVr1oxPPvmElStX0rx5c7y9vena\ntSt79+5Ndm1zz5fUngEDBjBz5kwAmjdvTs+ePYGUff/Xr19n1KhRvPLKK1SrVo0OHTqwYsUKk2PG\njBnDa6+9xtGjR+nRowc1atSgQYMGTJw4kejoaJNj//vvP/r27Uu9evXw8vLC19eXzz77LNlsxhwu\nXLjAoEGD8PHxoV69ekycOJEVK1aY+L5nzJhBtWrV2LZtGw0bNqRmzZqsXLkSgPv37/PFF1/g6+tL\n1apVad26NXPnzjX8Ln/55Rc8PT05deqU4ZoPHz6kSpUqtG/f3sSWRYsWUalSJTZu3Ejz5s0BmDlz\nZjI/fFhYGB9++CE+Pj7UqlWLIUOGcOPGjWfepz5+ERISwrBhw6hZsyavvPIK3333HfHx8axZs4bW\nrVsb/lZCQkJMPv+8+9Rz5coVhg4dSp06dahXrx7fffcdsbGxyewJDw9nwoQJhvO1adOGX375Baks\nlDbExWThJCQksH//fuzs7HB3dzfs37hxI+XLl+fjjz/m7t27ODk5sX37dvz8/HB1dWXQoEEArFy5\nkt69e+Pv728YVAD+/fdf1q9fT8+ePXFxceG3336jb9++LFy4kLp16wKk6XxJ7WnYsCG2trZs27aN\nsWPHUrFixRTv7+rVq7z11lvExMTQo0cPXFxc2Lp1K59++imXLl3io48+Mhx77949+vTpQ5s2bejQ\noQO7du1iyZIl2NnZGY7bvXs3/fr1o1atWgwbNgydTseePXtYvnw54eHhTJ8+3ezv/saNG3Tr1g2A\n9957DxsbG5YuXUpAQECyY+Pi4vjss8949913efLkCbVr1yY8PJyuXbty/fp1unbtSrly5dizZw+T\nJ0/m5MmTTJs2jcaNG/P111+zd+9eKleuDEBQUBDx8fGcPXuW8PBwHB0dDffm5eVFvXr1GDt2LN98\n8w0tW7akZcuWODk5GWz5+OOP8fHx4cMPP+TcuXMsW7aMa9eusW7duufec//+/alduzZjxoxh69at\nLFy4kDNnznD69Gl69eqFpmnMmTOHYcOGsWnTJmxsbMy6T4C7d+/StWtXYmNj6dWrF3ny5GHZsmXc\nv3/fxIaoqCh69OjBzZs36datG8WLF2fv3r18/fXXXLp0ic8//9zs32GuRxNyPKNHj9Y8PDy0EydO\naGFhYVpYWJh2+/Zt7dChQ9r777+veXh4aF9//bXh+KZNm2qVKlXSbt26ZdgXGxurNW7cWHv11Ve1\nhw8fGvaHh4drvr6+mq+vr/bkyRPD5z08PLRt27YZjgsLC9N8fHy0t95664XOl9QeTdM0f39/zcPD\nQ7t69Wqye9UzfPhwrVKlStrx48cN++Lj47UBAwZonp6e2pkzZ0w+t3jxYpNrtGnTRmvUqJFhu0+f\nPlrTpk21mJgYk+PeeustrWbNmqnakRJjx47VqlSpop07d86w79atW5q3t7fJfenv86effjL5/KRJ\nk5J9z5qmaV988YXm4eGh7dy5U9M0TWvevLnWv39/w/tff/215uvrq3l4eGjbt2/XNE3ToqOjterV\nq2v+/v6apmna1atXNQ8PD8O2pmnaqlWrNA8PD23QoEEm1xszZozm4eGhXblyJdV71X926NChhn0R\nERGal5eXVqlSJcPvQdM0bcqUKZqHh4d28eLFNN3nt99+q3l6epr8ru/evau98soryb5PLy8vLSQk\nxOR8kydP1jw8PLRTp04Zjkv69yWYIi4mC+L111+nfv361K9fn0aNGvH222+zfft2evbsyciRI02O\ndXV1pVixYobtkydPcuvWLbp3707+/PkN+wsWLEiPHj0IDQ3l+PHjhv3ly5enRYsWhm0nJyc6duzI\nkSNHCAsLS/P5ktpjDvHx8ezcuZNGjRrh5eVl2G9lZcXAgQPRNI2///7b5DNt2rQx2a5UqRJ37941\nbP/000+sWrXKJJh///598ufPb5Ju+zw0TWP79u34+vqazNyKFStGhw4dUvxMnTp1TLb//vtv3N3d\nTb5ngMGDBwNqhgbQuHFjgoODDe6Yffv20aFDBwoXLkxwcDCgZhXR0dFmBaXbtWtnsl2tWjUA7ty5\n89zPJra1QIECODk5UbZsWZMZoD6RQn8+c+9z165dVKtWzeR37ezsnMzerVu34uHhgYuLC/fu3TO8\n9OffsWPHc+9DUIiLyYKYNGkSRYoUAdQgWbBgQdzd3bG3t092rLOzs8m23gddrly5ZMeWL18eUC4T\nfQZRhQoVkh3n5uaGpmlcv349zedLao853L9/n6ioqBSvoR+Ur1+/brI/sSsFwM7OjoSEBMO2tbU1\nV69eZfr06Zw7d44rV64QGhqaZtsePHjAgwcPKFu2bLL39PeflJR+J76+vsmOc3FxoWDBgoZ7a9y4\nMUuXLuXYsWOULVuWkJAQRowYwYULFwwCsXv3bpydnQ2D/bNI+h3lyZMHIEVff1L0f396bGxskt2X\ntbU1gOF7N/c+r1+/buKW1JP0+7xy5QrR0dGppkPfvHnzufchKEQgLIhatWolS3NNDf1/Uj3aM4J3\n+vdsbW0N+xL/rEf/BGttbZ3m8yW1xxyedQ394JM0rdfK6tmT5gULFvD9999Trlw5fHx8aNWqFTVq\n1GDJkiUpxg5SIy4uLsXrAykKdkq2Pe/+9N/fK6+8gr29PXv37uXOnTtYWVlRu3ZtLl68yA8//MDj\nx4/ZvXs3jRs3NiQsPIvnfUfPIqXf4/Ouae596nS6ZAkFKX0+Pj6e2rVr4+fnl+I5ixYt+kx7BCMi\nEAIApUqVAlTWTVIuXrwIQPHixQ37rly5kuy4y5cvY21tTenSpQ1Pm+ae70VwcnLCwcEh3a4RExPD\njBkzqFevHgsXLsTGxvjfIy3BaVCzAQcHBy5dupTsvcuXL5t1jlKlShnuIzF37twhMjKSEiVKAOoJ\n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\nlnhFtYQAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "run_simulation1(system)\n",
+ "plot_results(system, title='Proportional growth model')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.6.1"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/code/rabbits3mine.ipynb b/code/rabbits3mine.ipynb
new file mode 100644
index 00000000..2f0f4ebd
--- /dev/null
+++ b/code/rabbits3mine.ipynb
@@ -0,0 +1,703 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Modeling and Simulation in Python\n",
+ "\n",
+ "Rabbit example\n",
+ "\n",
+ "Copyright 2017 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline\n",
+ "\n",
+ "from modsim import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Rabbit is Rich\n",
+ "\n",
+ "This notebook starts with a version of the rabbit population growth model. You will modify it using some of the tools in Chapter 5. Before you attempt this diagnostic, you should have a good understanding of State objects, as presented in Section 5.4. And you should understand the version of `run_simulation` in Section 5.7.\n",
+ "\n",
+ "### Separating the `State` from the `System`\n",
+ "\n",
+ "Here's the `System` object from the previous diagnostic. Notice that it includes system parameters, which don't change while the simulation is running, and population variables, which do. We're going to improve that by pulling the population variables into a `State` object."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "