From a52df4abb26a62a0afcc8fd6570a141dd525bf82 Mon Sep 17 00:00:00 2001 From: Mark Jenkinson <mark@fmrib.ox.ac.uk> Date: Wed, 14 Feb 2018 23:28:02 +0000 Subject: [PATCH] New practical on plotting --- getting_started/06_plotting.ipynb | 228 ++++++++++++++++++++++++++++++ getting_started/06_plotting.md | 135 ++++++++++++++++++ 2 files changed, 363 insertions(+) create mode 100644 getting_started/06_plotting.ipynb create mode 100644 getting_started/06_plotting.md diff --git a/getting_started/06_plotting.ipynb b/getting_started/06_plotting.ipynb new file mode 100644 index 0000000..1c46211 --- /dev/null +++ b/getting_started/06_plotting.ipynb @@ -0,0 +1,228 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Plotting with python\n", + "\n", + "The main plotting module in python is `matplotlib`. There is a lot\n", + "that can be done with it - see the [webpage](https://matplotlib.org/gallery/index.html)\n", + "\n", + "## Inside a notebook\n", + "\n", + "Inside a jupyter notebook you get access to this in a slightly\n", + "different way, compared to other modules:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This only needs to be done once in a notebook, like for standard imports.\n", + "\n", + "> There are also interactive versions - see the practical on Jupyter notebooks for more information about this.\n", + "\n", + "\n", + "The library works very similarly to plotting in matlab. Let's start\n", + "with some simple examples.\n", + "\n", + "### 2D plots" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "x = np.linspace(-np.pi, np.pi, 256)\n", + "cosx, sinx = np.cos(x), np.sin(x)\n", + "\n", + "plt.plot(x, cosx)\n", + "plt.plot(x, sinx, color='red', linewidth=4, linestyle='-.')\n", + "plt.plot(x, sinx**2)\n", + "plt.xlim(-np.pi, np.pi)\n", + "plt.title('Our first plots')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Histograms and bar charts\n", + "\n", + "For a simple histogram you can do this:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "r = np.random.rand(1000)\n", + "n,bins,_ = plt.hist((r-0.5)**2, bins=30)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where it also returns the number of elements in each bin, as `n`, and\n", + "the bin centres, as `bins`. The `_` in the third part on the left\n", + "hand side is a shorthand for just throwing away the corresponding part\n", + "of the return structure.\n", + "\n", + "\n", + "There is also a call for doing bar plots:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "samp1 = r[0:10]\n", + "samp2 = r[10:20]\n", + "bwidth = 0.3\n", + "xcoord = np.arange(10)\n", + "ax.bar(xcoord-bwidth, samp1, width=bwidth, color='red', label='Sample 1')\n", + "ax.bar(xcoord, samp2, width=bwidth, color='blue', label='Sample 2')\n", + "ax.legend(loc='upper left')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the first line returns a handle to the axis, as `ax`, that\n", + "we can use instead of `plt`\n", + "\n", + "### Scatter plots" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "ssize = 100*abs(samp1-samp2) # just an arbitrary example\n", + "ax.scatter(samp1, samp2, s=ssize, alpha=0.5)\n", + "allsamps = np.hstack((samp1,samp2))\n", + "ax.plot([min(allsamps),max(allsamps)],[min(allsamps),max(allsamps)], color='red', linestyle='--')\n", + "plt.xlim(min(allsamps),max(allsamps))\n", + "plt.ylim(min(allsamps),max(allsamps))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Subplots" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.subplot(2, 1, 1)\n", + "plt.plot(x,cosx, '.-')\n", + "plt.xlim(-np.pi, np.pi)\n", + "plt.ylabel('Full sampling')\n", + "plt.subplot(2, 1, 2)\n", + "plt.plot(x[::30], cosx[::30], '.-')\n", + "plt.xlim(-np.pi, np.pi)\n", + "plt.ylabel('Subsampled')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Displaying images" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import nibabel as nib\n", + "import os.path as op\n", + "nim = nib.load(op.expandvars('${FSLDIR}/data/standard/MNI152_T1_1mm.nii.gz'), mmap=False)\n", + "imdat = nim.get_data().astype(float)\n", + "plt.imshow(imdat[:,:,70], cmap=plt.cm.gray)\n", + "plt.colorbar()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3D plots" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Taken from https://matplotlib.org/gallery/mplot3d/wire3d.html#sphx-glr-gallery-mplot3d-wire3d-py\n", + "\n", + "from mpl_toolkits.mplot3d import axes3d\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111, projection='3d')\n", + "\n", + "# Grab some test data.\n", + "X, Y, Z = axes3d.get_test_data(0.05)\n", + "\n", + "# Plot a basic wireframe.\n", + "ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Surface renderings are many other plots are possible - see 3D examples on\n", + "the [matplotlib webpage](https://matplotlib.org/gallery/index.html#mplot3d-examples-index)\n", + "\n", + "## Plotting from standalone scripts\n", + "\n", + "When running from a standalone script, the same `matplotlib` import is required,\n", + "but the line `%matplotlib <backend>` should *not* be used.\n", + "\n", + "In a script it is necessary to also _finish_ with `plt.show()` as\n", + "otherwise nothing is actually displayed. For example, the above\n", + "examples would setup a plot but the actual graphic would only appear\n", + "after the `plt.show()` command was executed. Furthermore, control is\n", + "not returned to the script immediately as the plot is interactive by default." + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/getting_started/06_plotting.md b/getting_started/06_plotting.md new file mode 100644 index 0000000..130b1ed --- /dev/null +++ b/getting_started/06_plotting.md @@ -0,0 +1,135 @@ +# Plotting with python + +The main plotting module in python is `matplotlib`. There is a lot +that can be done with it - see the [webpage](https://matplotlib.org/gallery/index.html) + +## Inside a notebook + +Inside a jupyter notebook you get access to this in a slightly +different way, compared to other modules: + +``` +%matplotlib inline +``` + +This only needs to be done once in a notebook, like for standard imports. + +> There are also interactive versions - see the practical on Jupyter notebooks for more information about this. + + +The library works very similarly to plotting in matlab. Let's start +with some simple examples. + +### 2D plots + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-np.pi, np.pi, 256) +cosx, sinx = np.cos(x), np.sin(x) + +plt.plot(x, cosx) +plt.plot(x, sinx, color='red', linewidth=4, linestyle='-.') +plt.plot(x, sinx**2) +plt.xlim(-np.pi, np.pi) +plt.title('Our first plots') +``` + + +### Histograms and bar charts + +For a simple histogram you can do this: +``` +r = np.random.rand(1000) +n,bins,_ = plt.hist((r-0.5)**2, bins=30) +``` +where it also returns the number of elements in each bin, as `n`, and +the bin centres, as `bins`. The `_` in the third part on the left +hand side is a shorthand for just throwing away the corresponding part +of the return structure. + + +There is also a call for doing bar plots: +``` +fig, ax = plt.subplots() +samp1 = r[0:10] +samp2 = r[10:20] +bwidth = 0.3 +xcoord = np.arange(10) +ax.bar(xcoord-bwidth, samp1, width=bwidth, color='red', label='Sample 1') +ax.bar(xcoord, samp2, width=bwidth, color='blue', label='Sample 2') +ax.legend(loc='upper left') +``` +Note that the first line returns a handle to the axis, as `ax`, that +we can use instead of `plt` + +### Scatter plots + +``` +fig, ax = plt.subplots() +ssize = 100*abs(samp1-samp2) # just an arbitrary example +ax.scatter(samp1, samp2, s=ssize, alpha=0.5) +allsamps = np.hstack((samp1,samp2)) +ax.plot([min(allsamps),max(allsamps)],[min(allsamps),max(allsamps)], color='red', linestyle='--') +plt.xlim(min(allsamps),max(allsamps)) +plt.ylim(min(allsamps),max(allsamps)) +``` + + +### Subplots + +``` +plt.subplot(2, 1, 1) +plt.plot(x,cosx, '.-') +plt.xlim(-np.pi, np.pi) +plt.ylabel('Full sampling') +plt.subplot(2, 1, 2) +plt.plot(x[::30], cosx[::30], '.-') +plt.xlim(-np.pi, np.pi) +plt.ylabel('Subsampled') +``` + +### Displaying images + +``` +import nibabel as nib +import os.path as op +nim = nib.load(op.expandvars('${FSLDIR}/data/standard/MNI152_T1_1mm.nii.gz'), mmap=False) +imdat = nim.get_data().astype(float) +plt.imshow(imdat[:,:,70], cmap=plt.cm.gray) +plt.colorbar() +``` + + +### 3D plots + +``` +# Taken from https://matplotlib.org/gallery/mplot3d/wire3d.html#sphx-glr-gallery-mplot3d-wire3d-py + +from mpl_toolkits.mplot3d import axes3d + +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') + +# Grab some test data. +X, Y, Z = axes3d.get_test_data(0.05) + +# Plot a basic wireframe. +ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) +``` + +Surface renderings are many other plots are possible - see 3D examples on +the [matplotlib webpage](https://matplotlib.org/gallery/index.html#mplot3d-examples-index) + +## Plotting from standalone scripts + +When running from a standalone script, the same `matplotlib` import is required, +but the line `%matplotlib <backend>` should *not* be used. + +In a script it is necessary to also _finish_ with `plt.show()` as +otherwise nothing is actually displayed. For example, the above +examples would setup a plot but the actual graphic would only appear +after the `plt.show()` command was executed. Furthermore, control is +not returned to the script immediately as the plot is interactive by default. + -- GitLab