Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add advanced section to matplotlib notebook #423

Merged
merged 1 commit into from
Sep 24, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
279 changes: 278 additions & 1 deletion python/matplotlib.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -850,6 +850,283 @@
"# LaTeX\n",
"Es ist auch möglich LaTeX für das Setzen aller Plot-Beschriftungen (d.h. Achsenbeschriftungen, Ticks, Legenden, usw.) zu verwenden. Schau dir dazu die \"TeX in matplotlib\" Folien, im LaTeX-Foliensatz an."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Fortgeschrittene Plots"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Manchmal möchte man komplexere Layouts für Plots haben. Hierbei ist `plt.subplots()` insofern eingeschränkt, dass die Subplots nur auf einem $(N\\times M)$-Gitter angeordnet werden können, bei dem jede Position auf dem Gitter mit einem einzelnen Plot besetzt wird. Hier beispielsweise $(2\\times 3)$:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.subplots(2, 3, layout=\"constrained\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Eine Möglichkeit, komplexere Layouts zu erstellen bietet Matplotlib hierbei durch die Funktion `plt.subplot_mosaic()`. Diese ist eine einfach zu nutzende Hilfsfunktion für die `GridSpec`-Klasse, welche komplexe Anordnungen der Subplots ermöglicht. `plt.subplot_mosaic()` kann auf verschiedene Weisen verwendet werden:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Layout über Strings"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hierbei gibt man über einen String die Positionen der Plots an. Dabei steht dann jedes Zeichen für einen (benannten) Plot und neue Zeilen erzeugen auch neue Zeilen im Plot."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mosaic = \"\"\"\n",
" ABC\n",
" DEF\n",
"\"\"\"\n",
"\n",
"fig, ax = plt.subplot_mosaic(mosaic, layout=\"constrained\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Im Gegensatz zu den Abbildungen mit `plt.subplots()` gibt `plt.subplot_mosaic()` kein (mehrdimensionales) Array zurück, sondern ein Dictionary mit den Zeichen aus dem String als Keys und den Achsenobjekten als Values:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ax"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Eine kompaktere Schreibweise für die Strings ist ebenfalls möglich:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mosaic = \"ABC;DEF\"\n",
"\n",
"fig, ax = plt.subplot_mosaic(mosaic, layout=\"constrained\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hierbei werden neue Zeilen durch ein Semikolon `\";\"` angegeben."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Layout über Listen von Strings"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Layouts können auch über Listen von Strings angegeben werden. Das ist insbesondere dann nötig, wenn man Subplots mit mehr als einem Zeichen benennen möchte. Jede Zeile ist hierbei eine eigene Liste (\"nested lists\"):"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mosaic = [[\"Aa\", \"Bb\", \"Cc\"], [\"Dd\", \"Ee\", \"Ff\"]]\n",
"\n",
"plt.subplot_mosaic(mosaic, layout=\"constrained\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Achtung**: Auch bei einer einzelnen Zeile muss diese in eine äußere Liste verschachtelt werden: `[[\"A\", \"B\", \"C\"]]`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Fortgeschrittene Layouts mit `plt.subplot_mosaic()`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bisher haben wir immer nur das $(2\\times 3)$-Layout nachgebaut, welches wir auch einfach mit `plt.subplots()` erzeugen können. Der Vorteil von `plt.subplot_mosaic()` liegt nun darin, dass wir Subplots auch über mehrere Zeilen oder Spalten ziehen können. Hierzu werden Benachbarte Gitterpositionen einfach gleich benannt:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mosaic = \"\"\"\n",
" AAB\n",
" CDB\n",
"\"\"\"\n",
"\n",
"plt.subplot_mosaic(mosaic, layout=\"constrained\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wir können aber auch noch mehr: Mit einem Punkt `\".\"` können wir Positionen markieren, an denen wir keine Plots haben wollen:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mosaic = \"\"\"\n",
" A..\n",
" BC.\n",
" DEF\n",
"\"\"\"\n",
"\n",
"plt.subplot_mosaic(mosaic, layout=\"constrained\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Statt des Punktes kann auch ein beliebiges anderes Zeichen genutzt werden. Dazu wird beim Aufruf der Funktion das Keyword-Argument `empty_sentinel` übergeben:\n",
"Hier beispielsweise mit einem Sternchen `\"*\"`:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mosaic = \"\"\"\n",
" AB\n",
" *C\n",
"\"\"\"\n",
"\n",
"plt.subplot_mosaic(mosaic, layout=\"constrained\", empty_sentinel=\"*\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ein weiterer Vorteil von `plt.subplot_mosaic()` ist die Benennung der Achsen. Hier können wir unsere Subplots beispielsweise einfach mit Labels versehen:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mosaic = [[\"A)\", \"B)\"], [\"C)\", \"D)\"]]\n",
"\n",
"fig, axs = plt.subplot_mosaic(mosaic, layout=\"constrained\")\n",
"\n",
"for ax in axs.values():\n",
" anchor = ax.get_window_extent()\n",
"\n",
" ax.annotate(ax.get_label(), (0.05, 0.95), xycoords=anchor, va=\"top\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hierbei nutzen wir die `ax.get_label()` Methode um in der `ax.annotate()` Methode einen Text (unser Label) mit Ausrichtung oben (\"vertical alignment\", `va=\"top\"`) an die Relativkoordinate $(0.05, 0.95)$ der Achse zu setzen. Die Zeile `anchor = ax.get_window_extent()` zusammen mit dem Keyword-Argument `xycoords=anchor` in `ax.annotate()` sorgt dafür, dass wir uns im Koordinatensystem der Achse befinden und nicht im Koordinatensystem des etwaigen Plotinhalts selbst."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Parameter für einzelne Subplots"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wir können zusätzlich zu den bereits genannten Möglichkeiten von `plt.subplot_mosaic()` mittels des Keyword-Arguments `per_subplot_kw` auch Parameter für die einzelnen Subplots übergeben:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.subplot_mosaic(\n",
" \"AB;CC\",\n",
" per_subplot_kw={\n",
" \"B\": {\"projection\": \"polar\"},\n",
" \"C\": {\"projection\": \"mollweide\"},\n",
" },\n",
" layout=\"constrained\",\n",
");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`per_subplot_kw` erwartet hierbei ein Dictionary, bei dem die Achsennamen als Key und ein weiteres Dictionary als Value übergeben werden."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Weiterführende Informationen und Beispiele lassen sich in der Dokumentation zu [matplotlib.pyplot.subplot_mosaic](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplot_mosaic.html) finden."
]
}
],
"metadata": {
Expand All @@ -869,7 +1146,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.6"
"version": "3.12.6"
}
},
"nbformat": 4,
Expand Down
Loading