{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2aed4ec6-c20c-48db-a269-9353d3706be3",
   "metadata": {},
   "source": [
    "# Module `matplotlib`\n",
    "\n",
    "C'est le module de tracé qu'il faut connaitre. D'autres modules comme `seaborn` sont plus adaptés aux statistiques mais reposent sur `matplotlib`. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "59250848-1820-4124-bdaf-745387e2c288",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7439939d-bcd6-4dc5-87df-d237cf6189cb",
   "metadata": {},
   "source": [
    "## Figure et axes\n",
    "\n",
    "On recommande d'utiliser `plt.subplots` pour initialiser un objet `Figure` et des objets `Axes`. \n",
    "- `Figure` est l'objet global qui contient une liste d'`Axes` et le titre\n",
    "- `Axes` est un objet qui représente un dessin avec ses axes (`ax.xaxis` et `ax.yaxis`), sa grille `ax.grid` et les différents tracés (courbes, nuages de points, histogrammes, etc.)\n",
    "\n",
    "![img](img/anatomy.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "404ce8bd-42b6-4bd5-b642-24b71fb63e1f",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "x = np.linspace(0, 2*np.pi, 200)\n",
    "y = np.sin(x**2)\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "ax.plot(x, y)\n",
    "ax.set_title('Première Figure avec un seul Axes')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "313897e1-1194-4d28-abb9-80f44913cfbd",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, \n",
    "                               figsize=(8, 4), sharey=True)\n",
    "ax1.plot(x, y)\n",
    "ax1.set_title('Style ligne')\n",
    "ax2.scatter(x, 2*y)\n",
    "ax2.set_title(\"Dilatation d'un facteur 2 et style point\")\n",
    "\n",
    "fig.suptitle(r'Deux tracés `Axes` qui partagent le même axe $y$')\n",
    "fig.tight_layout()     # pour avoir un aspect plus resserré (moins de marges)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "547a885d-97b1-42b1-93eb-3e639689a2f6",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(8,4), \n",
    "                               sharex=True, layout=\"tight\")\n",
    "ax1.plot(x, y, color=\"C0\")\n",
    "ax2.scatter(x, 2*y, marker='x', color=\"C1\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fd8e4d98-e142-4950-85e2-46fa45e0dcd9",
   "metadata": {},
   "source": [
    "Les noms `ax1` et `ax2` obtenus comme retour de la fonction `plt.subplots` sont des raccourcis vers la liste des `Axes` de l'objet `fig`. \n",
    "Ainsi on a:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "637b2a45-ecbf-4af0-b37e-87994b0a308f",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "(ax1 is fig.axes[0], ax2 is fig.axes[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b6f29311-40f8-4e75-aa92-e557faf74b79",
   "metadata": {},
   "source": [
    "Si on utilise le tuple unpacking pour nommer directement `ax1` et `ax2`, on récupère tous les `Axes` créés. Dans l'exemple qui suit on a 2 lignes et 2 colonnes donc 4 `Axes` créés: plus exactement une liste de 2 listes de 2 `Axes`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8e24dbea-da6c-412a-906e-1445a5e20595",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(8,6))\n",
    "for i, ax in enumerate(axs.flat):               # important ici le flat pour applatir axs\n",
    "    ax.plot(x, y, c=f\"C{i}\", label=f\"C{i}\")\n",
    "    ax.legend()\n",
    "fig.legend(loc=\"center right\")\n",
    "fig.suptitle(\"Illustration des 4 premières couleurs de la palette\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f7626a5c-736e-4ccc-a79c-930f166c5331",
   "metadata": {},
   "source": [
    "## Nuage de points\n",
    "\n",
    "C'est un scatter-plot obtenu par la méthode `scatter` d'un `Axes`. Exemple d'utilisation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "788ed7d0-df00-4a83-a56b-e704198d0828",
   "metadata": {},
   "outputs": [],
   "source": [
    "from numpy.random import default_rng\n",
    "rng = default_rng()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "342f01c4-79ea-46ae-a2e9-7620919fb612",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "data = {'a': np.arange(50),\n",
    "        'c': rng.integers(0, 50, size=50),\n",
    "        'd': rng.standard_normal(size=50)}\n",
    "data['b'] = data['a'] + 10 * rng.standard_normal(50)\n",
    "data['d'] = np.abs(data['d']) * 100\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(8, 6))\n",
    "ax.scatter(x='a', y='b', c='c', s='d', data=data)\n",
    "ax.set_xlabel('Entry a')\n",
    "ax.set_ylabel('Entry b');"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ded401f4-de82-4e7e-98b2-40e4012bbfe1",
   "metadata": {
    "tags": []
   },
   "source": [
    "## Courbes\n",
    "\n",
    "C'est la fonction `plot`: lire la page de documentation ! "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "33ab7761-f165-4b87-a38e-ce130292815c",
   "metadata": {},
   "source": [
    "## Distribution empirique\n",
    "\n",
    "Pour visualiser la distribution empirique associée à des réalisations de variables aléatoires *i.i.d* on utilisera \n",
    "- un histogramme ( méthode `hist` d'un `Axes`) lorsque les variables aléatoires sont continues\n",
    "- un diagramme en bâtons (méthode `bar` d'un `Axes`) pour des variables aléatoires discrètes."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
