{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Matplotlib: Getting started" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Matplotlib is a Python library to make plots ([or graphs or charts](https://english.stackexchange.com/questions/43027/whats-the-difference-between-a-graph-a-chart-and-a-plot)).\n", "\n", "On linux, you can install it with a package manager (unless you prefer to always work in a virtual environment). Otherwise use `pip install matplotlib`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matplotlib has two APIs\n", "\n", "1. An API originally intended to mimic matlab, called [pyplot](https://matplotlib.org/stable/tutorials/introductory/pyplot.html).\n", "2. A newer\n", "object oriented (OO) API.\n", "\n", "The main differences between these two are\n", "\n", "1. `pyplot` takes care of low level things like configuring the drawing \"back-end\".\n", "2. `pyplot` maintains an internal state (e.g. a list of open figures).\n", "\n", "If you are writing scripts, these are both nice things.\n", "If you are writing applications, you'll often want to configure the back-end manually, and will want to avoid having any state outside of your own program's." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's an example using pyplot:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "# Create a figure, stored inside the pyplot module:\n", "plt.figure()\n", "\n", "# Plot something on the axes of our figure\n", "plt.xlabel('x')\n", "plt.ylabel('y')\n", "plt.plot([1, 2, 3], [4, 2, 7])\n", "\n", "# Show all open figures on the screen\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After running this (in jupyter notebook), the figure is closed:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# We can try to show() again, but nothing happens\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Similarly, nothing happens if we close before showing\n", "plt.figure()\n", "plt.xlabel('x')\n", "plt.ylabel('y')\n", "plt.plot([1, 2, 3], [4, 2, 7])\n", "plt.close('all')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If this smells a bit error-prone to you, you can use the object oriented interface instead.\n", "(It's also just nicer.)\n", "\n", "Unfortunately, figure creation without `pyplot` is a bit low-level:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Load a back-end module and import its Canvas implementation\n", "from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas\n", "\n", "# Import the Figure class\n", "from matplotlib.figure import Figure\n", "\n", "# Create a figure without a \"canvas\"\n", "fig = Figure()\n", "\n", "# Attach a canvas to the figure\n", "FigureCanvas(fig)\n", "\n", "# Plot some things\n", "ax = fig.add_subplot()\n", "ax.set_xlabel('x')\n", "ax.set_ylabel('y')\n", "ax.plot([1, 2, 3], [4, 2, 7])\n", "\n", "# But how do we show?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How do we know what backend to use? And what is a backend anyway? If you're using matplotlib from a script you probably don't want to think about this kind of stuff.\n", "\n", "And how do we get jupyter notebook to show this figure?\n", "It has nice magical ways to interact with pyplot, but now we'll need to do this manually instead.\n", "Some online searching reveals it's like this:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAEGCAYAAABvtY4XAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAlfklEQVR4nO3dd3xUVf7/8dchJITeEnoJvUgNkd5BVrBjQQG7IgiClXX153Z1BUTpWNdCEVCxYAGREoogSegl9F4SSggtpJ3fHwnfzbKUCeTOnZm8n49HHk7mTnI+3D37mZtz77yvsdYiIiKBp4DbBYiIiDPU4EVEApQavIhIgFKDFxEJUGrwIiIBqqDbBeQUFhZmIyIi3C5DRMRvxMbGHrXWhl9qm081+IiICGJiYtwuQ0TEbxhj9lxum5ZoREQClBq8iEiAUoMXEQlQavAiIgFKDV5EJEA51uCNMfWMMWtyfCUbY551ajwREflvjl0maa2NB5oBGGOCgAPAbKfGExGR/+atJZpuwA5r7WWv1xQRyY9+33WcD5fsxInodm81+PuB6ZfaYIwZYIyJMcbEJCYmeqkcERH3JZxKYfC0OKau3Mu5tIw8//2ON3hjTAhwOzDrUtutte9ba6OstVHh4Zf8tK2ISMBJz8jkmWmrOZWSxqT+kRQJyfsVc29EFfQE4qy1R7wwloiIXxg1bysrdx1n9H1NqV+hhCNjeGOJ5gEuszwjIpIf/bLpCJMX76Bvq2r0jqzi2DiONnhjTBHgJuBrJ8cREfEXe46d4fmZa2hcuSR/vrWho2M5ukRjrT0LlHVyDBERf5GSlsGgKXEUMIaJ/SIJDQ5ydDyfigsWEQlkf/l2I5sOJfPxI1FULVPE8fEUVSAi4gUzV+1jRsw+hnSpTdf65b0yphq8iIjDNh48yWvfbqBd7bI8d1Ndr42rBi8i4qCT59IYNCWO0kVCGHN/c4IKGK+NrTV4ERGHWGt5cdZaDiadY8ZTbQgrVsir4+sIXkTEIe9F7+SXTUd4pVcDWlQv7fXx1eBFRBywYucxRvy8hVuaVOTRdhGu1KAGLyKSxxKSUxgybTURYUV56+4mGOO9dfectAYvIpKH0jMyGTJ9NWfOpzPtyVYUK+Rem1WDFxHJQyPnxvP7ruO826cZdcsXd7UWLdGIiOSRuRsP8170Tvq3rsadzSu7XY4avIhIXth99AwvzlxL0yolec3hEDFPqcGLiFynlLQMBk2NIyjIMKFfJIUKOhsi5imtwYuIXAdrLf/vmw1sOZzMx4/cSJXSzoeIeUpH8CIi12HGqn18GbufZ7rUpku9cm6X81/U4EVErtGGAyf583cb6VAnjGHdvRci5ik1eBGRa3DybBqDpsZStmgI7/Zp5tUQMU9pDV5EJJcyMy0vzFrD4ZMpzHiqDWW9HCLmKR3Bi4jk0uToHczfnMCrvRoQWc37IWKeUoMXEcmF5TuOMmpuPLc1rcTDbSPcLueK1OBFRDx0JDmFodNXUyOsKP/q3di1EDFPaQ1eRMQDaRmZDJkWx9nUDKY/2ZqiLoaIecr3KxQR8QEjft7Cqt0nGHN/M+q4HCLmKS3RiIhcxc8bDvHBkl081KY6dzRzP0TMU2rwIiJXsOvoGV6atY6mVUvx6i0N3C4nV9TgRUQu41xqBoOmxFIwyDDRh0LEPKU1eBGRS7DW8uo364k/copPHm1J5VKF3S4p13QELyJyCdN/38fXcQcY2rUOneqGu13ONVGDFxG5yPr9J/nrdxvpWDecod3quF3ONVODFxHJIelsKoOmxhJWzHdDxDylNXgRkWyZmZbnZ67lSHIKswa2pUzRELdLui6OHsEbY0oZY740xmwxxmw2xrRxcjwRkesxafEOFmxJ4LVbG9Ksaim3y7luTh/BjwF+ttbeY4wJAXznXlYiIjks236Ut+fFc3vTSjzYurrb5eQJxxq8MaYE0BF4BMBamwqkOjWeiMi1OnwyK0SsZngx3vSDEDFPOblEUxNIBP5tjFltjPnQGFP04hcZYwYYY2KMMTGJiYkOliMi8r8uhIidS8tgcv9IvwgR85STDb4gEAlMstY2B84AL1/8Imvt+9baKGttVHi4f15rKiL+618/bSFmzwneursJtcv5R4iYp5xs8PuB/dbaldnff0lWwxcR8Qk/rj/ER0t38UjbCG5rWsntcvKcYw3eWnsY2GeMqZf9VDdgk1PjiYjkxo7E0wz/ch3Nq5XilV7+FSLmKacXm54BpmZfQbMTeNTh8URErupsajqDpsQSUrAAE/pGElIwMD/z6WiDt9auAaKcHENEJDestbw6ewPbEk7z2WMtqeSHIWKeCsy3LRGRy5i6ci+zVx/g2W516VAnsC/sUIMXkXxj3f4k/v79JjrXC+eZrrXdLsdxavAiki+cOJPKoClxhBcvxDv3NaOAH4eIeSpwrugXEbmMzEzLczPXkHjqPLMGtqG0n4eIeUpH8CIS8CYs3M6i+EReu60hTQMgRMxTavAiEtCWbjvK6PlbubNZJfq3quZ2OV6lBi8iAevQyXMM/WI1dcoV440AChHzlBq8iASk1PRMBk+N43xaBpP6t6BISP475Zj//sUiki+8+dNm4vYmMaFvJLXCi7ldjit0BC8iAWfOuoP8e9luHm0XwS1NKrpdjmvU4EUkoGxPOM0fv1xHZLVS/KlnYIaIeUoNXkQCxpnzWSFihYKDmNAvcEPEPKU1eBEJCNZaXpm9nu2Jp/n8sVZULBm4IWKeyt9vbyISMKas2MO3aw7ywk11aV8nzO1yfIIavIj4vTX7kvj7nE10rV+OpzsHfoiYp9TgRcSvnTiTyuCpcZQvEcro+5rmixAxT2kNXkT8Vmam5dkZWSFiXw5qQ6ki+SNEzFM6ghcRvzVuwXYWb03kL7c3pEmVUm6X43PU4EXEL0VvTeTdX7fSu3ll+rbMXyFinlKDFxG/czDpHMO+WE3dcsV5/a78FyLmKTV4EfErqemZPD01jrQMy6T+kRQOCXK7JJ+lk6wi4lfe+HEza/YlMbFfJDXzaYiYp3QELyJ+47u1B/lk+W4eb1+DXo3zb4iYp9TgRcQvbDtyipe/WkdU9dK83LO+2+X4BTV4EfF5Z86nM2hqHEVCghjfN5LgILUuT2gNXkR8mrWWl79ez87E00x5vBUVSoa6XZLf0NugiPi0z37bw/drD/JCj3q0ra0QsdxQgxcRnxW39wT//GET3eqXY1CnWm6X43fU4EXEJx0/k8qQqXFUKBnK6PuaKUTsGmgNXkR8TkamZdgXqzl6JpWvB7WlZJFgt0vyS442eGPMbuAUkAGkW2ujnBxPRALD2F+3sWTbUd7s3ZhGlUu6XY7f8sYRfBdr7VEvjCMiAWBRfAJjF2zj7sgq3H9jVbfL8WtagxcRn3Eg6RzPzlhDvfLF+eedjRQidp2cbvAWmGeMiTXGDLjUC4wxA4wxMcaYmMTERIfLERFfdT49g6enxpGRYZnUv4VCxPKA0w2+nbU2EugJDDbGdLz4Bdba9621UdbaqPDwcIfLERFf9foPm1m7L4mR9zahRlhRt8sJCI42eGvtwez/JgCzgZZOjici/unbNQf47Lc9PNmhBjc3UohYXnGswRtjihpjil94DPQANjg1noj4p61HTvHyV+u5MaI0w29WiFhecvIqmvLA7OyTJAWBadbanx0cT0T8zOnz6QycEkvRQgUVIuYAxxq8tXYn0NSp3y8i/s1ayx+/Wsfuo2eY+kRrypdQiFhe09uliLjik+W7+WHdIV76Q33a1CrrdjkBSQ1eRLwuds8JXv9hM90blGdgp5pulxOw1OBFxKuOnT7PkGlxVCpVmLfva6oPMzlIYWMi4jVZIWJrOHYhRKywQsScpCN4EfGaMfO3snT7Uf5xxw0KEfMCNXgR8YqF8QmMXbCde1tUoc+N1dwuJ19QgxcRx+0/cZbnZqyhQcUS/OPORm6Xk2+owYuIo/4rRKxfJKHBChHzFp1kFRFH/f37Tazbf5L3HmxBhELEvEpH8CLimNmr9zN15V6e6liTP9xQwe1y8h01eBFxRPzhU/zp6/W0rFGGl/5Qz+1y8iU1eBHJc6dS0hg0JZZihYIZ/0BzCipEzBVagxeRPHUhRGzP8bNMe6IV5RQi5pqrvq0aY4YYY0p7oxgR8X8fL9vNj+sPM/wP9WhVUyFibvLk76YKwCpjzExjzM1GwREichkxu4/z5o+b6dGwPAM6KkTMbVdt8Nba/wfUAT4CHgG2GWPeMMbUcrg2EfEjR0+fZ/C0OCqXLszIexUi5gs8OvNhrbXA4eyvdKA08KUxZoSDtYmIn8gKEVtN0tk0JvVroRAxH3HVk6zGmKHAw8BR4EPgJWttmjGmALANGO5siSLi6975ZSvLth9jxD1NaFiphNvlSDZPrqIJA3pba/fkfNJam2mMudWZskTEXyzYcoTxC7fTJ6oq90VVdbscyeGqDd5a++crbNuct+WIiD/Zd/wsz81YS8OKJfjbHTe4XY5cRJ8+EJFrkpKWwaCpsWRay+T+LRQi5oP0QScRuSZ/+34TGw4k88FDUVQrW8TtcuQSdAQvIrn2Vex+pv++l4GdanFTw/JulyOXoQYvIrmy5XAyr36zntY1y/Bij7pulyNXoAYvIh5LTklj0JQ4SoQGM1YhYj5Pa/Ai4hFrLcNnrWPv8bNMf7I15YorRMzX6e1XRDzy0dJd/LzxMC/fXJ+WNcq4XY54QA1eRK5q1e7jvPnTFm6+oQJPdKjhdjniITV4EbmixFPnGTw1jqqlCzPi3iYKEfMjWoMXkctKz8hk6PTVJKek8eljLSkRqhAxf6IGLyKXNfqXrfy28xij7m1Kg4oKEfM3ji/RGGOCjDGrjTFznB5LRPLO/E1HmLhoBw+0rMo9Laq4XY5cA2+swQ8DHA0lS0nLcPLXi+Q7e4+d5bmZa2hUuQR/uU0hYv7K0QZvjKkC3EJWjrwj0jIy6TVmCc/PWMPeY2edGkYk37gQImaASf0UIubPnD6Cf5esG4JkXu4FxpgBxpgYY0xMYmJirgdIy8ike8Py/LD+EF3fXsQrs9dz6OS5a69YJJ/763cb2XgwmXf6NKNqGYWI+TPHGnz2zUASrLWxV3qdtfZ9a22UtTYqPDw81+MUCSnIK70aED28Cw+0rMasmH10GrmIf8zZxNHT56+1fJF8aVbMPr5YtY+nO9eiWwOFiPk7k3W7VQd+sTFvAg+SdQ/XUKAE8LW1tv/lfiYqKsrGxMRc17j7jp9lzK/b+DpuP6HBQTzWrgZPdqype0SKXMWmg8ncNXEZkdVK8/njLZUz4yeMMbHW2qhLbnOqwV9UQGfgRWvtFW/xlxcN/oLtCad5Z/5Wflh3iBKhBXmqUy0eaRtB0UK6MlTkYskpadw+binn0jKY80wHwosXcrsk8dCVGnzAvkXXLleMCX0j+WFoe26MKMPIufF0GrmQj5bu0lU3IjlYa3lx5lr2nzjHhL6Rau4BxCsN3lq76GpH7065oVJJPnrkRr4a1Ja65Yvzjzmb6DJqEdNW7iUt47LnfkXyjQ+W7GTepiO83LM+UREKEQskAXsEf7EW1Usz7cnWTHuiFRVKhvLK7PV0H72Y2av3k5Hp/DKViC9aufMYb/0cT6/GFXi8vULEAk2+afAXtK0dxteD2vLRw1EUCSnIczPW0nNMND9vOIQ3zkeI+IqEUykMmb6a6mWK8NbdChELRPmuwQMYY+jWoDw/PNOe8X2bk55pGTgljtvHL2NRfIIavQS89IxMnpm2mlMpaUzsH0lxhYgFpHzZ4C8oUMBwa5NKzHu2IyPvacKJs6k88u9V3Pfeb6zceczt8kQcM2reVlbuOs4bdzWmfgWFiAWqfN3gLygYVIB7o6qy4IXO/OOOG9hz7Cx93l/Bgx+tZO2+JLfLE8lT8zYeZvLiHfRtVY3ekQoRC2ReuQ7eU3l5Hfz1OJeawecrdjNp0Q5OnE2jR8PyvNCjHvUqFHe7NJHrsufYGW4dt5SIskWZNbCNcmYCQL68Dv56FA4JYkDHWkQP78Jz3evy245j3DwmmmFfrGb30TNulydyTVLSMhg4JY4CxjCxX6Saez6gBn8FxUODGda9DtHDu/BUx1rM3XiYbqMX8/JX6ziYpEAz8S9//nYDmw8l806fpgoRyyfU4D1QumgIL/esT/TwLjzYujpfxx2g88hF/PW7jSSeUqCZ+L6Zq/YxM2Y/Q7rUpmt9hYjlF1qDvwYHks4xdv42vozbT0hQAR5pF8FTHWtSqkiI26WJ/I+NB0/Se+JyoiJK89ljrQgqoOvdA4nrYWOe8pcGf8HOxNO8O38b3687SLGQgjzZsSaPta9BMQWaiY84eS6N28YtJTU9kx+GtqdsMeXMBBqdZHVIzfBijH2gOT8N60DrWmUZ/ctWOo5YyAfROxVoJq6z1vLirLUcTDrHhH6Rau75kBp8HqhfoQQfPBTFN4PbcUOlErz+42Y6jVzI5yv2kJquQDNxx3vRO/ll0xFe6dWAFtVLu12OuEANPg81q1qKzx9vxRcDWlO1dBFe+2YD3UYv4stYBZqJd63YeYwRP2/hliYVebRdhNvliEu0Bu8Qay2Ltiby9rx4NhxIplZ4UZ6/qR49G1WggE5yiYMSklPoNXYpJQoX5Lsh7XVOKMBpDd4Fxhi61CvH90PaM6lfJMYYBk+L47bxS1mw5YgCzcQRaRmZDJm2mjPn05ncv4Waez6nBu8wYww9G1dk7rMdGX1fU06lpPPYJzHcM/k3lu846nZ5EmBGzo3n993HebN3Y+qWV7RGfqcG7yVBBQy9I6vw6wudeP2uRhw4cY6+H6yk34crWL33hNvlSQD4ecNh3o/eSf/W1bizeWW3yxEfoDV4l6SkZTBlxR4mLdrBsTOpdG9Qjhd61KNBRUW3Su7tOnqG28ctpWZ4UWYObEOhgsqZyS+0Bu+DQoODeKJDTaKHd+HFHnVZues4PccsYci0OHYknna7PPEj51IzGDQllqAgw4R+kWru8n/U4F1WtFBBhnStw9LhXRncpRYLtiRw0+jFvDRrLftPnHW7PPFx1lpe+3YD8UdO8U6fZlQprRAx+Q81eB9RskgwL/0hK9DskbY1+HbtQbqMWsSfv91AQnKK2+WJj5qxah9fxu7nma516FKvnNvliI/RGryPOph0jnELtjMrZh8FgwwPt4lgYKdalC6qQDPJsuHASXpPWk6rGmX45NGWChHLpxQ25sf2HDvDu/O38c2aAxQNKcjj7WvwRIcauklyPnfybBq3jl9Ceoblh6EdKKM3/nxLJ1n9WPWyRXmnTzPmPtuR9rXDGPPrNjqMWMjkxTs4l6pAs/woM9Pywqw1HD6ZwoR+kWrucllq8H6ibvniTH6wBd8PaU/TKqX4109b6DhyIZ8u3835dDX6/GRy9A7mb07g1V4NiKymEDG5PDV4P9O4Skk+fawlM59qQ42wovzlu410HbWYmav2kZ6h5MpAt3zHUUbNjee2ppV4uG2E2+WIj9MavB+z1rJk21FGzYtn3f6T1AwryrM31eXWxhUVaBaAjiSncMvYJZQsHMx3Q9pTVDkzgtbgA5Yxho51w/l2cDvee7AFwUEFGDp9Nb3GLmH+JgWaBZK0jEwGT43jbGoGk/u3UHMXj6jBBwBjDH+4oQI/DuvAmPubkZKWwROfxXDXxOUs265As0Dw1k9biNlzgjd7N6aOQsTEQ441eGNMqDHmd2PMWmPMRmPM35waS7IEFTDc0awyvzzfiX/1bsyR5BT6fbiSB95fQeye426XJ9fop/WH+HDpLh5qU507milETDzn2Bq8McYARa21p40xwcBSYJi1dsXlfkZr8HkrJS2DaSv3MnHRdo6eTqVLvXBe6FGPRpVLul2aeGhn4mluH7+MWuWKMfOp1sqZkf/hyhq8zXIhNSs4+0uLwl4UGhzEY+1rED28C8Nvrkfc3iRuHbeUp6fGsj3hlNvlyVWcS83g6alxBAcZJipETK6Bo2vwxpggY8waIAH4xVq78hKvGWCMiTHGxCQmJjpZTr5VJKQgT3euTfTwLgztWpvF8Yn0eCeaF2auZd9xBZr5Imstr36znvgjp3j3/uZULlXY7ZLED3nlMkljTClgNvCMtXbD5V6nJRrvOHb6PJMX7+DT3/aQmWnpc2NVnulahwolQ90uTbJNW7mXV2av59nudXi2e123yxEf5vplktbaJGARcLM3xpMrK1usEK/e0pDol7rQ58aqzFi1j04jF/LPOZs4dvq82+Xle+v3n+Sv322kY91whnat43Y54secvIomPPvIHWNMYaA7sMWp8ST3KpQM5fW7GrPwxc7c2qQSHy/bRccRCxk9L57klDS3y8uXks6mMmhqLGHFQni3TzN9YE2ui5NH8BWBhcaYdcAqstbg5zg4nlyjqmWK8PZ9TZn3XEc61Qtn7ILtdHhrIRMXbedsarrb5eUbmZmW52eu5UhyChP7t1CImFw3RRXI/9hw4CRvz4tnYXwiYcVCeLpzbfq2qkZosK7icNKEhdsZOTeev99xAw+1iXC7HPETrq/Bi39pVLkk/360JV8NakPtcsX4+5xNdB21iC9+30uaAs0csWz7Ud6eF8/tTSvxYOvqbpcjAUJH8HJF1lqW7zjGyLnxrNmXRETZIjx3U11ua1JJ68N55PDJrBCx0kVD+HZwO+XMSK7oCF6umTGGdrXDmP10Wz58KIrQ4CCGfbGGnmOWMHfjYQWaXae0jEwGT4vjXFoGk/tHqrlLnlKDF48YY+jesDw/Du3A2Aeak5aRyVOfx3LHhGUs3pqoRn+N3vxxC7F7TvDW3U2oXU4hYpK31OAlVwoUMNzetBLznuvIiLubcOx0Kg9//Dt93l/Bqt0KNMuNH9Yd4uNlu3ikbQS3Na3kdjkSgLQGL9flfHoGM1btY9yC7SSeOk+nuuG82KMejaso0OxKdiSe5vZxS6lboTgzBrQhpKCOteTaaA1eHFOoYBAPtYkg+qUu/KlnfdbuT+K28UsZ+HksW48o0OxSzqamM2hKLIWCg5jQN1LNXRyjMzqSJwqHBPFUp1o80KoaHy3ZxUdLdzF302HubFaZYd3qEBFW1O0SfYK1lldnb2Bbwmk+e6wllRQiJg7SoYPkqRKhwTx3U12WDO/CgA41+WnDIbqNXsyfvl7PoZPn3C7PdVNX7mX26gM8170uHeqEu12OBDitwYujEpJTGL9wO9N/34sxhv6tqvN0l1qEFSvkdmlet25/EvdM+o22tcvy8cM36nMEkieutAavBi9ese/4Wcb+uo2v4vYTGhzEo+0iGNChFiWLBLtdmlecOJPKreOWAjDnmfaUVs6M5BGdZBXXVS1ThJH3NuWX5zvRtX45JizcQfsRCxi/YBtnzgd2oFlmpuW5mWtIPHWeif0i1dzFa9TgxatqhRdjfN9IfhzagVY1yjBq3lY6jljIh0t2kpKW4XZ5jpiwcDuL4hN57baGNK1ayu1yJB9RgxdXNKxUgg8fvpGvn25L/YrF+ecPm+k8chFTV+4JqECzJdsSGT1/K3c2q0T/VtXcLkfyGa3Bi09YvuMoo+bGE7c3iWplivBs9zrc0awyQX58IvJg0jluHbeUsGIhfDO4HUVCdFWy5D2twYvPa1srjK8GteXjR6IoVqggz89cy83vRvPT+kN+mXOTmp4VInY+LYNJ/VuouYsr1ODFZxhj6Fq/PHOeac+EvpFkWsugqXHcNn4pC+MT/KrRv/HjZlbvTWLEPU2pFV7M7XIkn1KDF59ToIDhliYVmftsR0bd25Sks2k8+u9V3Dv5N1bsPOZ2eVf1/dqDfLJ8N4+2i+CWJhXdLkfyMa3Bi89LTc9kRsw+xi/YxpHk83SoE8YLPerRzAevSNmecJo7xi+lXoXifKEQMfECrcGLXwspWIAHW1dn8UtdeLVXAzYeTObOCct48rMYthxOdru8/3PmfI4QsX4KERP3aQaK3wgNDuLJjjWJHt6F52+qy4odx+g5ZglDp69m19EzrtZmreWV2evZkXiacQ80p2JJhYiJ+9Tgxe8UK1SQod3qsOSPXRjYqRa/bDpC99GL+eOX6ziQ5E6g2ZQVe/h2zUGev6ku7WqHuVKDyMW0Bi9+L+FUChMX7mDayr0A9G1Vjae71KJc8VCvjL9mXxL3Tl5OhzrhfPhQlELExKsUNib5woGkc4z7dRuzYvcTElSAh9tGMLBTTUoVcS775UKImDFZIWJOjiVyKTrJKvlC5VKF+dfdTZj/fCd63FCe96J30OGthYyZv41TKWl5Pl5GpmXYjP+EiKm5i69Rg5eAUyOsKGPub85PwzrQplZZ3pmfFWj2fvSOPA00G7dgG9FbE/nL7Q1pUqVUnv1ekbyiBi8Bq36FErz/UBTfDm5Ho8oleePHLXQcsZDPf9tNavr1BZot3prImF+30bt5Zfq2VIiY+CatwUu+sXLnMUbNi2fV7hNUKV2YYd3qcFfzyhQMyt1xzoGkc9w6dgnliofyzeB2FA4JcqhikavTGrwI0KpmWWY+1YZPHr2R0kVCeOnLdfR4N5o56w6SmenZgU5qeiaDp8aRlmGZ1D9SzV18mhq85CvGGDrXK8d3Q9oxuX8kQcYwZNpqbhm3lF83H7lqoNnrP2xizb4kRtzThJoKERMfpwYv+ZIxhpsbVeTnZzvyTp+mnDmfzuOfxtB70nKWbz96yZ/5bu1BPv1tD4+3r0GvxgoRE9/nWIM3xlQ1xiw0xmw2xmw0xgxzaiyRaxVUwHBX8yr8+kIn3rirMYeSUuj74Ur6frCCuL0n/u91246c4uWv1hFVvTQv96zvYsUinnPsJKsxpiJQ0VobZ4wpDsQCd1prN13uZ3SSVdyWkpbB1JV7mbhwO8fOpNKtfjkGda7Fy1+vJ+lsKnOe6UCFkt75hKyIJ650ktWx28xYaw8Bh7IfnzLGbAYqA5dt8CJuCw0O4vH2Nbj/xqp8snw37y3ewa+TEyhgYMoTrdTcxa945TJJY0wEEA00stYmX7RtADAAoFq1ai327NnjeD0injp5Lo1Pl++mSunC9I6s4nY5Iv/D1SwaY0wxYDHwurX26yu9Vks0IiK549p18MaYYOArYOrVmruIiOQtJ6+iMcBHwGZr7WinxhERkUtz8gi+HfAg0NUYsyb7q5eD44mISA5OXkWzFNCdD0REXKJPsoqIBCg1eBGRAKUGLyISoNTgRUQClE/d8MMYkwhc60dZw4BLxwC6S3XljurKHdWVO4FYV3VrbfilNvhUg78expiYy32ay02qK3dUV+6ortzJb3VpiUZEJECpwYuIBKhAavDvu13AZaiu3FFduaO6cidf1RUwa/AiIvLfAukIXkREclCDFxEJUD7f4I0xHxtjEowxGy6z3Rhjxhpjthtj1hljInNsu9kYE5+97WUv19Uvu551xpjlxpimObbtNsasz07YzNM7nHhQV2djzMkcCZ9/zrHNzf31Uo6aNhhjMowxZbK3Obm/rnpzeDfmmId1eX2OeViX1+eYh3V5fY4ZY0KNMb8bY9Zm1/W3S7zGufllrfXpL6AjEAlsuMz2XsBPZCVXtgZWZj8fBOwAagIhwFqgoRfraguUzn7c80Jd2d/vBsJc2l+dgTmXeN7V/XXRa28DFnhpf1UEIrMfFwe2XvzvdmOOeViX1+eYh3V5fY55Upcbcyx7zhTLfhwMrARae2t++fwRvLU2Gjh+hZfcAXxms6wAShljKgItge3W2p3W2lTgi+zXeqUua+1ya+2J7G9XAF65oacH++tyXN1fF3kAmJ5XY1+JtfaQtTYu+/Ep4MLN4XPy+hzzpC435piH++tyXN1fF/HKHMueM6ezvw3O/rr4yhbH5pfPN3gPVAb25fh+f/Zzl3veDY+T9Q59gQXmGWNiTdZNx72tTfafjD8ZY27Ifs4n9pcxpghwM1m3erzAK/vLZN0cvjlZR1k5uTrHrlBXTl6fY1epy7U5drX95e05ZowJMsasARKAX6y1Xptfjt3ww4sudVMRe4XnvcoY04Ws//O1z/F0O2vtQWNMOeAXY8yW7CNcb4gjK7vitMm6w9Y3QB18ZH+R9afzMmttzqN9x/eXybo5/FfAs9ba5Is3X+JHvDLHrlLXhdd4fY5dpS7X5pgn+wsvzzFrbQbQzBhTCphtjGlkrc15Lsqx+RUIR/D7gao5vq8CHLzC815jjGkCfAjcYa09duF5a+3B7P8mALPJ+lPMK6y1yRf+ZLTW/ggEG2PC8IH9le1+LvrT2en9Za5+c3hX5pgHdbkyx65Wl1tzzJP9lc3rcyz7dycBi8j66yEn5+ZXXp1McPILiODyJw1v4b9PUPye/XxBYCdQg/+coLjBi3VVA7YDbS96vihQPMfj5cDNXqyrAv/5gFtLYG/2vnN1f2VvL0nWOn1Rb+2v7H/7Z8C7V3iN1+eYh3V5fY55WJfX55gndbkxx4BwoFT248LAEuBWb80vn1+iMcZMJ+usfJgxZj/wF7JOVGCtnQz8SNZZ6O3AWeDR7G3pxpghwFyyzkZ/bK3d6MW6/gyUBSYaYwDSbVZaXHmy/kyDrP8Bp1lrf/ZiXfcAg4wx6cA54H6bNZvc3l8AdwHzrLVncvyoo/uL/9wcfn32OinAK2Q1TzfnmCd1uTHHPKnLjTnmSV3g/TlWEfjUGBNE1orJTGvtHGPMwBx1OTa/FFUgIhKgAmENXkRELkENXkQkQKnBi4gEKDV4EZEApQYvIhKg1OBFRAKUGryISIBSgxe5DGPMjdn53KHGmKLZed6N3K5LxFP6oJPIFRhj/gmEkvUx8/3W2jddLknEY2rwIldgjAkBVgEpZGW+ZLhckojHtEQjcmVlgGJk3SUo1OVaRHJFR/AiV2CM+Y6sO+nUACpaa4e4XJKIx3w+TVLELcaYh8hKaJyWnQa43BjT1Vq7wO3aRDyhI3gRkQClNXgRkQClBi8iEqDU4EVEApQavIhIgFKDFxEJUGrwIiIBSg1eRCRA/X+tYeCktcykKQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.core.display import display\n", "display(fig)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution: Use OO except for figure creation and display\n", "\n", "So, we've got 2 APIs one of which is newer and more scalable, but too low level when it comes to figure creation and display.\n", "We also want to avoid learning 2 APIs to the same software.\n", "\n", "The best solution is probably to mix the APIs: use pyplot to create and display figures, but do everything else via the object oriented interface.\n", "\n", "A full example follows below:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Import pyplot (and let it load a backend)\n", "import matplotlib.pyplot as plt\n", "\n", "# Create a figure, attached to a canvas and stored inside the pyplot module,\n", "# but also store a handle locally\n", "fig = plt.figure()\n", "\n", "# Add a set of axes\n", "ax = fig.add_subplot()\n", "ax.set_xlabel('x')\n", "ax.set_ylabel('y')\n", "\n", "# Plot something on the axes\n", "ax.plot([1, 2, 3], [4, 2, 7])\n", "\n", "# Show all open figures on the screen\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Naming\n", "\n", "Even within the OO API, matplotlib's naming is massively inconsistent.\n", "\n", "Sometimes you need underscores (`fig.add_suplot`) sometimes you don't (`ax.vline()`, `ax.legend(ncols=3)`) and sometimes you camel case (`ax.transData`).\n", "Some things are partially abbreviated (`ax.set_xlim`, `ax.transData`) many are not.\n", "Several keyword arguments have more than one form (`ax.plot([1,2,3], lw=2)` is the same as `ax.plot([1,2,3], linewidth=2)`).\n", "\n", "This makes everything difficult to remember, so a lot of searching in the docs is required." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using Matplotlib's documentation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Matplotlib is well documented, and there are lots of tutorials and examples online (from \"official\" and unofficial sources).\n", "\n", "Two things are worth knowing when you navigate the docs:\n", "\n", "1. Since there are two APIs, you'll find similar documentation in two places. E.g. the docs for `pyplot.plot` coexist with the docs for `Axes.plot`. To look stuff up about the OO version of `plot`, you need to look at the docs for `Axes`.\n", "2. Many methods follow a pattern where an object is created and any keyword arguments are passed to its constructor. For example, `Axes.plot` has only 6 arguments. When we call `ax.plot([1,2,3], alpha=3)` it creates a `Line2D` object and passes the `alpha=3` part to its constructor. This means the detailed information about keyword arguments to `ax.plot` are found under `matplotlib.lines.Line2D`! In many cases this is mitigated by duplicating part of the documentation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Figure size in jupyter notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As the examples above show, jupyter renders matplotlib figures a bit small by default.\n", "\n", "To see how this happens, consider the steps involved:\n", "\n", "1. A figure object is created\n", "2. The object is rendered (rasterised) as a PNG (I guess) with some pixel size depending on the figure size in inches and matplotlib's DPI setting.\n", "3. The PNG is incorporated into the notebook, and shown 1:1 (each pixel in the figure becomes a pixel on screen)\n", "\n", "For whatever reason, jupyter's matplotlib backend has also chosen to render plots at 72 PPI (or DPI, in matplotlib's terminology), which will result in small figures on most modern screens." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I tried a few things to compensate this, but all have drawbacks :-(" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## OK now let's actually get started\n", "\n", "Below is a minimal example of a figure in matplotlib:\n", "\n", "- Create a figure, using a figure size in [physical units](https://matplotlib.org/stable/gallery/subplots_axes_and_figures/figure_size_units.html) (e.g. inches)\n", "\n", "Next,\n", "\n", "- Add axes labels.\n", " - Indicate any units (before you forget what they are).\n", " - You can [use latex syntax](https://matplotlib.org/stable/tutorials/text/mathtext.html) in your text.\n", "- More than 1 line? Add a legend.\n", "\n", "Do these things while designing.\n", "Only once you're finished you can think about leaving out some labels, legends, etc." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Import matplotlib and numpy, generate some data\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "t = np.arange(0, 1000)\n", "c1 = np.sin((t - 30) * 0.02)\n", "c2 = np.sin((t - 40) * 0.021)\n", "\n", "# Create a figure of 7 by 3 inches\n", "fig = plt.figure(figsize=(7, 3))\n", "\n", "# Add an axes object --- always set labels!\n", "ax = fig.add_subplot()\n", "ax.set_xlabel('Time (s)')\n", "ax.set_ylabel('Current ($\\mu$A)')\n", "\n", "# Plot the data\n", "ax.plot(t, c1, label='First recording')\n", "ax.plot(t, c2, label='Second recording')\n", "\n", "# Add a legend\n", "ax.legend()\n", "\n", "# Show the figure\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Saving" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To save your work, simply use `savefig`:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# Create a figure of 7 by 3 inches\n", "fig = plt.figure(figsize=(7, 3))\n", "\n", "# Add an axes object --- always set labels!\n", "ax = fig.add_subplot()\n", "ax.set_xlabel('Time (s)')\n", "ax.set_ylabel('Current ($\\mu$A)')\n", "\n", "# Plot the data\n", "ax.plot(t, c1, label='First recording')\n", "ax.plot(t, c2, label='Second recording')\n", "\n", "# Add a legend\n", "ax.legend()\n", "\n", "# Store the figure\n", "fig.savefig('figures/first-example.png') # Save as png\n", "fig.savefig('figures/first-example-hi-res.png', dpi=600) # Save as png with higher DPI\n", "fig.savefig('figures/first-example.pdf') # Save as PDF (best format for latex)\n", "plt.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also save as EPS, which throws up a warning:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "The PostScript backend does not support transparency; partially transparent artists will be rendered opaque.\n" ] } ], "source": [ "# Create a figure of 7 by 3 inches\n", "fig = plt.figure(figsize=(7, 3))\n", "\n", "# Add an axes object --- always set labels!\n", "ax = fig.add_subplot()\n", "ax.set_xlabel('Time (s)')\n", "ax.set_ylabel('Current ($\\mu$A)')\n", "\n", "# Plot the data\n", "ax.plot(t, c1, label='First recording')\n", "ax.plot(t, c2, label='Second recording')\n", "\n", "# Add a legend\n", "ax.legend()\n", "\n", "# Store the figure\n", "fig.savefig('figures/first-example.eps') # Save as EPS (for some journals)\n", "plt.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We didn't ask for any transparency, but the current (2022-05-09) matplotlib makes legends semi-transparent by default.\n", "We can disable this to get a consistent result:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Create a figure of 7 by 3 inches\n", "fig = plt.figure(figsize=(7, 3))\n", "\n", "# Add an axes object --- always set labels!\n", "ax = fig.add_subplot()\n", "ax.set_xlabel('Time (s)')\n", "ax.set_ylabel('Current ($\\mu$A)')\n", "\n", "# Plot the data\n", "ax.plot(t, c1, label='First recording')\n", "ax.plot(t, c2, label='Second recording')\n", "\n", "# Add a legend, set the alpha (transparency) values of its \"frame\" to 1 (fully opaque)\n", "ax.legend(framealpha=1)\n", "\n", "# Store the figure\n", "fig.savefig('figures/first-example.eps') # Save as EPS (for some journals)\n", "plt.close()" ] } ], "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.10.4" } }, "nbformat": 4, "nbformat_minor": 4 }