{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# The right way to plot: rcParams*\n", "\\* The breakfast of champions ...\n", "### PyCoffee @ Vitacura - 6 April 2016 - fvogt@eso.org\n", "\n", "**premise:** \n", "- matplotlib is the one-stop shop for all 2-D plotting in Python. Easy to make rapid plots & tons of examples. \n", "- **But at times frustrating** to get beautiful & complex plots\n", "\n", "**rcParams:** \n", "- the way to deal with generic plot parameters like fontsize, colorscheme, etc ... \n", "- http://matplotlib.org/users/customizing.html\n", "\n", "**utility**: \n", "- essential for those fed up of re-inventing the wheel\n", "- essential to get $\\LaTeX$ working properly\n", "- life-changing for people that appreciate the beauty of uniformity\n", "\n", "**cost**: \n", "- $\\sim$10 lines (if you're lucky) \n", "- 10 lines + 1 headache (if your system $\\LaTeX$ is not set-up properly)\n", "\n", "**gain**:\n", "- total control over the plot\n", "- accuracy\n", "- elegance\n", "- infinite powers\n", "- ...\n", "\n", "** take-home message **: \n", "- rcParams is worth it, once you know your style - or if you \"seriously\" need $\\LaTeX$ !\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### A) Motivation: how to label a line-ratio diagram ? \n", "\n", "I.e. how does one **properly** type the name of a forbidden emission-line like $[\\text{O}\\,\\rm{\\scriptsize III}]$ ?\n", "\n", "My answer: $[\\text{O}\\,\\rm{\\scriptsize III}]=$[O\\,\\textsc{\\smaller III}]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\\smaller comes from the \"relsize\" packages. In an article .tex file, it ensures that the size ratio is conserved in Figure captions, footnotes, etc ...: any place with smaller fontsize !" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### B) $\\LaTeX$ and matplotlib\n", "\n", "Some basic $\\LaTeX$ commands are already accessible in matplotlib by default, e.g.:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Use some notebook magic - forget the next line in normal scripted code\n", "%matplotlib inline\n", "\n", "import matplotlib.pyplot as plt # Gives access to basic plotting functions\n", "\n", "# Note the leading \"r\" !\n", "plt.xlabel(r'$\\sum_{i=0}^\\infty\\ \\frac{x^i}{\\sqrt{i}}$ M$_{\\odot}$ + $\\int_{j=0}^{32}\\ \\exp^{-\\frac{x-\\lambda_0^2}{2\\cdot\\sigma^2}}$',fontsize=20)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But you will not get access to special packages, exotic symbols, etc ... In particular, there is no elegant way to typeset a forbidden emission line ... sigh!\n", "\n", "The solution: tell matplotlib to use your default system-$\\LaTeX$ instead !" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### B) Set the stage: import the required modules" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np # For creating some fake data\n", "\n", "import matplotlib.gridspec as gridspec # GRIDSPEC !\n", "from matplotlib.colorbar import Colorbar # For dealing with Colorbars the proper way" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### C) Create some fake datasets to play with ..." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Ok, let us start by creating some fake data\n", "x = np.random.randn(1000)\n", "y = np.random.randn(1000)\n", "z = np.sqrt(x**2+y**2)\n", "\n", "# `randn` generates an array of shape ``(d0, d1, ..., dn)``, filled\n", "# with random floats sampled from a univariate \"normal\" (Gaussian)\n", "# distribution of mean 0 and variance 1." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### D) Get started with the plotting: basic approach" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Now, create the gridspec structure, as required. A simple plot witha colorbar\n", "gs = gridspec.GridSpec(2,1, height_ratios=[0.05,1], width_ratios=[1])\n", "gs.update(left=0.05, right=0.95, bottom=0.08, top=0.93, wspace=0.02, hspace=0.03)\n", "\n", "# First, the scatter plot\n", "# Use the gridspec magic to place it\n", "# --------------------------------------------------------\n", "ax1 = plt.subplot(gs[1,0]) # place it where it should be.\n", "# --------------------------------------------------------\n", "\n", "# The plot itself\n", "plt1 = ax1.scatter(x, y, c = z, \n", " marker = 's', s=20, edgecolor = 'none',alpha =1,\n", " cmap = 'magma_r', vmin =0 , vmax = 4)\n", "\n", "# Define the limits, labels, ticks as required\n", "ax1.grid(True)\n", "ax1.set_xlim([-4,4])\n", "ax1.set_ylim([-4,4])\n", "ax1.set_xlabel(r' ') # Force this empty !\n", "ax1.set_xticks(np.linspace(-4,4,9)) # Force this to what I want - for consistency with histogram below !\n", "ax1.set_ylabel(r'My y label')\n", "ax1.set_xlabel(r'$\\log$ [O\\,\\textsc{\\smaller III}] $\\lambda$5007\\AA')\n", "\n", "# and let us not forget the colorbar above !\n", "# --------------------------------------------------------\n", "cbax = plt.subplot(gs[0,:2]) # Place it where it should be.\n", "# --------------------------------------------------------\n", "\n", "cb = Colorbar(ax = cbax, mappable = plt1, orientation = 'horizontal', ticklocation = 'top')\n", "cb.set_label(r'Colorbar !', labelpad=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### E) Set up rcParams to use my system $\\LaTeX$ instead" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import matplotlib as mpl\n", "# Use tex - a pain to setup, but it looks great when it works !\n", "#mpl.rc('MacOSX')\n", "# Default fonts - only used if usetex = False. The fontsize remains important though.\n", "mpl.rc('font',**{'family':'sans-serif', 'serif':['Computer Modern Serif'], \n", " 'sans-serif':['Helvetica'], 'size':16, \n", " 'weight':500, 'variant':'normal'}) \n", "# You can set many more things in rcParams, like the default label weight, etc ...\n", "mpl.rc('axes',**{'labelweight':'normal', 'linewidth':1})\n", "mpl.rc('ytick',**{'major.pad':12, 'color':'k'})\n", "mpl.rc('xtick',**{'major.pad':8,})\n", "mpl.rc('contour', **{'negative_linestyle':'solid'}) # dashed | solid\n", "# The default matplotlib LaTeX - only matters if usetex=False.\n", "mpl.rc('mathtext',**{'default':'regular','fontset':'cm', \n", " 'bf':'monospace:bold'})\n", "# This is where the magic happens !\n", "mpl.rc('text', **{'usetex':True}) \n", " # And this is how one can load exotic packages to fullfill one's dreams !\n", "mpl.rc('text.latex',preamble=r'\\usepackage{cmbright},\\usepackage{relsize},'+\n", " '\\usepackage{upgreek}, \\usepackage{amsmath}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An elegant way to do this consistently is to store this code in a dedicated Python script, e.g. \"fpav.py\" in my case. Put this somwehere on your Path, and load it everytime: this will effectively set your custom rcParams ! E.g:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import fpav" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Congratulations, you have just started using your very own Python module !\n", "\n", "By the way, you can also add custom colorbars to your \"fpav.py\" file, constants that you re-use all the time, etc... e.g:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The speed of light is 299792.458000 km/s\n", " \n", "And this is how I access my own colorar: \n" ] } ], "source": [ "print r'The speed of light is %f km/s' % fpav.c\n", "print ' '\n", "print r'And this is how I access my own colorar:', fpav.alligator" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "#### F) one last (but HUGE!) benefit of rcParams: figure uniformity in your articles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With gridspec and some smart plotting, you can ensure that your figures have a consistent fontsize in your article. \n", "\n", "You simply need to decide whether a given figure will be single column or double column.\n", "\n", "**1) set the fontsize to 16 with rcParams.**\n", "\n", "**2a) for a single column plot: plt.figure(1, figsize=(6.93,x))**\n", "\n", "**2b) for a single column plot: plt.figure(1, figsize=(14.17,x))**\n", "\n", "**3) Save your figure with plt.savefig('name.pdf') ... No bbox_inches='tight' anymore !**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "celltoolbar": "Raw Cell Format", "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.11" } }, "nbformat": 4, "nbformat_minor": 0 }