{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "495dd375-03bd-468b-9efa-4c0dc0e03e71",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-d5e39caeb15d5f93",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "# 4. Programmierübung: Matplotlib\n",
    "\n",
    "<div style=\"display:flex;\">\n",
    "    <div style=\"text-align: left\">\n",
    "        Willkommen zur vierten Programmierübung Einführung in Python 3.\n",
    "    </div>\n",
    "    <img style=\"float: right; margin: 0px 15px 15px 0px\" src=\"https://www.python.org/static/img/python-logo-large.c36dccadd999.png?1576869008\" width=\"100\" />\n",
    "</div>\n",
    "\n",
    "Wenn Sie Fragen oder Verbesserungsvorschläge zum Inhalt oder Struktur der Notebooks haben, dann können sie eine E-Mail an Phil Keier ([p.keier@hbk-bs.de](mailto:p.keier@hbk-bs.de?subject=[SigSys]%20Feedback%20Programmierübung&amp)) oder Martin Le ([martin.le@tu-bs.de](mailto:martin.le@tu-bs.de?subject=[SigSys]%20Feedback%20Programmierübung&amp)) schreiben.\n",
    "\n",
    "Link zu einem Python Spickzettel: [hier](https://s3.amazonaws.com/assets.datacamp.com/blog_assets/PythonForDataScience.pdf)\n",
    "\n",
    "Der Großteil des Python-Tutorials stammt aus der Veranstaltung _Deep Learning Lab_ und von [www.python-kurs.eu](https://www.python-kurs.eu/python3_kurs.php) und wurde für _Signale und Systeme_, sowie _Einführung in die Programmierung für Nicht Informatiker_ angepasst.\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d6320c43-281a-4c81-86ca-ded1f2d57f19",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-56a32bfbc0754cb7",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "# Was ist Matplotlib\n",
    "\n",
    "Matplotlib ist eine Python Bibliothek zum (interaktiven) Visualisieren von Daten. Die Bibliothek intergiert sich super mit anderen viel Benutzten Python Bibliotheken wie NumPy. Der Vorteil in Kombination mit Jupyter besteht in der direkten Ausgabe eines Plots auf dem Bildschirm.\n",
    "\n",
    "__Nutzen Sie für diese Aufgabe gerne die [Matplotlib Reference](https://matplotlib.org/stable/users/index.html)__\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "994c8d87-9f58-4915-9eb5-f55e16d31487",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-bc85a0be9322c558",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "# Import & Jupyter Magick\n",
    "\n",
    "Um Matplotlib zu verwenden müssen wir diese importieren. Dabei ist das Objekt `pyplot` der Dreh und Angelpunkt der ganzen Magie. Wie auch bei NumPy hat das Internet ein ungeschriebenes Gesetz, dass die Abkürzung von `matplotlib.pyplot` `plt` heißt. \n",
    "\n",
    "Importieren wir im ersten Schritt matplotlib als plt:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4e07b9b9-adab-46d6-97bd-c9fce64f4280",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-68fd2b50ade28cf5",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf8480a8-a92b-401f-90fb-a92d4d8cb33d",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-bef28e9b16f2bbd6",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "Jupyter hat magische Parameter die von den Bibliotheken verwendet werden können um gewissen Einstellungen im Hintergrund zu treffen. Daher brauchen wir in nächster Zeile genau dieses \"magische\" Statement. \n",
    "\n",
    "Falls Sie dazu mehr Wissen wollen Lesen Sie den Eintrag zu [Rich Outputs](https://ipython.readthedocs.io/en/stable/interactive/plotting.html) in der IPython Dokumentation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "27f26d6b-2b3c-4c60-b878-b728d2467b1f",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-5c87d5ef9d857466",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "58332e87-d29d-4307-92de-bc5d70ac6419",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-f5c587ae3eade082",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "Im Allgemeinen steht folgendes Import Statement in jedem Jupyter Notebook das im entferntesten etwas mit Datenanalyse zu tun hat. Achtung in nächster Zelle wird NumPy gleich mit importiert."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f8d54007-5094-4d34-b5ce-11a62d367f53",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-67eb623e3d643f2d",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e7b78221-3568-45c5-964f-422b2668f4e5",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-30de8243b097dfdc",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "# First plot\n",
    "\n",
    "Wie dem [Getting Started](https://matplotlib.org/stable/users/getting_started/index.html#getting-started) Beispiel zu entnehmen, wollen wir einmal die Sinus Funktion plotten.\n",
    "\n",
    "Dazu brauchen wir zwei Attribute:\n",
    "1. Die x-Skala - Dies kann die Länge eines Datensets sein, oder ein allegemeiner Linespace. Aufjedenfall eine Liste bzw. Array.\n",
    "2. Die y-Skala - Im Allgemeinen die Werte eines zu plottenden Datensets. Aufjedenfall auch eine Liste bzw. Array.\n",
    "\n",
    "Plotten wir im Folgenden die Sinus Funktion. Eine der schönen Eigenschaften der Sinus Funktion ist, dass diese sich nach dem Intervall $[0...2\\pi]$ wiederholt. Daher enthält die x-Skala einen linespace von $[0...2\\pi]$. Als Wert für $\\pi$ wird die NumPy Konstante [np.pi](https://numpy.org/doc/stable/reference/constants.html#numpy.pi) verwendet.\n",
    "\n",
    "Auf der y-Skala plotten wir im folgenden das zuvor berechnete Array mit den Sinus Werten. Die Hierfür verwendete Funktion ist [np.sin](https://numpy.org/doc/stable/reference/generated/numpy.sin.html). \n",
    "\n",
    "Das `plt` Objekt hat mehrere Funktionen die in einer bestimmten Reihenfolge aufgerufen werden müssen. Dabei können zuerst mehrere plots mit [plt.plot](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html) definiert werden. Zum Schluss wird zur Ausgabe [plt.show](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.show.html) aufgerufen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "72fa4224-095a-4d6a-9a9f-e1c136a79115",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-2eaf77b2d04abff1",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 30716 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(0, 2*np.pi, num=200) # Definiere einen linearen Bereich von 0 bis 2pi\n",
    "y = np.sin(x) # Berechne den Sinus mit den Werten von x\n",
    "\n",
    "plt.plot(x, y) # Setze für die X-Achse x und für die Y-Achse y\n",
    "plt.show() # Zeige den Plot"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b67896b4-8a1c-4c3f-92c7-7459f95916e0",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-1dd3b7172bc39b59",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "# Zwei Funktionen \n",
    "\n",
    "Wie bereits zuvor erwähnt lässt sich `plt.plot` mehr als einmal aufrufen. Wollen wir im folgenden den Kosinus mittels [np.cos](https://numpy.org/doc/stable/reference/generated/numpy.cos.html) dazu plotten. Dafür werden die Werte aus dem bereits definierten x wiederverwendet. Die Variabelen `y1 = np.sin(x)` & `y2 = np.cos(x)` enthälten die jeweiligen y werte. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3ef7123c-255d-42ae-8ae6-d63cdcc6b032",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-2e9cc2ce95f1e20e",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 43060 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "y1 = np.sin(x) # Sinus Werte mittels x berechnen\n",
    "y2 = np.cos(x) # Kosinus Werte mittels x berechnen\n",
    "\n",
    "plt.plot(x, y1) # Plotte den Sinus\n",
    "plt.plot(x, y2) # Plotte den Kosinus\n",
    "\n",
    "plt.show() # Zeige das Diagramm"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "caf293fb-ee33-48d1-85f1-82cc3afca0cf",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-d1d50ca1d203ac29",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Aufgabe - Erster eigener Plot Square Root\n",
    "\n",
    "Analog zu voheriger Erklärung Plotten Sie im folgenden die Funktion Square Root Mathematisch definiert als $f(x) = \\sqrt x; \\quad x \\geq 0$.\n",
    "\n",
    "Gehen Sie dabei wie folgt vor:\n",
    "1. Definieren Sie einen geeigneten [Linespace](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy-linspace) für die Zahlenraum 0...100. (Tipp: Achten Sie auf die Definition! Die Wurzel ist nur für positive Zahlen definiert.)\n",
    "2. Berechnen Sie mittels der Funktion [np.sqrt](https://numpy.org/doc/stable/reference/generated/numpy.sqrt.html#numpy.sqrt) die Werte für die Wurzel.\n",
    "3. Plotten Sie das Ergebnis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "94a1aacc-0c6f-443f-b11c-de8f3c6137bc",
   "metadata": {
    "nbgrader": {
     "grade": true,
     "grade_id": "cell-bae73642cf0a866a",
     "locked": false,
     "points": 3,
     "schema_version": 3,
     "solution": true,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 19556 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# BEGIN SOLUTION\n",
    "xs = np.linspace(0, 100, num=200)\n",
    "ys = np.sqrt(xs)\n",
    "plt.plot(xs, ys)\n",
    "plt.show()\n",
    "# END SOLUTION"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "89a722de-8f9f-4d92-a3c1-867b61f4ddaf",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-998243908406c7d4",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "# Styling\n",
    "\n",
    "Da bei mehreren Plots der Überblick schnell verloren geht beschäftigen wir uns im folgenden mit dem Styling. Dabei gehen wir im Schnelldurchlauf durch alle Parameter.\n",
    "\n",
    "Die Grundlage für alle folgenden Plots werden in nächster Zelle gesetzt."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "88f9cd6c-0347-4df4-9b5f-0cfb9b655a4c",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-a86ddac229c0bbbb",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "x = np.linspace(0, 2*np.pi, num=200)\n",
    "s = np.sin(x)\n",
    "c = np.cos(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b164da6-f153-4e50-98f0-18c75f6adf19",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-e27c575962048d7b",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Farbe ändern\n",
    "\n",
    "Die Standard Farbe für den ersten Plot ist immer Blau. Um die Farbe zu verändern wird `plt.plot` der Parameter `color` übergeben. Dieser erwartet einen String. Für eine genauere Erläuterung lesen Sie die Dokumentation zu [Specifying color](https://matplotlib.org/stable/users/explain/colors/colors.html). Für dieses Notebook werden die Beispiele mit den \"Single Character Shorthands\" (Aus der Dokumentation zu entnehmen) ausgestattet.\n",
    "\n",
    "Plotten wir den Sinus nun in Rot:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "de303799-2d02-4793-a40b-f5e528bc6f42",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-1ec79feac73af81f",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 27324 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x, s, color='r') # Plot mit der Farbe Rot\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dcf5f847-7d69-4b29-81a2-c2dc2c0b3e90",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-6d559d4604922bd9",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Titel für den Plot setzen\n",
    "\n",
    "Dafür wird [plt.title](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.title.html) der Paramter wird als String übergeben:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "aa2a1bba-3ec6-4097-874f-508a7b11c68f",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-106786a4fca81b67",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 32904 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x, s)\n",
    "plt.title(\"Sinus Plot\") # Titel Setzen\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f5de5666-aa6f-43cc-a230-8c54779b1f73",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-8d7bed3592e18530",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Legende und Labels\n",
    "\n",
    "Um eine Legende anzuzeigen muss vor `plt.show` die Funktion [plt.legend](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html) aufgerufen werden. Damit dies Wirkung zeigt braucht muss jeder Plot mit dem Parameter `label` (als String) ausgezeichnet werden. Plotten wir im Folgenden den Sinus und Kosinus mit entsprechenden Labels."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "b6962f15-dd2d-45fe-895a-e388687847aa",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-b1d037b9a275622c",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 45860 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x, s, label=\"Sinus\") # Plotte Sinus mit label Sinus\n",
    "plt.plot(x, c, label=\"Kosinus\") # Plotte Kosinus mit label Kosinus\n",
    "plt.legend() # Füge die Legende ein\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "712b286b-d173-4aef-8bc0-04e067659a86",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-63bbc82ff5e6892a",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Linestyle\n",
    "\n",
    "Die letze wichtige Eigenschaft ist das Setzen eines Linestyles. Dazu wird `plt.plot` der parameter `linestyle` als String übergeben. Entnehmen Sie die verschiednen Linestyles bitte der Dokumentation zu [Linestyles](https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html).\n",
    "\n",
    "Sinus als `dashed` line:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "bc6a2a76-51c3-46d8-9e07-3c3b3f2a571f",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-402e40ea2ceafc35",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 29272 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x, s, linestyle=\"dashed\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14d3e8ec-dec6-4d42-90a3-86ffdd11d061",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-88e04ff7645c08cd",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Aufgabe - Multiplot\n",
    "\n",
    "In der nächsten Aufgabe wollen wir gleich zwei Funktionen Plotten. $f(x) = \\sqrt x$ und $g(x) = x^2$.\n",
    "\n",
    "Gehen Sie dabei wie folgt vor:\n",
    "1. Definieren Sie einen geeigneten [Linespace](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy-linspace) für die Zahlenraum 0...3. (Tipp: Achten Sie auf die Definition! Die Wurzel ist nur für positive Zahlen definiert.)\n",
    "2. Berechnen Sie mittels der Funktion [np.sqrt](https://numpy.org/doc/stable/reference/generated/numpy.sqrt.html#numpy.sqrt) die Werte für die Wurzel.\n",
    "3. Berechnen Sie mittels der Funktion [np.square](https://numpy.org/doc/stable/reference/generated/numpy.square.html#numpy-square) die Werte für die Quadrat Zahlen\n",
    "4. Geben Sie den beiden Plots die Farben Grün & Rot. Nutzen Sie gerne die [Color Shorthands](https://matplotlib.org/stable/users/explain/colors/colors.html) aus der Dokumentation.\n",
    "5. Plotten Sie die Square Funktion mit dem Linestyle `dashdot`, wie der Dokumentation zu entnehmen [Linestyles](https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html)\n",
    "6. Geben Sie den beiden Plots angemessene Labels.\n",
    "7. Fügen Sie die Legende hinzu.\n",
    "8. Plotten Sie das Ergebnis."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "b354952b-f922-42a7-914a-cda9522dff69",
   "metadata": {
    "nbgrader": {
     "grade": true,
     "grade_id": "cell-6bb6ab1d60fffde5",
     "locked": false,
     "points": 8,
     "schema_version": 3,
     "solution": true,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 26372 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# BEGIN SOLUTION\n",
    "xt = np.linspace(0, 3, num=200)\n",
    "sqrt = np.sqrt(xt)\n",
    "square = np.square(xt)\n",
    "\n",
    "plt.plot(xt, sqrt, color='r', label=\"Square Root\")\n",
    "plt.plot(xt, square, color='g', label=\"Square Function\", linestyle=\"dashdot\")\n",
    "plt.legend()\n",
    "plt.show()\n",
    "# END SOLUTION"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0f9041af-6d24-4786-969a-5f8fb9b5ba3a",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-486bea96505ad0a6",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "---\n",
    "\n",
    "# Plot Types\n",
    "\n",
    "Im folgenden Kapitel beschäftigen wir uns mit verschiedensten Plot typen."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4ffad0de-cd56-47e1-b327-7c9b16d46865",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-79e43d78c9874975",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Line Plots\n",
    "\n",
    "Line Plots haben wir im voherigen Kapitel bereits kennengelernt. Diese können mittels `plt.plot` augerufen werden.\n",
    "\n",
    "Beispiel Sinus:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "2375e035-4413-4cc5-875d-5463685299f4",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-b48b1eec8fe65537",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 30716 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(0, 2*np.pi, num=200)\n",
    "y = np.sin(x) \n",
    "\n",
    "plt.plot(x, y) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5893a0a-65be-418b-889c-ee5d48ed1c9e",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-d81b654168ec4bc8",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Bar Charts\n",
    "\n",
    "Beliebt sind Barcharts. Dazu werden aber mehrere Parameter benötigt. Da einfache mathematische Funktionen bei dieser Art Plot keinen Sinn ergeben.\n",
    "\n",
    "Konsultieren wir dafür folgendes Beispiel.\n",
    "\n",
    "Wir wollen wissen wie viele Kinder an einer Grundschule in jeder Klassenstufe sind.\n",
    "Dazu benötigen wir 2 Listen.\n",
    "1. Die Klassenstufen\n",
    "2. Die Anzahl an Kinder in der Klassenstufe"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "bc2b7a3f-0a8d-4f33-9c37-99850e33f6c6",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-3767e976a92e292a",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "classes = [\"1. Klasse\", \"2. Klasse\", \"3. Klasse\", \"4. Klasse\"]\n",
    "kids = [42, 30, 26, 45]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b484d826-1539-4650-891d-d80ab60f4e4f",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-a702a6b994c5809e",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "Plotten wir die Werte nun als Bar Chart mit der Funktion `plt.bar`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "2ceb28ef-7db1-4d2e-993b-5a0fa17b0785",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-8c604c68ae96c752",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 10040 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(classes, kids)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a46c7700-d039-4345-b59f-4fc0d0400e95",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-c2444cb0f1af6626",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "### Bessere Datenrepresentation\n",
    "\n",
    "Da die Daten aus `classes` & `kids` miteinander eine Verbindung teilen wäre die Repräsentation mittels Dictionary die klügere Wahl um keine Fehler in den Plot zu bringen.\n",
    "\n",
    "Mittels der `.keys` & `.values` Funktion auf dem Dictionary lassen sich dann die Daten gezielt plotten.\n",
    "\n",
    "Schauen Sie sich daher folgendes Beispiel an:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "63a994e2-4f9c-44c2-940a-6ea202b50e44",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-1777b8fcd5bd30c4",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 10040 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Definiere ein Dictionary welches die Anzahl der Schüler ihrer Klasse zuweist \n",
    "school = { \n",
    "    \"1. Klasse\": 42,\n",
    "    \"2. Klasse\": 30,\n",
    "    \"3. Klasse\": 26,\n",
    "    \"4. Klasse\": 45,\n",
    "}\n",
    "\n",
    "plt.bar(school.keys(), school.values()) # Plotte mit den Werten des Dictionarys\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3371f47f-319b-4387-bcca-ae2363fe0662",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-d2c659803a58f15e",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "### Styling\n",
    "\n",
    "Bar plots können auch gestyled werden. Hierzu wird dem Parameter `color` eine Liste mit farbwerten übergeben:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "ace35364-3865-4bbb-92c3-8d9804636329",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-a3604899d50585d2",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 10188 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "school = { \n",
    "    \"1. Klasse\": 42,\n",
    "    \"2. Klasse\": 30,\n",
    "    \"3. Klasse\": 26,\n",
    "    \"4. Klasse\": 45,\n",
    "}\n",
    "\n",
    "bar_colors = [\"red\", \"blue\", \"green\", \"yellow\"] # Farben definieren\n",
    "\n",
    "plt.bar(school.keys(), school.values(), color=bar_colors) # Farben übergeben\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "875f5a2f-9db1-49ba-a7ab-c4452f7b0cb7",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-964f579ce46a2882",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "### Y-Label\n",
    "\n",
    "Mit `plt.ylabel` (als String) lässt sich die y-Achse beschriften:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "bedf0e03-583a-4a22-857f-0d786f9365c4",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-21cee3bf50f011e1",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 13000 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "school = { \n",
    "    \"1. Klasse\": 42,\n",
    "    \"2. Klasse\": 30,\n",
    "    \"3. Klasse\": 26,\n",
    "    \"4. Klasse\": 45,\n",
    "}\n",
    "\n",
    "bar_colors = [\"red\", \"blue\", \"green\", \"yellow\"]\n",
    "\n",
    "plt.bar(school.keys(), school.values(), color=bar_colors)\n",
    "\n",
    "plt.ylabel(\"Anzahl Kinder\") # Beschriften der Y-Achse\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "329b675f-75a8-49c2-a6cc-331882010127",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-32dabb34444f6190",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "### X-Label\n",
    "\n",
    "Analog Dazu die Beschriftung der X-Achse mit `plt.xlabel`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "212535af-d1db-4e08-bb9f-8e14d047cee7",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-3737280b071f9d91",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 15616 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "school = { \n",
    "    \"1. Klasse\": 42,\n",
    "    \"2. Klasse\": 30,\n",
    "    \"3. Klasse\": 26,\n",
    "    \"4. Klasse\": 45,\n",
    "}\n",
    "\n",
    "bar_colors = [\"red\", \"blue\", \"green\", \"yellow\"]\n",
    "\n",
    "plt.bar(school.keys(), school.values(), color=bar_colors)\n",
    "\n",
    "plt.ylabel(\"Anzahl Kinder\") # Beschriften der Y-Achse\n",
    "plt.xlabel(\"Klassenstufen\") # Beschriften der X-Achse\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "147244b1-7bdc-40bc-9f87-93997f9742ed",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-230328a26793cddb",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "### Aufgabe\n",
    "\n",
    "Ihnen ist ein Datenset `sec_school` einer Hauptschule gegeben, welches die Klassenstufen von 5 bis 9 auf die Anzahl ihrer Schüler im Jahrgang mappt. \n",
    "\n",
    "Definieren Sie einen Barplot. Gehen Sie dabei wie folgt vor:\n",
    "1. Definieren Sie ein geeignetes Farbschema zur Darstellung der Daten.\n",
    "2. Extrahieren Sie die Schlüssel und Werte aus dem Datenset und übergeben Sie diese zusammen mit den Farbwerten an die Funktion `plt.bar`.\n",
    "3. Setzen Sie geeignete Werte für die X & Y-Achse.\n",
    "4. Setzen Sie einen geeigneten Titel für den Plot.\n",
    "5. Plotten Sie den Werte"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "faec1d5e-c08c-4401-9fbd-5e324c045555",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-b954e989a8bbc2fa",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "sec_school = {\n",
    "    '5. Klasse': 29,\n",
    "    '6. Klasse': 35,\n",
    "    '7. Klasse': 25,\n",
    "    '8. Klasse': 28,\n",
    "    '9. Klasse': 31\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "0713b074-1eb9-4b5a-ae37-7ee237f814d9",
   "metadata": {
    "nbgrader": {
     "grade": true,
     "grade_id": "cell-8caba57a6ad34b87",
     "locked": false,
     "points": 5,
     "schema_version": 3,
     "solution": true,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 26476 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# BEGIN SOLUTION\n",
    "colors = [\"red\", \"blue\", \"green\", \"yellow\", \"pink\"]\n",
    "plt.bar(sec_school.keys(), sec_school.values(), color=colors)\n",
    "plt.xlabel(\"Klassenstufe\")\n",
    "plt.ylabel(\"Anzahl Kinder\")\n",
    "plt.title(\"Verteilung Kinder einer Hauptschule pro Klassenstufe\")\n",
    "plt.show()\n",
    "# END SOLUTION"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75b88cfc-ac01-4af4-9b90-ca3a3f522115",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-42bf44a09515d0fd",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Horizontales Bar Chart\n",
    "\n",
    "Analog zum Barchart erzeugt `plt.barh` einen Horizontales Barchart.\n",
    "\n",
    "Beispiel:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "43ec4deb-261a-43c7-ac88-8f43338420b8",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-54166820b406e29e",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 18240 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "school = { \n",
    "    \"1. Klasse\": 42,\n",
    "    \"2. Klasse\": 30,\n",
    "    \"3. Klasse\": 26,\n",
    "    \"4. Klasse\": 45,\n",
    "}\n",
    "\n",
    "plt.barh(list(school.keys()), list(school.values()), color=\"maroon\") # barh statt bar\n",
    "\n",
    "plt.xlabel(\"Anzahl Kinder\") \n",
    "plt.ylabel(\"Klassenstufen\") \n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5275062-b7f5-4193-9b5a-70f4e861c819",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-3adde3f53176bcb0",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Pie Chart <3\n",
    "\n",
    "Kommen wir als nächstes zu der besten, tollsten und schönsten Darstellung von Daten. Den KUCHENDIAGRAMMEN!\n",
    "\n",
    "![](https://flowingdata.com/wp-content/uploads/2014/12/Pie-Pyramid-620x311.png)\n",
    "\n",
    "Kuchendiagramme können mittels `plt.pie` erstellt werden. Nehmen wir dazu wieder das Beispiel aus voherigem Kapitel. Dabei verlangt das Pie Chart nur die Werte (`school.values`) des Datensets:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "0e4c5699-5710-4c32-b4cc-e275bec35cc8",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-46cde6d166912ad0",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 20872 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "school = { \n",
    "    \"1. Klasse\": 42,\n",
    "    \"2. Klasse\": 30,\n",
    "    \"3. Klasse\": 26,\n",
    "    \"4. Klasse\": 45,\n",
    "}\n",
    "\n",
    "plt.pie(school.values()) # Pie Chart\n",
    "\n",
    "plt.title(\"Klassenverteilung einer Grundschule\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d44f2914-3a55-4f00-b580-498931891efa",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-aec08dc408437049",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Styling\n",
    "\n",
    "Alle Parameter wie `title`, `color`, `xlabel`, `ylabel`, etc. lassen sich auch für das Pie Chart setzen. Die Beschriftung der einzelnen Stücke jedoch Funktioniert etwas anders.\n",
    "\n",
    "Dazu wird der Parameter `label` mit den dazugehörigen Werten ausgestattet:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "130abb6f-9241-4d2f-8975-8baaf7df6482",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-c742155fd484b71b",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 27684 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "school = { \n",
    "    \"1. Klasse\": 42,\n",
    "    \"2. Klasse\": 30,\n",
    "    \"3. Klasse\": 26,\n",
    "    \"4. Klasse\": 45,\n",
    "}\n",
    "\n",
    "plt.pie(school.values(), labels=school.keys()) # Setzen der Labels\n",
    "\n",
    "plt.title(\"Klassenverteilung einer Grundschule\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5a3a3264-e1af-4c7f-91f9-8bae4dfedb32",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-5336af155ef45527",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "Zum setzen von Prozentwerten wird der Parameter `autopct` verwendet. Dieser nutzt einen Format String oder eine Funktion zum definieren der Werte. Schaue dazu für mehr in die Dokumentation für [autpct](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.pie.html#matplotlib-pyplot-pie), eine Dokumentation zu Formatstrings findest du [hier](https://www.geeksforgeeks.org/format-specifiers-in-c/).\n",
    "\n",
    "Beispiel für Prozentwerte:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "f575e892-bbe5-45ae-8df4-f1dfa54b1d1b",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-183044afa87a0492",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 32612 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "school = { \n",
    "    \"1. Klasse\": 42,\n",
    "    \"2. Klasse\": 30,\n",
    "    \"3. Klasse\": 26,\n",
    "    \"4. Klasse\": 45,\n",
    "}\n",
    "\n",
    "plt.pie(school.values(), labels=school.keys(), autopct='%1.1f%%') # Setzen von Prozentwerten\n",
    "\n",
    "plt.title(\"Klassenverteilung einer Grundschule\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b53f5919-ed5a-4a68-9420-911098cf2491",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-430a11a7f58f4fa5",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "Pie Charts haben auch einen Parameter `shadow`. Dieser ist Standardmässig `False`. Setzt man den Wert auf `True` sieht man einen Schatten:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "f5f47060-123c-4b4f-b518-4fc0a795dfb0",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-408e63a1464d64ea",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 38156 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "school = { \n",
    "    \"1. Klasse\": 42,\n",
    "    \"2. Klasse\": 30,\n",
    "    \"3. Klasse\": 26,\n",
    "    \"4. Klasse\": 45,\n",
    "}\n",
    "\n",
    "plt.pie(school.values(), labels=school.keys(), autopct='%1.1f%%', shadow=True) # Zeige einen Schatten\n",
    "\n",
    "plt.title(\"Klassenverteilung einer Grundschule\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4dc1531b-4c95-4f39-8f47-209e0df9cdc8",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-376fc818f2a3d818",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "Zum herausnehmen von Kuchenstücken gibt es den Parameter `explode` dieser erwartet eine Liste mit Fließkommezahlen die zwischen 0.0 - Standardwert und 1.0 - absoluter Explode liegen.\n",
    "\n",
    "Beispiel Klasse 3 ist vom Ursprung 20% entfernt:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "5788aefe-5e4f-4430-b7a6-af82f3b1541b",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-e3921561732c3895",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 33908 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "school = { \n",
    "    \"1. Klasse\": 42,\n",
    "    \"2. Klasse\": 30,\n",
    "    \"3. Klasse\": 26,\n",
    "    \"4. Klasse\": 45,\n",
    "}\n",
    "\n",
    "plt.pie(school.values(), labels=school.keys(), autopct='%1.1f%%', explode=[0, 0, 0.2, 0]) # Zeige einen Schatten\n",
    "\n",
    "plt.title(\"Klassenverteilung einer Grundschule\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb2b8d52-cd07-4ed4-a4b6-46d90fd6b614",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-ed3d080835960776",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "## Aufgabe\n",
    "\n",
    "Ihnen ist ein Datenset `sec_school` einer Hauptschule gegeben, welches die Klassenstufen von 5 bis 9 auf die Anzahl ihrer Schüler im Jahrgang mappt. \n",
    "\n",
    "Definieren Sie einen Pieplot. Gehen Sie dabei wie folgt vor:\n",
    "1. Definieren Sie ein geeignetes Farbschema zur Darstellung der Daten.\n",
    "2. Extrahieren Sie die Schlüssel und Werte aus dem Datenset und übergeben Sie diese zusammen mit den Farbwerten an die Funktion `plt.pie`. (Nutzen Sie zum Anzeigen der Prozentwerte autopct='%1.1f%%')\n",
    "3. Lassen Sie die 6. Klasse 25% und die 9. Klasse 40% explodieren.\n",
    "4. Setzen Sie einen geeigneten Titel für den Plot.\n",
    "5. Plotten Sie den Werte."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "143c7633-8e06-45a5-9aff-864eb0dc21d3",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-bf48088c515caf5c",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [],
   "source": [
    "sec_school = {\n",
    "    '5. Klasse': 29,\n",
    "    '6. Klasse': 35,\n",
    "    '7. Klasse': 25,\n",
    "    '8. Klasse': 28,\n",
    "    '9. Klasse': 31\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "32479818-10ee-4800-86b6-a811bc72cb03",
   "metadata": {
    "nbgrader": {
     "grade": true,
     "grade_id": "cell-d201bd3e919fcf1c",
     "locked": false,
     "points": 5,
     "schema_version": 3,
     "solution": true,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 41876 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# BEGIN SOLUTION\n",
    "plt.pie(\n",
    "    sec_school.values(),\n",
    "    labels=sec_school.keys(),\n",
    "    autopct='%1.1f%%',\n",
    "    explode=[0, 0.25, 0, 0, 0.4]\n",
    ")\n",
    "\n",
    "plt.title(\"Klassenverteilung einer Grundschule\")\n",
    "\n",
    "plt.show()\n",
    "# END SOLUTION"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83c08253-bc04-4b87-b906-4002ff210bad",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-e189ada272b135b2",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "source": [
    "---\n",
    "\n",
    "# Extra\n",
    "\n",
    "Das Meme:\n",
    "\n",
    "![](https://flowingdata.com/wp-content/uploads/2014/12/Pie-Pyramid-620x311.png)\n",
    "\n",
    "lässt sich mit folgendem Python Code replizieren:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "0079d10b-26fb-4aaa-b925-c6e31e456c6c",
   "metadata": {
    "nbgrader": {
     "grade": false,
     "grade_id": "cell-1120f5b30213d9b5",
     "locked": true,
     "schema_version": 3,
     "solution": false,
     "task": false
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 24584 characters]",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "data = {\n",
    "    \"Sky\": 0.77,\n",
    "    \"Sunny side of pyramid\": 0.17,\n",
    "    \"Shady side of pyramid\": 0.05\n",
    "}\n",
    "\n",
    "colors = [\"#0095d9\", \"#f5e837\", \"#c4b633\"]\n",
    "\n",
    "plt.pie(data.values(), startangle=-50, colors=colors)\n",
    "plt.legend(data.keys(), bbox_to_anchor=(1, 0, 0.5, 0.6))\n",
    "plt.savefig(\"meme.png\", bbox_inches=\"tight\", transparent=True)"
   ]
  }
 ],
 "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.12.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
