Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save mrm8488/7a6f73c250449003290ef03c4ef45b1c to your computer and use it in GitHub Desktop.
Save mrm8488/7a6f73c250449003290ef03c4ef45b1c to your computer and use it in GitHub Desktop.
This notebook dives deep into Matplotlib's Figures, Axes, subplots and the very amazing GridSpec!
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 274,
"metadata": {},
"outputs": [],
"source": [
"%config Completer.use_jedi = False\n",
"# Speed up tab autocompletion"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%reload_ext autoreload\n",
"%autoreload 2\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib as mpl"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Setting up"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Matplotlib has many styles available, we can see the available options using:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['seaborn-dark',\n",
" 'seaborn-darkgrid',\n",
" 'seaborn-ticks',\n",
" 'fivethirtyeight',\n",
" 'seaborn-whitegrid',\n",
" 'classic',\n",
" '_classic_test',\n",
" 'fast',\n",
" 'seaborn-talk',\n",
" 'seaborn-dark-palette',\n",
" 'seaborn-bright',\n",
" 'seaborn-pastel',\n",
" 'grayscale',\n",
" 'seaborn-notebook',\n",
" 'ggplot',\n",
" 'seaborn-colorblind',\n",
" 'seaborn-muted',\n",
" 'seaborn',\n",
" 'Solarize_Light2',\n",
" 'seaborn-paper',\n",
" 'bmh',\n",
" 'tableau-colorblind10',\n",
" 'seaborn-white',\n",
" 'dark_background',\n",
" 'seaborn-poster',\n",
" 'seaborn-deep']"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plt.style.available"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We shall use `seaborn`"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"plt.style.use('seaborn')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exploration\n",
"Going into `plt.subplots` documentation (hit `Shift+Tab+Tab`) reveals some of the other matplotlib internals that it uses in order to give us what we asked for. \n",
"\n",
"These include :<br>\n",
"1. `plt.subplot`\n",
"3. `plt.figure`\n",
"3. `mpl.figure.Figure`\n",
"4. `mpl.figure.Figure.add_subplot`\n",
"5. `mpl.gridspec.GridSpec`\n",
"6. `mpl.axes.Axes`\n",
"\n",
"Let's try and figure out what these functions / classes do."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Recreating `plt.subplots` with basic matplotlib functionality"
]
},
{
"cell_type": "code",
"execution_count": 276,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0.98, '2x2 Grid')"
]
},
"execution_count": 276,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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AKsoHwAAwCrKBwAAsIryAQAArKJ8AAAAqygfAADAKsoHAACwivIBAACsonwAAACrKB8AAMAqygcAALCK8gEAAKyifAAAAKsoHwAAwCrKBwAAsCph+YhGo1q7dq1KSkpUXl6uzs7OW55TWVmpvXv3JiUkAHcxQwAMlrB8NDY2KhwOq76+XlVVVaqpqRlyzssvv6zPPvssKQEBuI0ZAmCwhOWjtbVV+fn5kqTc3Fy1t7cPOH7o0CF5PB7Nnz8/OQkBOI0ZAmAwb6ITQqGQfD5fbDstLU2RSERer1cdHR06ePCgtm7dqtra2tu+qN+fNby0KeZibhczS27mdjGzDcyQm8htj4uZJXdz36mE5cPn86mnpye2HY1G5fX2f9m+fft04cIFrVixQp988olGjhypyZMnJ/wTzMWLV79kbPv8/izncruYWXIzt4uZJTuDjhnSz+WfEddyu5hZcjP3cGdIwvKRl5enY8eO6Yc//KHa2toUDAZjx5555pnYr7dt26Zx48axdApgAGYIgMESlo+CggI1NzertLRUxhhVV1errq5OgUBACxcutJERgMOYIQAG8xhjjO2LurasJLm7HOZaZsnN3C5mlty9v+zqe01uO1zMLLmZe7gzhIeMAQAAqygfAADAKsoHAACwivIBAACsonwAAACrKB8AAMAqygcAALCK8gEAAKyifAAAAKsoHwAAwCrKBwAAsIryAQAArKJ8AAAAqygfAADAKsoHAACwivIBAACsonwAAACrKB8AAMAqygcAALCK8gEAAKyifAAAAKu8iU6IRqNav369PvzwQ6Wnp2vjxo2aMmVK7Pju3bv1zjvvSJIWLFigp59+OnlpATiHGQJgsIQrH42NjQqHw6qvr1dVVZVqampix86fP6/9+/frjTfeUH19vX71q1/pgw8+SGpgAG5hhgAYLOHKR2trq/Lz8yVJubm5am9vjx2bMGGCdu3apbS0NElSJBLRqFGjkhQVgIuYIQAGS1g+QqGQfD5fbDstLU2RSERer1cjR45Udna2jDHavHmzcnJyNHXq1IQX9fuzvlzqFHExt4uZJTdzu5jZBmbITeS2x8XMkru571TC8uHz+dTT0xPbjkaj8npvfllfX5+ef/55ZWZmat26dbd10YsXrw4jamr5/VnO5XYxs+RmbhczS3YGHTOkn8s/I67ldjGz5Gbu4c6QhJ/5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\n",
"text/plain": [
"<Figure size 576x396 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# This is what we need to recreate. We'll try and get a bit more creative though\n",
"fig, ax = plt.subplots(2,2)\n",
"fig.suptitle(\"2x2 Grid\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Deviating..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I didn't know this was possible:"
]
},
{
"cell_type": "code",
"execution_count": 277,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x396 with 2 Axes>"
]
},
"execution_count": 277,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig = mpl.figure.Figure();\n",
"\n",
"fig.suptitle(\"Exploring a Figure\")\n",
"\n",
"ax1 = mpl.axes.Axes(fig=fig, rect=[0,0,0.8,0.8], fc='red')\n",
"ax2 = mpl.axes.Axes(fig=fig, rect=[0.2, 0.2, 0.4, 0.4], fc='blue')\n",
"# rect : [left, bottom, width, height] : specifies position and size of an Axes inside of a Figure\n",
"\n",
"fig.add_axes(ax1)\n",
"fig.add_axes(ax2)\n",
"\n",
"fig"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*That means you can put random axes at random places inside of a Figure. Hmm. Interesting.*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Recreating our subplots literally from scratch"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"An `Axes` in matplotlib is simply a place where you can draw plots. Think of it as a page in a notebook (where the figure is the notebook) except the fact that this page can be of various sizes and can be placed at various positions.\n",
"\n",
"A `Figure` simply holds a given number of axes at a time\n",
"\n",
"You can create a Figure (Notebook hard-cover) and Axes (pages) separately and then decide where to put each `Axes` in the `Figure`"
]
},
{
"cell_type": "code",
"execution_count": 278,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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HDnS7GqTdGolqlevXvrwww/1xBNPaM+ePXI6nfrOd77j+8ROaz/1c/rrTgsLC/M9x+n38nxzleBsepPkW6k4rUOHDrrkkkt07NixVtX4ryZPniyn06lXXnlFTz75pBoaGtS7d289/PDDuvnmm1v1XF26dPGF2dMuvfRS1dTUNHrsm32cfj2a6+P0Y9/8s3U4HLrkkkuaPPdpPXv21IsvvqhVq1Zpw4YN+v3vf69OnTopLS1Ns2bNUkREhFwuV5M/r391emVq8ODBys/Pb/RenNb47LPPNHXqVP3zn//UsmXLNGzYsGaPi4qK0vHjx9t0DuBsEHiAIOvYsaPy8vJ02223adasWXrzzTcVGRkpp9OpsLAwZWVl6fbbb2/ydad/wERHR6u6urrJ/k8++UQRERH6zne+0+x5o6OjdcUVVzR5w+1pffr08b3XY+TIkXrmmWd0+eWXKywsTOvWrdP7779/Dl03dXpl4fDhw40uW3zzTc1n8s03KDc0NJx1GDyTsLAwjRs3TuPGjVNNTY0++OADrVy5UjNmzNDWrVv1rW99S5KavE/o9Ptg/lVNTY28Xq86dPj/hfPDhw83CXjf7OPw4cOSmg9+MTExvmM6d+7se/zrr7/WkSNHdMkll5yxt+9+97v67W9/q4aGBn3yySd67bXX9MILL6hnz57Kzs7WJZdcon/+859Nvs7r9eoXv/iFXn31VaWlpenxxx9vtHLYGp988onuu+8+SVJhYaGSkpLOeGxNTU2L/QDniktawHnQu3dv3Xfffdq3b5/v0yidO3fWNddco71796p///6+XwkJCVqxYoXv01SDBg3S/v379de//tX3fF9//bVmzJih559//oznvP766/XFF1+oS5cujZ6/vLxcK1asUIcOHVRVVaX6+nrdc889uuKKK3yXN0pLSyX9/w/68PDwc34NvvOd7yg6Olpvv/12o8ffeuuts/r60tJS1dfX+7a3bNkij8ejG264odnj/zV4nElmZqYef/xxSdLFF1+sW265RdOmTZPH4/F9IsnpdDYJBs19ouzrr79uFBJdLpe2bt2q66+/vtFxW7ZsabS9efNmRUZGNhsGTr/3atOmTY0ef/PNN9XQ0OBbLfxmr4WFhRo2bJjq6+sVHh6upKQkPfroo+rUqZP2798v6dR7yg4cONAkzD366KN69dVX9eCDD+qJJ55oc9j5n//5H91zzz1yOp0qLi5uMewcPXpUdXV1Z3yvFRAIrPAA58m9996rjRs3atWqVbrjjjt0xRVXKCcnR1OmTNFPf/pT3yrP2rVrVV5e7ntjZ1pamtauXasHHnhA06dPV2xsrF566SV99dVXuueee854vrFjx2rdunW6++67dd999+nyyy/X9u3btWrVKo0dO1adOnXSNddcI4fDoSVLlmjy5Mn6+uuv9eqrr/rC1un330RHR0s6FTpiY2Pb9MZSp9OpKVOmaNmyZYqKitL111+vP//5z3rppZck+Q8ohw4d0r333qtJkybpiy++0NKlS3XjjTfqxhtvbPb40+/32bJli26++WbFxcXpH//4hw4fPuy7T9L3vvc9rVmzRjExMRo0aJC+/PJLLV++XH369PG9GXz48OH6z//8T/Xv319XX3213nrrLe3cubPJ+Tp27Khf/epX+vnPf66LL75Yq1at0smTJ5vcnLGkpEQLFizQsGHDtH37dq1fv17Tp09v9pYFV111lcaOHatnnnlGJ0+e1HXXXafdu3frmWee0fe+9z3fx8e/2ev3v/99LVmyRNOmTdPEiRMVERGhN954o9F7qG666SY999xz2r17t/r27Svp1JuGX3rpJV133XW64YYbVF5e3qiehIQERUdH68svv9T//u//+rabM2/ePNXW1mru3Lk6ePBgo4+iR0dHKyEhwbd9+jwpKSnNPhcQCAQe4DyJjIzU3Llzdf/99+uJJ57QM888oxtvvFEFBQVavny5Hn74YTkcDn33u9/V6tWr9f3vf1/SqaDwwgsvaPHixVq8eLHcbrf69eun559/vsXg0alTJ73wwgtaunSpli1bppqaGvXs2VPTp0/XvffeK+nUytOSJUu0fPlyTZ8+XTExMbr22mu1du1aZWVlqby8XH379tXVV1+tH/3oR1q3bp327t2rVatWtek1mDp1qrxer4qKivSHP/xBiYmJeuSRR5Sbm6tOnTq1+LWjR4/Wt771LT3yyCOKiorS2LFj9dBDD53x+BtuuEE33XSTnnrqKe3bt0+PPvqofve73+m1117Tp59+Kkn6+c9/rqioKP3Hf/yHVq9erU6dOmnw4MF65JFHfCsbc+bMkdfr1dNPP60OHTpo+PDhWrhwoR544IFG54uJidHcuXP1m9/8RgcOHNCAAQO0du1a3z1sTvvZz36m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\n",
"text/plain": [
"<Figure size 576x396 with 4 Axes>"
]
},
"execution_count": 278,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig = mpl.figure.Figure(); fig\n",
"\n",
"fig.suptitle(\"Recreating plt.subplots(2, 2)\")\n",
"\n",
"ax1 = mpl.axes.Axes(fig=fig, rect=[0,0,0.42,0.42])\n",
"ax2 = mpl.axes.Axes(fig=fig, rect=[0, 0.5, 0.42, 0.42])\n",
"ax3 = mpl.axes.Axes(fig=fig, rect=[0.5,0,0.42,0.42])\n",
"ax4 = mpl.axes.Axes(fig=fig, rect=[0.5, 0.5, 0.42, 0.42])\n",
"# rect : [left, bottom, width, height] : specifies position and size of an Axes inside of a Figure\n",
"\n",
"fig.add_axes(ax1)\n",
"fig.add_axes(ax2)\n",
"fig.add_axes(ax3)\n",
"fig.add_axes(ax4)\n",
"\n",
"fig\n",
"\n",
"# That means you can put random axes at random places inside of a Figure. Hmm. Interesting."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using gridspec.GridSpec\n",
"Docs : https://matplotlib.org/api/_as_gen/matplotlib.gridspec.GridSpec.html#matplotlib.gridspec.GridSpec\n",
"\n",
"GridSpec objects allow us fine-grained control over how our plot is exactly divided into subplots.<br>\n",
"You can essentially decide how your plot will be divided into subplots and what their relative sizes will be using a GridSpec.\n",
"\n",
"Using our previous analogy, this helps us restrict (or pre-decide) where and how our pages will be fit inside of any notebook they go into. Or look at it another way, we can have each page say how it wants to be placed no matter what notebook you put them into by using `GridSpec`\n",
"\n",
"Lets see how you can use this"
]
},
{
"cell_type": "code",
"execution_count": 305,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Figure(576x396)\n",
"Figure(576x396)\n"
]
},
{
"data": {
"text/plain": [
"<Figure size 576x396 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# But first, let's get this over with\n",
"fig1 = plt.figure();\n",
"fig2 = mpl.figure.Figure(); \n",
"\n",
"print(fig1)\n",
"print(fig2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**It seems as if both fig1 and fig2 give back identical objects**\n",
"\n",
"So, we'll switch to using just `plt.figure()` instead of `mpl.figure.Figure()` to save keystrokes"
]
},
{
"cell_type": "code",
"execution_count": 280,
"metadata": {},
"outputs": [],
"source": [
"def annotate_axes(fig):\n",
" \"\"\"Taken from https://matplotlib.org/gallery/userdemo/demo_gridspec03.html#sphx-glr-gallery-userdemo-demo-gridspec03-py\n",
" takes a figure and puts an 'axN' label in the center of each Axes\n",
" \"\"\"\n",
" for i, ax in enumerate(fig.axes):\n",
" ax.text(0.5, 0.5, \"ax%d\" % (i+1), va=\"center\", ha=\"center\")\n",
" ax.tick_params(labelbottom=False, labelleft=False)"
]
},
{
"cell_type": "code",
"execution_count": 289,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 576x396 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"\n",
"# We will try and vary axis sizes here just to see what happens\n",
"# Look at the resulting figure and try and figure out what's going on with each parameter\n",
"gs = mpl.gridspec.GridSpec(nrows=2, ncols=2, width_ratios=[1, 2], height_ratios=[4, 1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can pass `GridSpec` objects to a `Figure` to create subplots in your desired sizes and proportions like so :"
]
},
{
"cell_type": "code",
"execution_count": 292,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x396 with 4 Axes>"
]
},
"execution_count": 292,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig.clear()\n",
"ax1, ax2, ax3, ax4 = [fig.add_subplot(gs[0]),\n",
" fig.add_subplot(gs[1]),\n",
" fig.add_subplot(gs[2]),\n",
" fig.add_subplot(gs[3])]\n",
"\n",
"annotate_axes(fig)\n",
"fig"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"Doing the same thing in a simpler way\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 293,
"metadata": {},
"outputs": [],
"source": [
"def add_gs_to_fig(fig, gs): \n",
" for g in gs: fig.add_subplot(g)"
]
},
{
"cell_type": "code",
"execution_count": 294,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x396 with 4 Axes>"
]
},
"execution_count": 294,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig.clear()\n",
"add_gs_to_fig(fig, gs)\n",
"annotate_axes(fig)\n",
"fig"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## A very weird observation: (which gives us yet more clarity)\n",
"Notice how after each print operation, different addresses get printed for each `gs` object."
]
},
{
"cell_type": "code",
"execution_count": 295,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(<matplotlib.gridspec.SubplotSpec at 0x1a2d3fd750>,\n",
" <matplotlib.gridspec.SubplotSpec at 0x1a2d3fde90>,\n",
" <matplotlib.gridspec.SubplotSpec at 0x1a2c056450>,\n",
" <matplotlib.gridspec.SubplotSpec at 0x1a2c056750>)"
]
},
"execution_count": 295,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gs[0], gs[1], gs[2], gs[3]"
]
},
{
"cell_type": "code",
"execution_count": 296,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(<matplotlib.gridspec.SubplotSpec at 0x1a2d3e7550>,\n",
" <matplotlib.gridspec.SubplotSpec at 0x1a2d3e7750>,\n",
" <matplotlib.gridspec.SubplotSpec at 0x1a2d3e7dd0>,\n",
" <matplotlib.gridspec.SubplotSpec at 0x1a2d3e7310>)"
]
},
"execution_count": 296,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gs[0], gs[1], gs[2], gs[3]"
]
},
{
"cell_type": "code",
"execution_count": 297,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<matplotlib.gridspec.SubplotSpec object at 0x1a2d3ded10> <matplotlib.gridspec.SubplotSpec object at 0x1a2c063650> <matplotlib.gridspec.SubplotSpec object at 0x1a2c0632d0> <matplotlib.gridspec.SubplotSpec object at 0x1a2c063f90>\n"
]
}
],
"source": [
"print(gs[0,0], gs[0,1], gs[1, 0], gs[1, 1])"
]
},
{
"cell_type": "code",
"execution_count": 298,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<matplotlib.gridspec.SubplotSpec object at 0x1a2d3b94d0> <matplotlib.gridspec.SubplotSpec object at 0x1a2d3b9c10> <matplotlib.gridspec.SubplotSpec object at 0x1a2d3b9fd0> <matplotlib.gridspec.SubplotSpec object at 0x1a2d3b9d90>\n"
]
}
],
"source": [
"print(gs[0,0], gs[0,1], gs[1, 0], gs[1, 1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lets understand why this happens:**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*Notice how a group of `gs` objects indexed into at the same time also produces just one object instead of multiple objects*"
]
},
{
"cell_type": "code",
"execution_count": 299,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(<matplotlib.gridspec.SubplotSpec at 0x1a2d707210>,\n",
" <matplotlib.gridspec.SubplotSpec at 0x1a2c063c10>)"
]
},
"execution_count": 299,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gs[:,:], gs[:, 0]\n",
"# both output just one object each"
]
},
{
"cell_type": "code",
"execution_count": 300,
"metadata": {},
"outputs": [],
"source": [
"# Lets try another `gs` object, this time a little more crowded\n",
"# I chose the ratios randomly\n",
"gs = mpl.gridspec.GridSpec(nrows=3, ncols=3, width_ratios=[1, 2, 1], height_ratios=[4, 1, 3])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now notice how we can create different kinds of plots **while using the same `GridSpec` object** using this knowledge:"
]
},
{
"cell_type": "code",
"execution_count": 302,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x396 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"ax1 = fig.add_subplot(gs[:2, 0])\n",
"ax2 = fig.add_subplot(gs[2, 0])\n",
"ax3 = fig.add_subplot(gs[:, 1:])\n",
"annotate_axes(fig)"
]
},
{
"cell_type": "code",
"execution_count": 303,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x396 with 9 Axes>"
]
},
"execution_count": 303,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig.clear()\n",
"add_gs_to_fig(fig, gs)\n",
"annotate_axes(fig)\n",
"fig"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This ability to create different grid variations that `GridSpec` provides is probably the reason for that anomaly we just saw.\n",
"\n",
"It creates new objects everytime you index into it because it will be very troublesome to store all permutations of grid-spec objects into one group in memory (try and count permutations for a `GridSpec` of 10x10 and you'll know why)\n",
"\n",
"---\n",
"## Now let's finally create `plt.subplots(2,2)` once again using GridSpec"
]
},
{
"cell_type": "code",
"execution_count": 273,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"yayy\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAF2CAYAAADz3Ju4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAYqUlEQVR4nO3dfZjNdf7H8deJmIYxQ45dTNKNGSwmMjTMVDuMiu7r+pWNVqX2WrszGDeV1ur6jTY0ZstNd6hFbWbT5urGby/9qAYVRrUShSLDFIcWE7PG6PP7w+X8OqsGY5rj0/v5uK6u3c7dvM7p+Hp2znEKOOecAACAWWdEewAAAIguYgAAAOOIAQAAjCMGAAAwjhgAAMA4YgAAAOOIAeAk5OTkqEuXLjp8+HDE6Vu3blVycrLatWunPXv2RJy3d+9etW3bVvn5+Sf8c5KTk3XffffVyOYTsWLFCiUnJ+udd96ptZ/5Xfv27VNycrKuu+66qPx8wDpiADgJPXr00P79+7Vhw4aI04uKihQfHy/nnJYvXx5xXnFxsZxz6tmz50n9rEAgcMp7AeBEEAPASTj6G/rq1asjTl+6dKkuueQStW/fXkuXLo04r7i4WLGxsbr44otP+OcEg0E1a9bs1Ad74owzzoj4XwC1i195wEk455xzlJiYqPfffz98WkVFhVauXKkePXqoR48eWrZsmb77xZ6rVq1Samqq6tWrJ0n69ttvNXPmTPXp00cdOnRQ7969NWvWrIjrJCUlKTk5WZI0depUZWVl6emnn1b37t3Vo0cPffXVV5Kkl156Sddcc406dOigSy+9VJMnT1ZFRUWV98E5pxkzZqhXr17q1KmT7rjjDu3YseOYy23ZskU5OTlKT09XSkqKBgwYoFWrVoXP37Ztm5KTk7Vo0SLl5ubq4osvVpcuXTR8+HB9/fXXEbe1ZMkS3XzzzerUqZPS0tI0btw4lZWVhc+PjY1VIBBQw4YNj/vPAEDNIwaAk5SWlhYRA8XFxTpw4IAyMjKUnp6uUCik9evXS5L279+v9evXR7xFkJeXp4KCAvXp00fTp09Xv379lJ+fr0ceeSR8mWeeeUZ9+/YN//2XX36pBQsWaNKkSRo5cqR+/vOfa+bMmRozZow6d+6s6dOna+DAgZozZ45GjRpV5f6CggIVFBToqquu0tSpU3XBBRfogQceiLjMpk2bdOONN2rLli269957NWnSJEnSoEGD9O6770Zc9g9/+IMaNWqkP//5z8rJydEbb7yhhx56KHz+woULNWTIELVo0UKPPvqosrOz9Y9//EN33323KisrJR15RSAuLk6NGjU6oX8GAGqYA3BSXn/9dZeUlOS2b9/unHNuwoQJ7sorr3TOOXfw4EF30UUXuSeffNI559zSpUtdUlKS27Rpk3POuc2bN7vk5GQ3derUiNt84oknXLt27VxpaekxP2/KlCkuKSnJvfXWW+HTysrKXEpKirvvvvsiLvvKK6+4pKQk9/7773/v9rKyMveLX/zC5eXlRZw+ZswYl5SU5JYvX+6cc27o0KEuNTXV7d27N3yZiooK16dPH3f99dc755wrKSlxSUlJLicnJ+K2Ro4c6S666CLnnHPffvutu+yyy9zAgQMjLlNcXOySkpLcq6++Gj6td+/e7v777//e3QB+XLwyAJykSy65RIFAIPzqwNKlS5WRkSFJqlevnrp3765ly5ZJOvIWQfPmzXXBBRdIkt577z0559S7d29VVlaG/8rKytLhw4f13nvv/eDPPfq2gSR98MEHKi8vP+Z2fvnLX+qMM8445kOM373eoUOHlJWVFXH61VdfHfH3K1eu1KWXXhrxb+pnnnmmrr76aq1bty7iJf7//CxE8+bNVV5eLknavHmzvvzyS2VlZUXsTElJUTAYjNgZHx+v+Pj4H7z/AH48daM9APBNkyZN1LZtW61evVpdu3bVxo0bde+994bPT09P18SJE3Xw4EEVFxdHvEXwr3/9S5J+8I/Qfd9790c1bdr0mNsZMmTISd3O0T/22KRJk4jT//PDinv37lUwGPzBDd+NgbPOOiviMoFAIPz5h6M7x48fr/Hjx1e5kxgAoocYAKohLS1NK1as0DvvvKOYmBh169YtfF56erry8vJUXFysNWvWaMCAAeHzjv6b9rPPPqu4uLhjbvdE/wTB0duZOHFi+FWH72rcuPH3Xu9oBOzatUtt2rQJn370N+2j4uPjFQqFjrn+zp07JUkJCQnHfEiwqp0jRoxQWlraMec3aNAg/P8TEhKIASBKeJsAqIYePXpow4YNWrZsmVJTU1W/fv3wea1bt1ZiYqJefPFFVVZWRvwmmJqaKknavXu3OnbsGP7rwIEDys/PD/9mezwpKSmqV6+evvrqq4jbadiwoSZOnKjPPvvse6/XuXNnnXXWWXr99dcjTl+8eHHE36empqqoqEj79u0Ln1ZZWamFCxeqffv2io2NPaGd559/vpo2baqSkpKInYmJiXrkkUf04Ycfhi87efJk9e/f/4RuF0DN4pUBoBpSU1MVCAS0aNGi7/30fnp6ul566SV16NBBCQkJ4dOTkpJ0/fXX649//KNKSkqUkpKirVu36rHHHlPTpk0jPhdQlcaNG+vuu+/WtGnTtG/fPqWlpWn37t2aNm2a/v3vf6tDhw7fe73Y2FhlZ2dr0qRJiomJUUZGhlavXq3CwsKIy/3+979XUVGRBgwYoHvuuUf169fX3LlzVVJSoqeeeuqEH6c6deooNzc3/KcVevXqpQMHDmjGjBn64osvNG7cuPBli4uLFRcXd8KPAYCaQwwA1RATE6POnTtrxYoV4Q8PfldGRobmzZv3vd86+Kc//UnnnXee/v73v+vxxx9X48aNlZWVpaFDh4a/i+BE5OTkqFmzZnr++ec1Z84cNWrUSN27d9fw4cN19tln/+D17rrrLjVo0EDPPvusCgsL1b59ez300EMaNmxY+DJt2rTRX//6VxUUFGjs2LGSpE6dOmn27NnhVzdO1E033aSGDRtqxowZWrBggWJjY5WSkqLx48dHvMVx2223qVu3bpo7d+5J3T6AUxdw7jvfdAIAAMzhMwMAABhHDAAAYBwxAACAccQAAADGEQMAABhHDAAAYBwxAACAccQAAADGEQMAABhHDAAAYBwxAACAccQAAADGEQMAABhHDAAAYBwxAACAccQAAADGEQMAABhHDAAAYBwxAACAccQAAADGEQMAABhHDAAAYBwxAACAccQAAADGEQMAABhHDAAAYFyVMeCcq60dAH6iOI4Ap7+AO86v1FCorLa21JhgMM673T5ulvzc7eNm6chuX/n2ePv8HPFtt4+bJT93V3UM4W0CAACMIwYAADCOGAAAwDhiAAAA44gBAACMIwYAADCOGAAAwDhiAAAA44gBAACMIwYAADCOGAAAwDhiAAAA44gBAACMIwYAADCOGAAAwDhiAAAA44gBAACMIwYAADCOGAAAwDhiAAAA44gBAACMIwYAADCOGAAAwDhiAAAA44gBAACMIwYAADCOGAAAwLiAc85FewQAAIieuse7QChUVhs7alQwGOfdbh83S37u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\n",
"text/plain": [
"<Figure size 576x396 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"gs = mpl.gridspec.GridSpec(nrows=2, ncols=2)\n",
"add_gs_to_fig(fig, gs)\n",
"annotate_axes(fig)\n",
"fig.suptitle(\"We're done!\")\n",
"print(\"yayy\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# A few unrelated (maybe) words ..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I read a tweet by someone cursing matplotlib (for its API) a while ago and decided to finally understand what the hell is going on with these figures and axes and subplots and what not inside of this library. So I sat by myself and wrote the only thing I ever write when using matplotlib : `fig, ax = plt.subplots(a, b)` and made a commitment to get to the depth of what's going on under the hood here.\n",
"So I opened up the documentation for this function, made a list of all the other important seeming parts of the library that were mentioned here and went into the official docs for each, while also still tinkering with some other parts and functionalities that were not explicitly mentioned in the official docs.\n",
"The result of this exercise is: \n",
"1. This notebook\n",
"2. Me (and hopefully, anyone reading this) having a much more fundamental understanding of the most important components of a very important python visualization library\n",
"\n",
"This makes me reflect on how sometimes it is very important to take a few hours off from your day and just dive deeply into something with an intention to completely take apart as many layers and abstractions as you can. In the end you come out feeling much more powerful and capable than what you were when you decided to dive deep.\n",
"\n",
"Anyways, I hope you learned something from this notebook.\n",
"\n",
"To best absorb the contents of this notebook, I would recommend that you try and replicate each part of the notebook without looking at it again (barring a few sneak-peeks maybe)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.4"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment