From 63886e120cbf2665d57d8f2e95d897aefd0e5dbf Mon Sep 17 00:00:00 2001 From: 26c634550904aba62520384fc8aa7dec <26c634550904aba62520384fc8aa7dec@app-learninglab.inria.fr> Date: Fri, 24 Apr 2020 14:02:18 +0000 Subject: [PATCH] Version finale --- module3/exo3/exercice.ipynb | 11074 ++++++++++++++++++++++++++++++++-- 1 file changed, 10615 insertions(+), 459 deletions(-) diff --git a/module3/exo3/exercice.ipynb b/module3/exo3/exercice.ipynb index 658d6ba..e26724c 100644 --- a/module3/exo3/exercice.ipynb +++ b/module3/exo3/exercice.ipynb @@ -14,6 +14,14 @@ "### Version 1 - Avril 2020" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "J'utilise pour matplotlib le mode de visualisation \"notebook\" qui permet d'interagir directement avec les figures (zoom par exemple) plutot qu' \"inline\" proposé dans ce cours.\n", + "Pour le 2D, ca n'a pas grand intéret, on peut donc désactiver manuellement cette fonction." + ] + }, { "cell_type": "code", "execution_count": 1, @@ -24,7 +32,7 @@ "outputs": [], "source": [ "# Importation des librairies\n", - "%matplotlib inline\n", + "%matplotlib notebook\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd" @@ -532,213 +540,1604 @@ "outputs": [ { "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " 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", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " 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= 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": [ + "" ] }, - "execution_count": 9, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" }, { "data": { - "image/png": "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IrfeeiuVlZXsu+++m09sX3LJJfTv359+/foxYsQIKisr819gESk7Jf1M6iFDhnjNBwZlrhAqZWvWrGGnnXbi008/ZcSIEUyYMIFBgwYVOqyclMPvL9JYsl3Smu/9sJnNdvchtS1X3ucgStT48eOZN28e69atY9y4cSWTHESkvChBFKG777670CGIiOgchIiIpFOCEBGRVEoQIiKSSglCRERSlX2CyNZ7Yn2H2uTa1fe0adM49thjG6SMDz74IPPmzUudd+WVV9K9e3cGDhxIv379mDp1aupyU6dO5ZprrmmQeESkPJR9gsi3QnT1va0EASFpVVVVMXnyZM466yw2bdq01fyNGzcyevRoLr/88gaNS0RKmxJEA8ulq+/99tsPCDfE/cu//At9+vThtNNO23yzzOzZsznkkEMYPHgwRx55JIsXLwbglltuYf/996eyspKTTjqJTz/9lOnTpzN16lQuueQSBg4cyIIFC7LG1rdvX5o3b87y5cs544wzuPDCCznssMO47LLLuP322zn33HMBWLJkCSeccAKVlZVUVlZuLs9dd93F0KFDGThwIN/73vf4/POS7ZFdRHKgBNHA0rr6HjZsGDNmzGDWrFkMGDCAli1bAvDSSy9xww03MG/ePN5++22ee+45NmzYwHnnnceUKVOYPXs2Z511Fj/96U8BOPHEE3nhhReYM2cOffv25dZbb+Wggw5i9OjRXHvttVRVVbHnnntmjW3mzJk0a9aMzJP43njjDR577DGuu+66rZY7//zzOeSQQ5gzZw4vvvgi++67L/Pnz2fSpEk899xzVFVVUVFRwcSJExvpVxSRYqAb5RpBbV19ZwwdOpQePXoAMHDgQN555x123nlnXn31VUaNGgXA559/TteuXQF49dVX+dd//VdWrlzJmjVrOPLII3OK57e//S133XUXbdu2ZdKkSZvPpZx88slUVFR8YfknnniCO++8E4CKigrat2/Pn/70J2bPns3+++8PwNq1a+nSpUs9fyERKQVKEI2gtq6+M1q1arV5vKKigo0bN+Lu7LvvvsyYMeML6z3jjDN48MEHqays5Pbbb2fatGk5xXPBBRdw8cUXf2H6jjvumHOZ3J1x48bxy1/+MufPiEhpUxNTI6itq+9t2XvvvVm2bNnmBLFhw4bNJ7lXr15N165d2bBhw1bNO23btmX16tUNFv/I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\n", + "text/html": [ + "" + ], "text/plain": [ - "
" + "" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" - } - ], - "source": [ - "x=list(raw_data[\"Year\"])\n", - "y_wages=list(raw_data[\"Wages\"])\n", - "y_wheat=list(raw_data[\"Wheat\"])\n", - "graphique2 = plt.figure()\n", - "ax_2_1 = graphique2.add_subplot(111)\n", - "ax_2_1.set(xbound=[1550,1850],ybound=[0,100],ylabel=\"Shillings\",xlabel=\"Year\",Title=\"Evolution of wheat prices and wages\")\n", - "ax_2_1.xaxis.set_major_locator(plt.MultipleLocator(50))\n", - "ax_2_1.bar(x,y_wheat,width=5, color=\"black\",label=\"Wheat Price\")\n", - "ax_2_1.plot(x,y_wages,color=\"red\",label=\"Wages\")\n", - "ax_2_1.fill_between(x,y_wages,0,color=\"blue\")\n", - "ax_2_1.legend()\n", - " \n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "hideCode": false, - "hidePrompt": false - }, - "source": [ - "Le bleu du remplissage entre la ligne rouge des salaires et l'axe est masqué par le noir de l'histogramme !!\n", - "J'ai trouvé une méthode dans la doc en ligne de matplotlib pour faire un diagramme en barre avec un gradient de couleur (ce qui pourrait permettre de se rapprocher de la version originale) mais ca me parait bien compliqué à implanter\n", - "[doc matplotlib](https://matplotlib.org/gallery/lines_bars_and_markers/gradient_bar.html#sphx-glr-gallery-lines-bars-and-markers-gradient-bar-py)\n", - " \n", - " \n", - "Je tente donc une méthode alternative sans utiliser le style \"bar\"." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "hideCode": false, - "hidePrompt": false - }, - "outputs": [ + }, { "data": { "text/plain": [ - "" + "array([,\n", + " ],\n", + " dtype=object)" ] }, - "execution_count": 10, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" - }, - { - "data": { - "image/png": "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88gjj3D99dczZswYxo4d23TC++abb2bChAmcffbZjBgxommeadOm8eMf/5jjjjtOJ6lFpNPk9DOpx48f780fGPT2229z9NFHRxRR9tJ2Ecku06dPJ90TMVevXs3dd9/dpes2s0XuPr616VSDEBGRtJQgREQkLSUIERFJSwlCRETSUoIQEZG0lCBERCQtJYgucO211+5xF/fkyZP50pe+1PT9uuuu45ZbbokiNBGRNlOC6AJt6e574sSJUYUnItImShBdoC3dfR999NGceeaZjBs3jmOOOYa5c+c2zX/zzTczYsQIzj77bC699FJ+8pOfALBy5UrOOeccjj/+eE499VSWL18OwMMPP8zo0aMZM2YMkyZNynyBRSQv5XVnfVxzDXRyd9+MHQud0N13jx49eOyxx+jVq1dTlxznnXceixYtYvbs2bz++uvE43HGjRvH8ccfD8CMGTO47bbbOPLII1mwYAFf/epXee6557jpppt4+umnGTRoENu2bevc8opIt5XfCSJCrXX37e585zvf4YUXXqCgoIB169axceNGXnrpJaZMmUJZWRkA5557LgA1NTXMnz+fiy66qGkddXV1TeuaPn06F198MVOnTs18YUUkL+V3gsji7r7vvfdeqqqqWLRoEUVFRZSXl1NbW0tLfWMlk0kOOOCAtA9Auu2221iwYAFPPvkkY8eOZfHixRx00EFdXUQRyXM6B9FFWuvu+8MPP+Tggw+mqKiIv/71r7z//vsAfOxjH+MPf/gDtbW11NTU8OSTTwLQq1cvhg0bxsMPPwyAu/PGG28AwbmJCRMmcNNNN9G3b1/Wrl0bTaFFJK8oQXSR1rr7vuyyy1i4cCHjx4/n3nvvbeq++4QTTuC8885jzJgxTJ06lfHjx9O7d28A7r33Xu68807GjBnDqFGjmk5sf+tb3+KYY45h9OjRTJo0iTFjxmS+wCKSd/K7iSlCsViM7du37zEstQvfvn37pn1qHMA3v/lNbrzxRnbu3MmkSZO47rrrABg2bBhPPfXUXtM/+uijnRe4iEhICSILzZgxg2XLllFbW8sVV1zBuHHjog5JRLohJYgsdN9990UdgohIfp6DyOWn5HUFbQ8R6Yi8SxClpaVs2bJFO8WQu7NlyxZKS0ujDkVEckzeNTENHjyYiooKqqqqog4la5SWljJ48OCowxCRHJN3CaKoqIhh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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" } ], "source": [ - "x=list(raw_data[\"Year\"])\n", - "y_wages=list(raw_data[\"Wages\"])\n", - "y_wheat=list(raw_data[\"Wheat\"])\n", - "zero=[0 for i in x]\n", - "graphique3 = plt.figure()\n", - "ax_3_1 = graphique3.add_subplot(111)\n", - "ax_3_1.set(xbound=[1550,1850],ybound=[0,100],ylabel=\"Shillings\",xlabel=\"Year\",Title=\"Evolution of wheat prices and wages\")\n", - "ax_3_1.xaxis.set_major_locator(plt.MultipleLocator(50))\n", - "ax_3_1.plot(x,zero,color=\"black\",label=\"Wheat\")\n", - "ax_3_1.plot(x,y_wages,color=\"red\",label=\"Wages\")\n", - "ax_3_1.fill_between(x,y_wheat,0,color=\"black\",step=\"mid\",alpha=0.5)#alpha permet d'avoir un remplissage semi-transparent\n", - "ax_3_1.fill_between(x,y_wages,0,color=\"blue\")\n", - "ax_3_1.legend(loc='upper left')\n" + "sorted_data.plot(title= \"Evolution des salaires et du prix du blé\")\n", + "sorted_data.plot(subplots=True,title= [\"Evolution du prix du blé\", \"Evolution des salaires\"])" ] }, { @@ -748,14 +2147,13 @@ "hidePrompt": false }, "source": [ - "### Deuxième exercice\n", - "Il s'agit maintenant d'avoir 2 axes Y différents pour les courbes.\n", - "Pour cela, je vais encore m'inspirer de la doc de [matplotlib](https://matplotlib.org/gallery/subplots_axes_and_figures/two_scales.html#sphx-glr-gallery-subplots-axes-and-figures-two-scales-py) " + "On va maintenant essayer de travailler sur le graphique pour arriver à avoir ce que l'on veut !\n", + "Après beaucoup de labeur, j'ai réussi à modifier certains élements du graphique grace au code ci-dessous.\n" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "metadata": { "hideCode": false, "hidePrompt": false @@ -763,106 +2161,812 @@ "outputs": [ { "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " 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", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " 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= 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": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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0WeesWPHaqNGjfTo0aOlrv/nP/9RQNeuXVumzD333KOArl+/vlwbpk2bplFRUepyuQK/gRBz66236ieffBJwOfdns8PLA8flcmnz5s31yiuvdFzfhAkTtG7dutqzZ08dMGBAwPaEmjvvvFOjoqL00KFDqqq6aNEiBfSLL74Is2XVmG3bVFu3Vm3eXPXnn8vN/sknnyigd999d6nrixYt0tjYWO3Xr58ePnxYVVWLi4v10Ucf1cjISE1JSdFly5bpzTffrIDOmzfPa/1z585VQJ9//vkK31p1JMTi9L2fY57TesIuMBU5KlOcioqKtH///gpo69at9ddffy2TZ9++fRoTE6M333xzmbS9e/dqVFSUTp06tdT13NxcbdiwoV588cWO7HjiiScU0N9++y24GwkRe/fuVUBHjBgRcNmJEydqkyZNfAruZZddpm3atHEkyLt379bo6Gi98cYbdfLkyVq3bl0tLi4O2KZQ0qdPHz3jjDNKznfv3q2APvfcc2G0qhqze7dqhw6qCQmqP/5YbvacnBxt1qyZpqamenWVfvrppxoZGanDhw/X7du361lnnaWAjh07Vg/arsL8/Hzt2LGjtmvXrsx3zeVy6eDBg7VNmza1stekGmJxqqTDdwI8Y7/OAT498Qi34VrJ4vTwww8roA888IA2bNhQu3Tponv37i2V55lnnlFAf/TxBRo1apS2aNFCi4qKSq7dd999Cui6desc2fHaa68poL/88kvwNxMC3L9U4+Pj9fjx4wGVTU1N1XPPPddn+vPPP6+Abtmypdy6pk2bphEREbplyxadOXOmApqenh6QPaEkJydHRUQfeeSRkmsul0vj4uJ08uTJQdf77rvv6ty5cyvDxOrF/v2q3bur1qununRpudldLpdedNFFGhMT4/c79frrryugkZGRGhcXp6+++mqZHz9Lly7ViIgInThxYqnrbtf9f/7zn+DuqQYQ4p7TWfbrGK9HJYhTH/t1qLcjZDcWBnFavXq1RkVF6dixY1VVdcGCBVqnTh0dMGCA5uXlqar1pejevbv269fPZz3vv/++AvrVV1+p6u+9pjFjxji2xS0CK1asqMAdVT533HFHyTiPE/ekm4KCAo2KitJp06b5zJOenq6Avvrqq37rOnTokMbHx5f0Qn/88UcF9H//+59je0LN22+/rYAuX7681PXu3bvryJEj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KLt37wbgvffeY8WKFTz22GMkJycHdazrr7+eEydO8M9//rPMbbKysti2bVvAXXoQWHDytYZKG8Lv06BBA3r16hXQoIglS5bQqFGjwiDavXt34mJjOTR/Ptx8s2sljR4Nyckwezbs2wdTp4J3H68mjBs3jqNHj/LUU0+xefNmnnvuuRLbrFq1ioYNG9KtW7caK4cJEZEURM4Pap+KJt8DpuFG6232PqcAnwU6eV9NLtE68auq6sCBA0ukJK+qAwcO6BVXXKGADh06VLOysnT37t06YMAABfTWW2/VnJwcffvttxXQlStXVnjMkSNHanJysp599tk6aNCgai1vsD755JPCXFO5ubnarVs37dSpk54+fTroY+Xl5WmLFi302muvLXOb999/XwFdunRpwMctKCjQpKSkMlNrqKpeddVV2rVr1wqPNXbsWI2NjdUffvih3POlpaXpdddd51Z8953q5Mm6IyHBzfvcsKHqvfe6RIAhsnr1ahURHT16tKqqDhkyRH/0ox+VSNJ43nnnRczs/NGG0GTCXa7QUKGJwm6FzxUmB7p/IMHpC+91rd+6L2u8YnU8OF177bV6zjnnVNvxlixZos2bN9eEhASdPn16kdQDubm5hYnsOnXqpEOGDNH4+PgKZx1XVZ07d67ipbcOd56hH374QUVEH3vsMZ01a5YCOn/+/Eof79e//rXWr19fv//++1K/f+KJJ1REgk7+d/755+tVV11V6nf5+fnapEkTveOOOyo8zuLFixXQJUuWlLnNli1bFNDp06admSkcdEfz5vr/EhI0r4y61ZS8vDy94IILtGXLloX/rrt27dLExMQifwgcO3ZMRUQnTJgQ0vLVFSEKTmu91zsUJnjvqy+fE7AalxjQF6Sa+QeqcC7RHJzuuOMObdGiRanfzZ8/X0eOHKnLly8vN/9QQUGBrl69Wu+8804FtFu3brp+/foyt1++fLm2bt1aAe3fv39A5dyxY4cC2rVr10rnQqpO6enpevnll2urVq20X79+Vcr/48v6+9JLL5X6/dVXXx1QC6e4a6+9tsyMuZs2bVICzJibnZ2t9erV0wcffLDMbZ5//nlNAz1x8cXuv/vgwapfflmYa2vjxo1Bl78qpk6dqoDOmzevyPqnnnpK8cto7GuVfvDBByEtX10RouC0XqGlwhJ1099Ve3D6JW7eu0zgSdwDuMNr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\n", - "text/plain": [ - "
" + "" ] }, - "metadata": { - "needs_background": "light" + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] }, + "metadata": {}, "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "graphique6 = plt.figure()\n", - "ax_6_1 = graphique6.add_subplot(111)\n", - "ax_6_1.set(xbound=[1550,1850],ylim=[0,100],ylabel=\"Wheat Price (shilling per 1/4 bushel)\",xlabel=\"Year\",Title=\"Evolution of wheat prices and wages\")\n", - "ax_6_1.xaxis.set_major_locator(plt.MultipleLocator(50))\n", - "\n", - "\n", - "ax_6_1.plot(x,zero,color=\"red\",label=\"Wages\")\n", - "ax_6_1.plot(x,y_wheat,color=\"black\",label=\"Wheat\")\n", - "\n", - "#ax_6_1.fill_between(x,y_wheat,0,color=\"black\",alpha=0.65)#alpha permet d'avoir un remplissage semi-transparent\n", - "\n", - "ax_6_2=ax_6_1.twinx()\n", - "ax_6_2.plot(x,y_wages,color=\"red\",label=\"Wages\")\n", - "#ax_6_2.fill_between(x,y_wages,0,color=\"blue\",alpha=0.25)\n", - "ax_6_2.set_ylabel(\"Wages (shilling per week)\", color=\"red\")\n", - "#ax_6_2.set_ylim(0,100)\n", - "ax_6_2.tick_params(axis='y', labelcolor=\"red\")\n", - "ax_6_1.legend(loc='upper left')" + "x=list(raw_data[\"Year\"])\n", + "y_wages=list(raw_data[\"Wages\"])\n", + "y_wheat=list(raw_data[\"Wheat\"])\n", + "graphique2 = plt.figure()\n", + "ax_2_1 = graphique2.add_subplot(111)\n", + "ax_2_1.set(xbound=[1550,1850],ybound=[0,100],ylabel=\"Shillings\",xlabel=\"Year\",Title=\"Evolution of wheat prices and wages\")\n", + "ax_2_1.xaxis.set_major_locator(plt.MultipleLocator(50))\n", + "ax_2_1.bar(x,y_wheat,width=5, color=\"black\",label=\"Wheat Price\")\n", + "ax_2_1.plot(x,y_wages,color=\"red\",label=\"Wages\")\n", + "ax_2_1.fill_between(x,y_wages,0,color=\"blue\")\n", + "ax_2_1.legend()\n", + " \n" ] }, { @@ -935,15 +3814,17 @@ "hidePrompt": false }, "source": [ - "### 3eme exercice\n", - "On va maintenant passer au troisième exercice\n", - "\n", - "Dans un premier temps, on va calculer le pouvoir d'achat (en boisseau par semaine)." + "Le bleu du remplissage entre la ligne rouge des salaires et l'axe est masqué par le noir de l'histogramme !!\n", + "J'ai trouvé une méthode dans la doc en ligne de matplotlib pour faire un diagramme en barre avec un gradient de couleur (ce qui pourrait permettre de se rapprocher de la version originale) mais ca me parait bien compliqué à implanter\n", + "[doc matplotlib](https://matplotlib.org/gallery/lines_bars_and_markers/gradient_bar.html#sphx-glr-gallery-lines-bars-and-markers-gradient-bar-py)\n", + " \n", + " \n", + "Je tente donc une méthode alternative sans utiliser le style \"bar\"." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 10, "metadata": { "hideCode": false, "hidePrompt": false @@ -951,24 +3832,3391 @@ "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " 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= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "graphique4 = plt.figure()\n", + "ax_4_1 = graphique4.add_subplot(111)\n", + "ax_4_1.set(xbound=[1550,1850],ybound=[0,100],ylabel=\"Wheat Price (shilling per 1/4 bushel)\",xlabel=\"Year\",Title=\"Evolution of wheat prices and wages\")\n", + "ax_4_1.xaxis.set_major_locator(plt.MultipleLocator(50))\n", + "\n", + "ax_4_1.plot(x,zero,color=\"red\",label=\"Wages\")\n", + "ax_4_1.plot(x,zero,color=\"black\",label=\"Wheat\")\n", + " \n", + "ax_4_1.fill_between(x,y_wheat,0,color=\"black\",step=\"mid\",alpha=0.65)#alpha permet d'avoir un remplissage semi-transparent\n", + "\n", + "ax_4_2=ax_4_1.twinx()\n", + "ax_4_2.plot(x,y_wages,color=\"red\",label=\"Wages\")\n", + "ax_4_2.fill_between(x,y_wages,0,color=\"blue\",alpha=0.25)\n", + "ax_4_2.set_ylabel(\"Wages (shilling per week)\", color=\"red\")\n", + "ax_4_2.tick_params(axis='y', labelcolor=\"red\")\n", + "ax_4_1.legend(loc='upper left')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hideCode": false, + "hidePrompt": false + }, + "source": [ + "Si j'essaie de mettre la meme échelle à droite et à gauche pen utilisant l'attribut ybound, ca ne fonctionne pas !!\n", + "En fait il faut utiliser à la place l'attribut ylim." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "hideCode": false, + "hidePrompt": false + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " 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", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " 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= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "graphique6 = plt.figure()\n", + "ax_6_1 = graphique6.add_subplot(111)\n", + "ax_6_1.set(xbound=[1550,1850],ylim=[0,100],ylabel=\"Wheat Price (shilling per 1/4 bushel)\",xlabel=\"Year\",Title=\"Evolution of wheat prices and wages\")\n", + "ax_6_1.xaxis.set_major_locator(plt.MultipleLocator(50))\n", + "\n", + "\n", + "ax_6_1.plot(x,zero,color=\"red\",label=\"Wages\")\n", + "ax_6_1.plot(x,y_wheat,color=\"black\",label=\"Wheat\")\n", + "\n", + "#ax_6_1.fill_between(x,y_wheat,0,color=\"black\",alpha=0.65)#alpha permet d'avoir un remplissage semi-transparent\n", + "\n", + "ax_6_2=ax_6_1.twinx()\n", + "ax_6_2.plot(x,y_wages,color=\"red\",label=\"Wages\")\n", + "#ax_6_2.fill_between(x,y_wages,0,color=\"blue\",alpha=0.25)\n", + "ax_6_2.set_ylabel(\"Wages (shilling per week)\", color=\"red\")\n", + "#ax_6_2.set_ylim(0,100)\n", + "ax_6_2.tick_params(axis='y', labelcolor=\"red\")\n", + "ax_6_1.legend(loc='upper left')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hideCode": false, + "hidePrompt": false + }, + "source": [ + "### 3eme exercice\n", + "On va maintenant passer au troisième exercice\n", + "\n", + "Dans un premier temps, on va calculer le pouvoir d'achat (en boisseau par semaine)." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "hideCode": false, + "hidePrompt": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "
\n", + " \n", + " \n", " \n", " \n", " \n", @@ -1023,196 +7271,3324 @@ "" ], "text/plain": [ - " Unnamed: 0 Year Wheat Wages pruchasing_power\n", - "0 1 1565 41.0 5.00 0.030488\n", - "1 2 1570 45.0 5.05 0.028056\n", - "2 3 1575 42.0 5.08 0.030238\n", - "3 4 1580 49.0 5.12 0.026122\n", - "4 5 1585 41.5 5.15 0.031024" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "raw_data[\"pruchasing_power\"]=raw_data[\"Wages\"]/(4*raw_data[\"Wheat\"])\n", - "raw_data.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "hideCode": false, - "hidePrompt": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" + " Unnamed: 0 Year Wheat Wages pruchasing_power\n", + "0 1 1565 41.0 5.00 0.030488\n", + "1 2 1570 45.0 5.05 0.028056\n", + "2 3 1575 42.0 5.08 0.030238\n", + "3 4 1580 49.0 5.12 0.026122\n", + "4 5 1585 41.5 5.15 0.031024" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "raw_data[\"pruchasing_power\"]=raw_data[\"Wages\"]/(4*raw_data[\"Wheat\"])\n", + "raw_data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "hideCode": false, + "hidePrompt": false + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " 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", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " 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= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from scipy.signal import savgol_filter\n", + "power_fit2 = savgol_filter(tuple(y_purchasing[:-3]), 21, 5) # window size 51, polynomial order 3\n", + "\n", + "\n", + "graphique8 = plt.figure()\n", + "ax_8_1 = graphique8.add_subplot(111)\n", + "ax_8_1.set(xbound=[1550,1850],ylabel=\"Purchasing Power( bushel per week)\",xlabel=\"Year\",Title=\"Evolution of the purchasing power\")\n", + "ax_8_1.xaxis.set_major_locator(plt.MultipleLocator(50))\n", + "ax_8_1.plot(x,y_purchasing,'o',color=\"blue\")\n", + "ax_8_1.plot(x[:-3],power_fit2,color=\"blue\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Dans cette dernière partie, on va tracer un graphique 2D sans l'axe du temps." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " 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", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " 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= 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": [ - "[Text(0,0.5,'Wages (shilling per week)'),\n", - " Text(0.5,0,'Wheat Price (shilling per 1/4 bushel)')]" + "" ] }, - "execution_count": 17, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" }, { "data": { - "image/png": "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\n", + "text/html": [ + "" + ], "text/plain": [ - "
" + "" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" - } - ], - "source": [ - "graphique9 = plt.figure()\n", - "ax_9_1 = graphique9.add_subplot(111)\n", - "ax_9_1.plot(y_wheat,y_wages)\n", - "ax_9_1.set(xlabel=\"Wheat Price (shilling per 1/4 bushel)\",ylabel=\"Wages (shilling per week)\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Je ne trouve pas ce graphique très clair... \n", - "Une première idée pour réintroduire le temps dans ce graphique est de colorer la courbe en fonction du temps.\n", - "Encore une fois, je vais m'inspirer d'un exemple de la documentation de [matplotlib](https://matplotlib.org/gallery/lines_bars_and_markers/multicolored_line.html#sphx-glr-gallery-lines-bars-and-markers-multicolored-line-py)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ + }, { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" } ], "source": [ @@ -1252,30 +10628,810 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " 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", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('
Unnamed: 0Year