Skip to content

Instantly share code, notes, and snippets.

@NicolasHug
Last active May 2, 2016 11:46
Show Gist options
  • Save NicolasHug/fe661385b65d0856bc88d9cb24fef9ce to your computer and use it in GitHub Desktop.
Save NicolasHug/fe661385b65d0856bc88d9cb24fef9ce to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<script>\n",
"code_show=true; \n",
"function code_toggle() {\n",
" if (code_show){\n",
" $('div.input').hide();\n",
" } else {\n",
" $('div.input').show();\n",
" }\n",
" code_show = !code_show\n",
"} \n",
"$( document ).ready(code_toggle);\n",
"</script>\n",
"<form action=\"javascript:code_toggle()\"><input type=\"submit\" value=\"Click here to toggle on/off the raw code.\"></form>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import HTML\n",
"\n",
"HTML('''<script>\n",
"code_show=true; \n",
"function code_toggle() {\n",
" if (code_show){\n",
" $('div.input').hide();\n",
" } else {\n",
" $('div.input').show();\n",
" }\n",
" code_show = !code_show\n",
"} \n",
"$( document ).ready(code_toggle);\n",
"</script>\n",
"<form action=\"javascript:code_toggle()\"><input type=\"submit\" value=\"Click here to toggle on/off the raw code.\"></form>''')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from scipy.stats import norm\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib notebook"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Confidence interval, Besse Style : $P\\left(z_{\\frac{\\alpha}{2}} \\leq \\frac{\\bar{X_n} - \\mu}{\\sigma / \\sqrt{n}} \\leq z_{1 - \\frac{\\alpha}{2}} \\right) = 1 - \\alpha$\n",
"\n",
"We have $z_{\\frac{\\alpha}{2}} = - z_{1 - \\frac{\\alpha}{2}}$ because law is symetric"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython 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(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydB3hURffG3xRCbyEJvffeew29dxRQlA4akA6ifIAiKB1pAlJEpVdFwSAIKL33FpoIFnoVErLJ/0xMvn/MFyDZ2U3u3fvO85wny+aeuXN+c3Z5M3eKG1hIgARIgARIgARIgAQsRcDNUtEyWBIgARIgARIgARIgAVAAMglIgARIgARIgARIwGIEKAAt1uEMlwRIgARIgARIgAQoAJkDJEACJEACJEACJGAxAhSAFutwhksCJEACJEACJEACFIDMARIgARIgARIgARKwGAEKQIt1OMMlARIgARIgARIgAQpA5gAJkAAJkAAJkAAJWIwABaDFOpzhkgAJkAAJkAAJkAAFIHOABEiABEiABEiABCxGgALQYh3OcEmABEiABEiABEiAApA5QAIkQAIkQAIkQAIWI0ABaLEOZ7gkQAIkQAIkQAIkQAHIHCABEiABEiABEiABixGgALRYhzNcEiABEiABEiABEqAAZA6QAAmQAAmQAAmQgMUIUABarMMZLgmQAAmQAAmQAAlQADIHSIAESIAESIAESMBiBCgALdbhDJcESIAESIAESIAEKACZAyRAAiRAAiRAAiRgMQIUgBbrcIZLAiRAAiRAAiRAAhSAzAESIAESIAESIAESsBgBCkCLdTjDJQESIAESIAESIAEKQOYACZAACZAACZAACViMAAWgxTqc4ZIACZAACZAACZAABSBzgARIgARIgARIgAQsRoAC0GIdznBJgARIgARIgARIgAKQOUACJEACJEACJEACFiNAAWixDme4JGBhAuMl9nZiJcQeWZgDQycBEiABUAAyCUiABIxG4E1p0CKxfGKXYjTuNfl3F7FSYmnE/hLbKTZXbPtLAlHfd+vEHoi9Ec+gs8n108Tqiql6toj1F/stDvXkkmsmidURSyK2X2yI2KEYvlfk3zlivBcu/24l9m0c7sNLSIAESCDOBCgA44yKF5IACSQQASUAF4rlF4sSgO7yeoVYC7EvxL4TuyOWXewVsWZi6cUevqSNKeX3u8Q+jqwvLiEll4uOiz0Rez/SYaz8VO+r0UT1/vOKt/zihNh9sZGR1w6Sn+XEyoudi+Z4WV6fERsdozJ1jfJnIQESIAGHEaAAdBhKVkQCJOAgArEJwBFS9wdibcTW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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7f55c3aac3c8>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plt.figure()\n",
"x_min, x_max = (-4, 4)\n",
"x = np.arange(x_min, x_max, .01)\n",
"y = norm.pdf(x)\n",
"plt.plot(x, y)\n",
"\n",
"alpha = .05\n",
"\n",
"z_alpha_sur_2 = norm.ppf(alpha/2)\n",
"z_un_moins_alpha_sur_2 = norm.ppf(1 - alpha/2)\n",
"print(np.isclose(-z_alpha_sur_2, z_un_moins_alpha_sur_2))\n",
"\n",
"# fill left part\n",
"x = np.arange(x_min, z_alpha_sur_2, .01)\n",
"y = norm.pdf(x)\n",
"plt.fill_between(x, 0, y, alpha=.5)\n",
"\n",
"# fill right part\n",
"x = x = np.arange(-z_alpha_sur_2, x_max, .01)\n",
"y = norm.pdf(x)\n",
"plt.fill_between(x, 0, y, alpha=.5)\n",
"\n",
"# fill middle part\n",
"x = x = np.arange(z_alpha_sur_2, - z_alpha_sur_2, .01)\n",
"y = norm.pdf(x)\n",
"plt.fill_between(x, 0, y, alpha=.5, color='green')\n",
"\n",
"plt.annotate('$1 - \\\\alpha$', xy=(0, .3), xytext=(1.5, .35), arrowprops=dict(arrowstyle=\"->\"))\n",
"plt.annotate('$\\\\frac{\\\\alpha}{2}$', xy=(-2.5, .01), xytext=(-3, .05), arrowprops=dict(arrowstyle=\"->\"))\n",
"plt.annotate('$z_{\\\\frac{\\\\alpha}{2}}$', xy=(z_alpha_sur_2, .055), xytext=(z_alpha_sur_2-.5, .1), arrowprops=dict(arrowstyle=\"->\"))\n",
"plt.annotate('$z_{1 - \\\\frac{\\\\alpha}{2}}$', xy=(-z_alpha_sur_2, .055), xytext=(-z_alpha_sur_2, .1), arrowprops=dict(arrowstyle=\"->\"))\n",
"plt.annotate('$\\\\frac{\\\\alpha}{2}$', xy=(2.5, .01), xytext=(3, .05), arrowprops=dict(arrowstyle=\"->\"))\n",
"plt.title('IC à ' + str(1 - alpha))"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"Confidence interval, not Besse Style : $P\\left(z_{\\frac{1 - \\alpha}{2}} \\leq \\frac{\\bar{X_n} - \\mu}{\\sigma / \\sqrt{n}} \\leq z_{\\frac{1 + \\alpha}{2}} \\right) = \\alpha$\n",
"\n",
"We have $z_{\\frac{1 - \\alpha}{2}} = - z_{\\frac{1 + \\alpha}{2}}$ because law is symetric"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython 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(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydBXzV1fvHP2xjdDO6u7tzdDcoYFEylBAYIYqAIiApUgISFp0mDimV7u4SBZEGQdjY3f7PmdvvP+eA7Z57d7/xOa/X89rl7vuceJ/nXj47mQhMJEACJEACJEACJEACtiKQyFatZWNJgARIgARIgARIgARAAcggIAESIAESIAESIAGbEaAAtFmHs7kkQAIkQAIkQAIkQAHIGCABEiABEiABEiABmxGgALRZh7O5JEACJEACJEACJEAByBggARIgARIgARIgAZsRoAC0WYezuSRAAiRAAiRAAiRAAcgYIAESIAESIAESIAGbEaAAtFmHs7kkQAIkQAIkQAIkQAHIGCABEiABEiABEiABmxGgALRZh7O5JEACJEACJEACJEAByBggARIgARIgARIgAZsRoAC0WYezuSRAAiRAAiRAAiRAAcgYIAESIAESIAESIAGbEaAAtFmHs7kkQAIkQAIkQAIkQAHIGCABEiABEiABEiABmxGgALRZh7O5JEACJEACJEACJEAByBggARIgARIgARIgAZsRoAC0WYezuSRAAiRAAiRAAiRAAcgYIAESIAESIAESIAGbEaAAtFmHs7kkQAIkQAIkQAIkQAHIGCABEiABEiABEiABmxGgALRZh7O5JEACJEACJEACJEAByBggARIgARIgARIgAZsRoAC0WYezuSRAAiRAAiRAAiRAAcgYIAESIAESIAESIAGbEaAAtFmHs7kkQAIkQAIkQAIkQAHIGCABEiABEiABEiABmxGgALRZh7O5JGBjAuOl7R3ESondtzEHNp0ESIAEQAHIICABEjAagVekQgvFCoidj1G5F+TfXcXKiKUW+1Nsq9gcsS3PaIj6vlsjdk/s5Xg2Ooc8P1WsvpjKZ4NYf7Hf4pBPHnlmklg9scRiu8UGi+2L4XtR/p0rxnvh8u82Yl/HoRw+QgIkQAJxJkABGGdUfJAESCCBCCgBuECsoFiUAPSS18vEWol9Kvat2C2xnGLPibUQSyf21zPqmEJ+v01sXGR+cWlSMnnosNhDsbcjHcbIT/W+Gk1U7z8ppZdfHBG7KzYi8tlA+VlBrKLYqWiOF+T1CbFRMTJTzyh/JhIgARJwGQEKQJehZEYkQAIuIhCbABwueb8r1k5sbSzl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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7f55c3b04128>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plt.figure()\n",
"x_min, x_max = (-4, 4)\n",
"x = np.arange(x_min, x_max, .01)\n",
"y = norm.pdf(x)\n",
"plt.plot(x, y)\n",
"\n",
"alpha = .95\n",
"\n",
"z_un_moins_alpha_le_tout_sur_deux = norm.ppf((1 -alpha)/2)\n",
"z_un_plus_alpha_le_tout_sur_deux = norm.ppf(1 + alpha/2)\n",
"print(np.isclose(-z_alpha_sur_2, z_un_moins_alpha_sur_2))\n",
"\n",
"# fill left part\n",
"x = np.arange(x_min, z_un_moins_alpha_le_tout_sur_deux, .01)\n",
"y = norm.pdf(x)\n",
"plt.fill_between(x, 0, y, alpha=.5)\n",
"\n",
"# fill right part\n",
"x = x = np.arange(-z_un_moins_alpha_le_tout_sur_deux, x_max, .01)\n",
"y = norm.pdf(x)\n",
"plt.fill_between(x, 0, y, alpha=.5)\n",
"\n",
"# fill middle part\n",
"x = x = np.arange(z_un_moins_alpha_le_tout_sur_deux, - z_un_moins_alpha_le_tout_sur_deux, .01)\n",
"y = norm.pdf(x)\n",
"plt.fill_between(x, 0, y, alpha=.5, color='green')\n",
"\n",
"plt.annotate('$\\\\alpha$', xy=(0, .3), xytext=(1.5, .35), arrowprops=dict(arrowstyle=\"->\"))\n",
"plt.annotate('$\\\\frac{1 - \\\\alpha}{2}$', xy=(-2.5, .01), xytext=(-3, .05), arrowprops=dict(arrowstyle=\"->\"))\n",
"plt.annotate('$\\\\frac{1 - \\\\alpha}{2}$', xy=(2.5, .01), xytext=(3, .05), arrowprops=dict(arrowstyle=\"->\"))\n",
"plt.annotate('$z_{\\\\frac{1 - \\\\alpha}{2}}$', xy=(z_un_moins_alpha_le_tout_sur_deux, .055), xytext=(z_un_moins_alpha_le_tout_sur_deux-.5, .1), arrowprops=dict(arrowstyle=\"->\"))\n",
"plt.annotate('$z_{\\\\frac{1 + \\\\alpha}{2}}$', xy=(-z_un_moins_alpha_le_tout_sur_deux, .055), xytext=(-z_un_moins_alpha_le_tout_sur_deux, .1), arrowprops=dict(arrowstyle=\"->\"))\n",
"plt.title('IC à ' + str(alpha))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" 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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython 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(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Curve follows y = x, which is exactly what we want to illustrate\n"
]
}
],
"source": [
"n = 100\n",
"alphas = np.arange(.01, .99, .05)\n",
"prop = []\n",
"\n",
"def conf_interval(n, sigma, mu_est, alpha):\n",
" '''Intervalle de confiance pour sigma connu'''\n",
" margin = norm.ppf(1 - alpha/2) * sigma/np.sqrt(n)\n",
" return mu_est - margin, mu_est + margin\n",
"\n",
"for alpha in alphas:\n",
" sigma = np.random.random() # true std dev\n",
" mu = np.random.random() # true mean\n",
"\n",
" # Estimer mu et calculer l'intervalle de confiance.\n",
" # Dans (1 - alpha)% des cas, la vraie valeur mu doit être contenue dans l'intervalle\n",
" mu_in_interval = 0\n",
" for _ in range(1000):\n",
" pop = np.random.normal(mu, sigma, n)\n",
" mu_est = np.mean(pop)\n",
" l, u = conf_interval(n, sigma, mu_est, alpha)\n",
" if l <= mu <= u:\n",
" mu_in_interval += 1\n",
"\n",
" prop.append(mu_in_interval / 1000) # proportion of times the confidence interval contained the true mean\n",
"\n",
"plt.figure()\n",
"plt.plot(1 - alphas, prop)\n",
"plt.title('Illustration of confidence interval for $\\\\mu$ when $\\\\sigma$ is known')\n",
"plt.xlabel('$1 - \\\\alpha$')\n",
"plt.ylabel('Proportion of times when $\\\\mu \\\\in$ CI')\n",
"print('Curve follows y = x, which is exactly what we want to illustrate')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment