{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib notebook\n",
    "\n",
    "### Voici le principe de fonctionnement de ce \"notebook\" :\n",
    "###   + pour sauter une ligne dans une cellule, appuyer sur Enter\n",
    "###   + pour exécuter le contenu d'une cellule, appuyer sur Shift + Enter\n",
    "###\n",
    "### Les consignes de ce TP sont les suivantes :\n",
    "###   + Le but de ce TP est de modifier les trois fonctions\n",
    "###                         coordonnees_aiguille_secondes\n",
    "###                         coordonnees_aiguille_minutes\n",
    "###                         coordonnees_aiguille_heures\n",
    "###     de manière à ce que l'affichage de l'horloge soit correct\n",
    "###   + Dans un premier temps, exécuter, dans l'ordre, toutes les cellules.\n",
    "###   + Trois horloges apparaissent :\n",
    "###                         la première devra afficher l'heure au moment où elle a été exécutée\n",
    "###                         la deuxième devra afficher 12h15 et 30 secondes\n",
    "###                         la dernière devra afficher l'heure courante et les aiguilles devront se déplacer\n",
    "###   + Pour l'instant, les trois horloges sont identiques et les aiguilles sont mal placées.\n",
    "###   + Pour chacune des trois fonctions, remplacer uniquement les deux lignes x = ... et y = ...\n",
    "###   + Vous pouvez utiliser pi et les fonctions cos et sin.\n",
    "###   + Les coordonnées (x, y) doivent se trouver sur le cercle trigonométrique.\n",
    "###   + La variable h est un entier entre 0 et 11, les variables m et s sont des entiers entre 0 et 59.\n",
    "###   + Il est conseillé de commencer par l'aiguille des secondes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from math import pi, cos, sin\n",
    "\n",
    "\n",
    "def coordonnees_aiguille_secondes(h, m, s):\n",
    "    # À modifier\n",
    "    x = 1\n",
    "    y = 0\n",
    "    return (x, y)\n",
    "\n",
    "def coordonnees_aiguille_minutes(h, m, s):\n",
    "    # À modifier\n",
    "    x = 0\n",
    "    y = 1\n",
    "    return (x, y)\n",
    "\n",
    "def coordonnees_aiguille_heures(h, m, s):\n",
    "    # À modifier\n",
    "    x = -1\n",
    "    y = 0\n",
    "    return (x, y)\n",
    "\n",
    "# Ne pas modifier ceci !\n",
    "import dessin_horloge\n",
    "from dessin_horloge import horloge, horloge_animee\n",
    "\n",
    "dessin_horloge.init(coordonnees_aiguille_secondes,\n",
    "                    coordonnees_aiguille_minutes,\n",
    "                    coordonnees_aiguille_heures)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "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 = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, 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\", \"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 overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        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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\" width=\"400\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "horloge()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "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 = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, 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\", \"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 overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        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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\" width=\"400\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "horloge('12:15:30')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "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 = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, 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\", \"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 overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        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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\" width=\"400\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "animation = horloge_animee()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "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.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
