data-science-ipython-notebooks/matplotlib/04.06-Customizing-Legends.ipynb

436 lines
214 KiB
Python
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<!--BOOK_INFORMATION-->\n",
"<img align=\"left\" style=\"padding-right:10px;\" src=\"figures/PDSH-cover-small.png\">\n",
"*This notebook contains an excerpt from the [Python Data Science Handbook](http://shop.oreilly.com/product/0636920034919.do) by Jake VanderPlas; the content is available [on GitHub](https://github.com/jakevdp/PythonDataScienceHandbook).*\n",
"\n",
"*The text is released under the [CC-BY-NC-ND license](https://creativecommons.org/licenses/by-nc-nd/3.0/us/legalcode), and code is released under the [MIT license](https://opensource.org/licenses/MIT). If you find this content useful, please consider supporting the work by [buying the book](http://shop.oreilly.com/product/0636920034919.do)!*\n",
"\n",
"*No changes were made to the contents of this notebook from the original.*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<!--NAVIGATION-->\n",
"< [Histograms, Binnings, and Density](04.05-Histograms-and-Binnings.ipynb) | [Contents](Index.ipynb) | [Customizing Colorbars](04.07-Customizing-Colorbars.ipynb) >"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Customizing Plot Legends"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot legends give meaning to a visualization, assigning meaning to the various plot elements.\n",
"We previously saw how to create a simple legend; here we'll take a look at customizing the placement and aesthetics of the legend in Matplotlib.\n",
"\n",
"The simplest legend can be created with the ``plt.legend()`` command, which automatically creates a legend for any labeled plot elements:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"plt.style.use('classic')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nefZcv+oqoGVLS+ShyMy
"text/plain": [
"<matplotlib.figure.Figure at 0x10c21e9e8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.linspace(0, 10, 1000)\n",
"fig, ax = plt.subplots()\n",
"ax.plot(x, np.sin(x), '-b', label='Sine')\n",
"ax.plot(x, np.cos(x), '--r', label='Cosine')\n",
"ax.axis('equal')\n",
"leg = ax.legend();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"But there are many ways we might want to customize such a legend.\n",
"For example, we can specify the location and turn off the frame:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n96uWLq36t7+pLlyo6vU
"text/plain": [
"<matplotlib.figure.Figure at 0x10c21e9e8>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ax.legend(loc='upper left', frameon=False)\n",
"fig"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can use the ``ncol`` command to specify the number of columns in the legend:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nna36yCOqM2dGJDYv/PK
"text/plain": [
"<matplotlib.figure.Figure at 0x10c21e9e8>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ax.legend(frameon=False, loc='lower center', ncol=2)\n",
"fig"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can use a rounded box (``fancybox``) or add a shadow, change the transparency (alpha value) of the frame, or change the padding around the text:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\ne7KpAgcPAjt3Atu3A/P
"text/plain": [
"<matplotlib.figure.Figure at 0x10c21e9e8>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ax.legend(fancybox=True, framealpha=1, shadow=True, borderpad=1)\n",
"fig"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For more information on available legend options, see the ``plt.legend`` docstring."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Choosing Elements for the Legend\n",
"\n",
"As we have already seen, the legend includes all labeled elements by default.\n",
"If this is not what is desired, we can fine-tune which elements and labels appear in the legend by using the objects returned by plot commands.\n",
"The ``plt.plot()`` command is able to create multiple lines at once, and returns a list of created line instances.\n",
"Passing any of these to ``plt.legend()`` will tell it which to identify, along with the labels we'd like to specify:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\neQFffmnf+I9v3kScjw8
"text/plain": [
"<matplotlib.figure.Figure at 0x10d779518>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"y = np.sin(x[:, np.newaxis] + np.pi * np.arange(0, 2, 0.5))\n",
"lines = plt.plot(x, y)\n",
"\n",
"# lines is a list of plt.Line2D instances\n",
"plt.legend(lines[:2], ['first', 'second']);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I generally find in practice that it is clearer to use the first method, applying labels to the plot elements you'd like to show on the legend:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\neQFffmnf+I9v3kScjw8
"text/plain": [
"<matplotlib.figure.Figure at 0x11025d908>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(x, y[:, 0], label='first')\n",
"plt.plot(x, y[:, 1], label='second')\n",
"plt.plot(x, y[:, 2:])\n",
"plt.legend(framealpha=1, frameon=True);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice that by default, the legend ignores all elements without a ``label`` attribute set."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Legend for Size of Points\n",
"\n",
"Sometimes the legend defaults are not sufficient for the given visualization.\n",
"For example, perhaps you're be using the size of points to mark certain features of the data, and want to create a legend reflecting this.\n",
"Here is an example where we'll use the size of points to indicate populations of California cities.\n",
"We'd like a legend that specifies the scale of the sizes of the points, and we'll accomplish this by plotting some labeled data with no entries:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nggsu4KqrriIvL4/i4mK
"text/plain": [
"<matplotlib.figure.Figure at 0x117d74cc0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"cities = pd.read_csv('data/california_cities.csv')\n",
"\n",
"# Extract the data we're interested in\n",
"lat, lon = cities['latd'], cities['longd']\n",
"population, area = cities['population_total'], cities['area_total_km2']\n",
"\n",
"# Scatter the points, using size and color but no label\n",
"plt.scatter(lon, lat, label=None,\n",
" c=np.log10(population), cmap='viridis',\n",
" s=area, linewidth=0, alpha=0.5)\n",
"plt.axis(aspect='equal')\n",
"plt.xlabel('longitude')\n",
"plt.ylabel('latitude')\n",
"plt.colorbar(label='log$_{10}$(population)')\n",
"plt.clim(3, 7)\n",
"\n",
"# Here we create a legend:\n",
"# we'll plot empty lists with the desired size and label\n",
"for area in [100, 300, 500]:\n",
" plt.scatter([], [], c='k', alpha=0.3, s=area,\n",
" label=str(area) + ' km$^2$')\n",
"plt.legend(scatterpoints=1, frameon=False, labelspacing=1, title='City Area')\n",
"\n",
"plt.title('California Cities: Area and Population');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The legend will always reference some object that is on the plot, so if we'd like to display a particular shape we need to plot it.\n",
"In this case, the objects we want (gray circles) are not on the plot, so we fake them by plotting empty lists.\n",
"Notice too that the legend only lists plot elements that have a label specified.\n",
"\n",
"By plotting empty lists, we create labeled plot objects which are picked up by the legend, and now our legend tells us some useful information.\n",
"This strategy can be useful for creating more sophisticated visualizations.\n",
"\n",
"Finally, note that for geographic data like this, it would be clearer if we could show state boundaries or other map-specific elements.\n",
"For this, an excellent choice of tool is Matplotlib's Basemap addon toolkit, which we'll explore in [Geographic Data with Basemap](04.13-Geographic-Data-With-Basemap.ipynb)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Multiple Legends\n",
"\n",
"Sometimes when designing a plot you'd like to add multiple legends to the same axes.\n",
"Unfortunately, Matplotlib does not make this easy: via the standard ``legend`` interface, it is only possible to create a single legend for the entire plot.\n",
"If you try to create a second legend using ``plt.legend()`` or ``ax.legend()``, it will simply override the first one.\n",
"We can work around this by creating a new legend artist from scratch, and then using the lower-level ``ax.add_artist()`` method to manually add the second artist to the plot:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nnq+/zJ365WN935BnIYA
"text/plain": [
"<matplotlib.figure.Figure at 0x117f1e3c8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"\n",
"lines = []\n",
"styles = ['-', '--', '-.', ':']\n",
"x = np.linspace(0, 10, 1000)\n",
"\n",
"for i in range(4):\n",
" lines += ax.plot(x, np.sin(x - i * np.pi / 2),\n",
" styles[i], color='black')\n",
"ax.axis('equal')\n",
"\n",
"# specify the lines and labels of the first legend\n",
"ax.legend(lines[:2], ['line A', 'line B'],\n",
" loc='upper right', frameon=False)\n",
"\n",
"# Create the second legend and add the artist manually.\n",
"from matplotlib.legend import Legend\n",
"leg = Legend(ax, lines[2:], ['line C', 'line D'],\n",
" loc='lower right', frameon=False)\n",
"ax.add_artist(leg);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is a peek into the low-level artist objects that comprise any Matplotlib plot.\n",
"If you examine the source code of ``ax.legend()`` (recall that you can do this with within the IPython notebook using ``ax.legend??``) you'll see that the function simply consists of some logic to create a suitable ``Legend`` artist, which is then saved in the ``legend_`` attribute and added to the figure when the plot is drawn."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<!--NAVIGATION-->\n",
"< [Histograms, Binnings, and Density](04.05-Histograms-and-Binnings.ipynb) | [Contents](Index.ipynb) | [Customizing Colorbars](04.07-Customizing-Colorbars.ipynb) >"
]
}
],
"metadata": {
"anaconda-cloud": {},
"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.4.3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}