{ "cells": [ { "cell_type": "markdown", "id": "0", "metadata": {}, "source": [ "# Tutorial 13 – Advanced Matplotlib Plotting\n", "\n", "# Advanced Matplotlib plotting\n", "\n", "This tutorial covers horizontal bars, histograms, filled regions,\n", "reference spans, arrows, infinitely extending lines, and secondary\n", "y-axes." ] }, { "cell_type": "code", "execution_count": null, "id": "1", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from maxplotlib import Canvas\n", "\n", "x = np.linspace(0, 2 * np.pi, 200)" ] }, { "cell_type": "markdown", "id": "2", "metadata": {}, "source": [ "## Common plotting primitives" ] }, { "cell_type": "code", "execution_count": null, "id": "3", "metadata": {}, "outputs": [], "source": [ "canvas = Canvas(width=\"12cm\", ratio=0.65)\n", "canvas.barh([0, 1, 2], [2, 4, 3], color=\"steelblue\", alpha=0.8)\n", "canvas.set_yticks([0, 1, 2], labels=[\"A\", \"B\", \"C\"])\n", "canvas.set_xlabel(\"Amount\")\n", "canvas.set_title(\"Horizontal bars\")\n", "canvas.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "4", "metadata": {}, "outputs": [], "source": [ "samples = np.random.default_rng(4).normal(size=1000)\n", "canvas = Canvas()\n", "canvas.hist(samples, bins=30, color=\"slateblue\", alpha=0.75)\n", "canvas.set_xlabel(\"Value\")\n", "canvas.set_ylabel(\"Count\")\n", "canvas.set_title(\"Distribution\")\n", "canvas.show()" ] }, { "cell_type": "markdown", "id": "5", "metadata": {}, "source": [ "## Steps, stairs, broken bars, and pie charts" ] }, { "cell_type": "code", "execution_count": null, "id": "6", "metadata": {}, "outputs": [], "source": [ "canvas = Canvas()\n", "canvas.step([0, 1, 2, 3], [1, 3, 2, 4], where=\"mid\", label=\"step\")\n", "canvas.stairs([1, 2, 1], edges=[0, 1, 2, 3], color=\"purple\", label=\"stairs\")\n", "canvas.set_title(\"Discrete data\")\n", "canvas.set_legend(True)\n", "canvas.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "7", "metadata": {}, "outputs": [], "source": [ "canvas = Canvas()\n", "canvas.broken_barh([(0, 1), (1.5, 0.75), (2.75, 1.0)], (0, 0.6), color=\"orange\")\n", "canvas.set_xlabel(\"Intervals\")\n", "canvas.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "8", "metadata": {}, "outputs": [], "source": [ "canvas = Canvas()\n", "canvas.pie([30, 45, 25], labels=[\"A\", \"B\", \"C\"], autopct=\"%1.0f%%\")\n", "canvas.set_title(\"Shares\")\n", "canvas.show()" ] }, { "cell_type": "markdown", "id": "9", "metadata": {}, "source": [ "## Regions, arrows, and reference lines" ] }, { "cell_type": "code", "execution_count": null, "id": "10", "metadata": {}, "outputs": [], "source": [ "canvas = Canvas()\n", "canvas.plot(x, np.sin(x), color=\"black\")\n", "canvas.fill_betweenx([-1, 0, 1], 0.5, [1.0, 1.5, 2.0], alpha=0.2)\n", "canvas.axvspan(1.0, 2.0, color=\"orange\", alpha=0.2)\n", "canvas.axhspan(-0.25, 0.25, color=\"steelblue\", alpha=0.15)\n", "canvas.arrow(2.0, np.sin(2.0), 0.5, 0.3, length_includes_head=True)\n", "canvas.axline((0, 0), slope=0.2, linestyle=\"--\", color=\"crimson\")\n", "canvas.show()" ] }, { "cell_type": "markdown", "id": "11", "metadata": {}, "source": [ "## Secondary y-axis" ] }, { "cell_type": "code", "execution_count": null, "id": "12", "metadata": {}, "outputs": [], "source": [ "twin_canvas, primary = Canvas.subplots()\n", "secondary = twin_canvas.twinx()\n", "\n", "primary.plot(x, np.sin(x), color=\"tab:blue\")\n", "secondary.plot(x, 100 * np.cos(x), color=\"tab:red\")\n", "primary.set_xlabel(\"Time\")\n", "primary.set_ylabel(\"sin(x)\", color=\"tab:blue\")\n", "secondary.set_ylabel(\"100 cos(x)\", color=\"tab:red\")\n", "twin_canvas.set_title(\"Two scales sharing one x-axis\")\n", "twin_canvas.show()" ] }, { "cell_type": "markdown", "id": "13", "metadata": {}, "source": [ "Secondary y-axes are supported by the Matplotlib and Plotly backends.\n", "The plotext and TikZ backends currently reject a canvas containing\n", "`twinx()` plots instead of silently producing an incorrect figure.\n", "\n", "## Scientific field plots" ] }, { "cell_type": "code", "execution_count": null, "id": "14", "metadata": {}, "outputs": [], "source": [ "x = np.linspace(-1, 1, 40)\n", "y = np.linspace(-1, 1, 40)\n", "xx, yy = np.meshgrid(x, y)\n", "z = xx**2 + yy**2\n", "\n", "canvas = Canvas()\n", "canvas.contour(x, y, z, colors=\"black\")\n", "canvas.contourf(x, y, z, alpha=0.5)\n", "canvas.pcolormesh(x, y, z, alpha=0.25)\n", "canvas.set_title(\"Scalar field\")\n", "canvas.show()" ] }, { "cell_type": "markdown", "id": "15", "metadata": {}, "source": [ "For point-density data and matrix-oriented displays:" ] }, { "cell_type": "code", "execution_count": null, "id": "16", "metadata": {}, "outputs": [], "source": [ "canvas = Canvas()\n", "canvas.hexbin(xx.ravel(), yy.ravel(), gridsize=12)\n", "canvas.matshow(z)\n", "canvas.show()" ] }, { "cell_type": "markdown", "id": "17", "metadata": {}, "source": [ "Unstructured triangular data and vector fields are also supported:" ] }, { "cell_type": "code", "execution_count": null, "id": "18", "metadata": {}, "outputs": [], "source": [ "points_x = np.array([0.0, 1.0, 0.0, 1.0])\n", "points_y = np.array([0.0, 0.0, 1.0, 1.0])\n", "triangles = [[0, 1, 2], [1, 3, 2]]\n", "values = points_x + points_y\n", "\n", "canvas = Canvas()\n", "canvas.quiver(points_x, points_y, np.ones(4), np.ones(4))\n", "canvas.triplot(points_x, points_y, triangles=triangles)\n", "canvas.tripcolor(points_x, points_y, values, triangles=triangles, alpha=0.3)\n", "canvas.tricontour(points_x, points_y, values, triangles=triangles)\n", "canvas.show()" ] }, { "cell_type": "markdown", "id": "19", "metadata": {}, "source": [ "## Statistical and event plots" ] }, { "cell_type": "code", "execution_count": null, "id": "20", "metadata": {}, "outputs": [], "source": [ "canvas = Canvas()\n", "canvas.stem([0, 1, 2], [1, 3, 2])\n", "canvas.stackplot([0, 1, 2], [1, 2, 1], [2, 1, 2], alpha=0.4)\n", "canvas.set_title(\"Discrete and stacked data\")\n", "canvas.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "21", "metadata": {}, "outputs": [], "source": [ "canvas = Canvas()\n", "canvas.boxplot([[1, 2, 3], [2, 4, 5]])\n", "canvas.violinplot([[1, 2, 3], [2, 4, 5]])\n", "canvas.eventplot([[0.2, 0.5], [1.0, 1.5]])\n", "canvas.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3", "path": "/Library/Frameworks/Python.framework/Versions/3.13/share/jupyter/kernels/python3" } }, "nbformat": 4, "nbformat_minor": 5 }