{ "metadata": { "name": "", "signature": "sha256:54b0adb8e8d73f9b7a556690e6a3f6cd5468ff6f58ce26e1e593cb103cb7c9a8" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Group Bar Plot In MatPlotLib\n", "\n", "- **Author:** [Chris Albon](http://www.chrisalbon.com/), [@ChrisAlbon](https://twitter.com/chrisalbon)\n", "- **Date:** -\n", "- **Repo:** [Python 3 code snippets for data science](https://github.com/chrisalbon/code_py)\n", "- **Note:** Based on: [Sebastian Raschka](http://nbviewer.ipython.org/github/rasbt/matplotlib-gallery/blob/master/ipynb/barplots.ipynb)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Preliminaries" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create dataframe" ] }, { "cell_type": "code", "collapsed": false, "input": [ "raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],\n", " 'pre_score': [4, 24, 31, 2, 3],\n", " 'mid_score': [25, 94, 57, 62, 70],\n", " 'post_score': [5, 43, 23, 23, 51]}\n", "df = pd.DataFrame(raw_data, columns = ['first_name', 'pre_score', 'mid_score', 'post_score'])\n", "df" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
first_namepre_scoremid_scorepost_score
0 Jason 4 25 5
1 Molly 24 94 43
2 Tina 31 57 23
3 Jake 2 62 23
4 Amy 3 70 51
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ " first_name pre_score mid_score post_score\n", "0 Jason 4 25 5\n", "1 Molly 24 94 43\n", "2 Tina 31 57 23\n", "3 Jake 2 62 23\n", "4 Amy 3 70 51" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Make plot" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Setting the positions and width for the bars\n", "pos = list(range(len(df['pre_score']))) \n", "width = 0.25 \n", " \n", "# Plotting the bars\n", "fig, ax = plt.subplots(figsize=(10,5))\n", "\n", "# Create a bar with pre_score data,\n", "# in position pos,\n", "plt.bar(pos, \n", " #using df['pre_score'] data,\n", " df['pre_score'], \n", " # of width\n", " width, \n", " # with alpha 0.5\n", " alpha=0.5, \n", " # with color\n", " color='#EE3224', \n", " # with label the first value in first_name\n", " label=df['first_name'][0]) \n", "\n", "# Create a bar with mid_score data,\n", "# in position pos + some width buffer,\n", "plt.bar([p + width for p in pos], \n", " #using df['mid_score'] data,\n", " df['mid_score'],\n", " # of width\n", " width, \n", " # with alpha 0.5\n", " alpha=0.5, \n", " # with color\n", " color='#F78F1E', \n", " # with label the second value in first_name\n", " label=df['first_name'][1]) \n", "\n", "# Create a bar with post_score data,\n", "# in position pos + some width buffer,\n", "plt.bar([p + width*2 for p in pos], \n", " #using df['post_score'] data,\n", " df['post_score'], \n", " # of width\n", " width, \n", " # with alpha 0.5\n", " alpha=0.5, \n", " # with color\n", " color='#FFC222', \n", " # with label the third value in first_name\n", " label=df['first_name'][2]) \n", "\n", "# Set the y axis label\n", "ax.set_ylabel('Score')\n", "\n", "# Set the chart's title\n", "ax.set_title('Test Subject Scores')\n", "\n", "# Set the position of the x ticks\n", "ax.set_xticks([p + 1.5 * width for p in pos])\n", "\n", "# Set the labels for the x ticks\n", "ax.set_xticklabels(df['first_name'])\n", "\n", "# Setting the x-axis and y-axis limits\n", "plt.xlim(min(pos)-width, max(pos)+width*4)\n", "plt.ylim([0, max(df['pre_score'] + df['mid_score'] + df['post_score'])] )\n", "\n", "# Adding the legend and showing the plot\n", "plt.legend(['Pre Score', 'Mid Score', 'Post Score'], loc='upper left')\n", "plt.grid()\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nkCRJNJIpyJycHBOwLGeMJElNTaOfgpQkSQqJCZiUQtZBhME4hcNYhcE4JWcCJkmSlGaNtgZs/I2j\n2bxmdco60rpTZ0b97I467Zufn8/q1avJzc2lTZs2nHbaaTzwwAO0adNml/sxY8YMxo4dy4cffkiL\nFi045JBDmDhxYsW3BWQLa8AkSU1NphZizajNa1Yz+rBDUvb4d7zxVp33zcnJYdasWQwePJiSkhK+\n+c1vcvvttzN+/Pgd9tu2bRvNm9c9JMuWLWPYsGH86U9/4sQTT2TTpk3MmTOH3NzcOj9GMuVJk59i\nlCRp93EKMs26du3KkCFDePvttwFo1qwZv/71r+nTpw99+/YFYNasWQwcOJD27dtz3HHHsWjRomof\na+HChfTs2ZMTTzwRgLZt23LuuefSvXv0tZrbt2/njjvuoHfv3uy1114cfvjhrFy5EoCXXnqJI444\ngry8PI488khefvnlisctKCjgpptu4rjjjqNNmzZ8+OGHLFmyhFNOOYWOHTvSr18/nnzyyZQ9R42J\ndRBhME7hMFZhME7JmYClSflI0ooVK5g9ezaDBg2quG3GjBm89tprvPPOOyxYsIDhw4fz0EMPsW7d\nOr773e9y9tln8+WXX+70mIcddhhLlizh+uuvp6ioiE2bNu1w+4QJE5g6dSqzZ89m48aNTJ48mdat\nW7Nu3TrOOOMMrr32WtatW8f111/PGWecwfr16yvu+8QTT/Dwww+zadMmOnbsyCmnnMKll17KmjVr\nmDp1Kt///vd59913U/RsSZLUuJmApUFZWRnnnHMO7du35/jjj6egoIDRo0dX3D5q1Cjy8vLYc889\n+d3vfsd3v/tdjjjiCHJycrj88svZc889eeWVV3Z63J49e1JUVMSqVasYOnQonTp14oorruDzzz8H\nYOLEifzsZz+jT58+AAwYMIAOHTrw9NNP07dvXy655BKaNWvGhRdeSL9+/Zg5cyYQTTcWFhZy4IEH\n0qxZM5555hl69uzJsGHDaNasGQMHDuTcc891FKwOCgoKMt0F1YFxCoexCoNxSq7R1oBlk5ycHGbM\nmMHgwYOrvb18yhBg+fLlPPbYY9x///0V27Zu3UppaWm19z3qqKOYNm0aAK+//joXXHABP/vZz7jj\njjtYsWIF+++//073KSkpoUePHjts22+//SgpKamxT6+++irt27ev2LZt2zYuv/xyJElS/TkClgUS\n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\nGACGDx/O5MmTmTt3Ltu3b2fVqlW89957dO/enWOPPZZRo0axZcsW3nrrLSZNmrRTbVq5Ll26cOqp\np3L99dfz2WefsX37dj744ANeeOGF3fDMNE6J74qUvYxTOIxVGIxTcqlMwKYALwEHACuoHOUqlzgc\n8g4wPf45G/g+NUxBhq5Xr14ceuihFe3EZSgSi/CHDBnCtddey+DBgznggAM46aSTalyyokWLFixf\nvpyTTz6ZvffemwEDBtCqVSseeeQRAI444ggmT57MddddR15eHgUFBXz00UcATJkyheLiYrp27cq5\n557LrbfeyuDBg3fqT7nHHnuML7/8kv79+9OhQwfOP/98Pv744932/EiS1BQ02u+CzKaFWOUUpCSp\n6altCrLRJmDKLsZIktTUZEsNmNTkWAcRBuMUDmMVBuOUnAmYJElSmjkFqbQwRpKkpsYpSEmSpCxi\nAialkHUQYTBO4TBWYTBOyZmASZIkpZk1YEoLYyRJamqsAZMkScoizTPdgVS56/bRfLEpdSvht2rb\nmRtuuqNO++bn57N69Wpyc3Np06YNp512Gg888ABt2rRp0LGrfkl2df7+97/z05/+lHfeeYfc3FwO\nPPBA7rvvPg4//PAGHVMNU1RUREFBQaa7oSSMUziMVRiMU3KNNgH7YtNqxl09IGWPP+7BRXXeNycn\nh1mzZjF48GBKSkr45je/ye2338748an5KqONGzdy5pln8tvf/pahQ4eyZcsWXnzxRfbcc8/depzt\n27fTrJmDqJIk1Zf/PdOsa9euDBkyhMWLFwMwc+ZMDjroINq3b8+JJ57IkiVLKva966672Hfffdlr\nr73o168fc+fO5ZlnnmH8+PFMmzaNdu3aMWjQoJ2OsXTpUnJycrjgggvIycmhZcuWnHLKKQwYUJmQ\nPvTQQ/Tv35+99tqLgw46iAULFgDw7rvvUlBQQPv27Tn44IN56qmnKu5TWFjI1Vdfzemnn07btm0p\nKiqipKSEb3/723Tu3JlevXpx//33p+qpC5LvAMNgnMJhrMJgnJIzAUuT8gL0FStWMHv2bA499FCW\nLl3KxRdfzC9/+UvWrl3L6aefzllnncXWrVt57733+NWvfsXrr7/Oxo0bmTNnDvn5+QwZMoTRo0dz\n4YUX8tlnn1UkTon69u1Lbm4uhYWFPPPMM6xfv36H25988kluueUWHn/8cTZu3MjMmTPp2LEjW7du\n5ayzzmLIkCGsWbOG+++/n0suuYSlS5dW3HfKlCmMGTOGTZs2ccwxx3DWWWcxaNAgSkpK+Nvf/sZ9\n993HnDlzUvtkSpIUOBOwNCgrK+Occ86hffv2HH/88RQUFDBq1CimTZvGmWeeyUknnURubi4/+clP\n+OKLL3j55ZfJzc1ly5YtvP3222zdupUePXrQq1eviser7ROF7dq14+9//zs5OTlcddVVdO7cmW99\n61usXh3VxD388MPccMMNHHbYYQDsv//+9OjRg1deeYXPP/+ckSNH0rx5c0488UTOPPNMpkyZUvHY\n55xzDscccwwAb731FmvXruWmm26iefPm9OzZkxEjRjB16tRUPZXBcS2cMBincBirMBin5EzA0iAn\nJ4cZM2awfv16iouLeeCBB2jZsiWlpaX06NFjh/26d+/OqlWr6N27N/fddx/jxo1jn3324aKLLqK0\ntLTOx+zXrx+TJ09mxYoVLF68mJKSEq699loAVq5cyf7777/TfUpKSujevfsO2/bbbz9KSkoq+rfv\nvvtW3LZ8+XJKSkpo3759xWX8+PEViZ4kSaqeCVgGde3aleXLl1e0y8rKWLFiBd26dQPgoosu4sUX\nX2T58uXk5ORwww03ABXritRZ3759GTZsWEXdWffu3Vm2bFm1/VmxYsUOo2vLly+v6E/VY/fo0YOe\nPXuyfv36isvGjRuZNWtWvfrXmFkHEQbjFA5jFQbjlJwJWAYNHTqUp59+mrlz57J161YmTJhAy5Yt\nOfbYY1m6dClz585ly5Yt7LnnnrRs2ZLc3FwAvv71r1NcXFzjNOR7773HPffcw6pVq4Co7mzKlCkV\nU4cjRozgF7/4BfPnz6esrIxly5bx0UcfcfTRR9O6dWvuvvtutm7dSlFREbNmzeLCCy8E2Ol4Rx55\nJO3atePuu+/miy++4KuvvmLx4sW8/vrrqXrKJElqFEzAMuiAAw7giSee4Ic//CGdOnXi6aef5qmn\nnqJ58+Zs2bKFUaNG0alTJ7p06cLatWsrlq04//zzAejYsWO163q1a9eOV199laOOOoq2bdtyzDHH\ncMghhzBhwgQAzjvvPG688UYuvvhi9tprL84991zWr1/PHnvswVNPPcXs2bPp1KkT11xzDY8//jgH\nHHAAEI1+JY6ANWvWjFmzZrFw4UJ69epFp06d+M53vsPGjRtT/dQFwzqIMBincBirMBin5BrtVxFl\n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\ngg==\n", "text": [ "" ] } ], "prompt_number": 27 } ], "metadata": {} } ] }