{ "metadata": { "name": "", "signature": "sha256:267f41f412f147dfa89690e4b76763993da24e0d25f9da2dd9e61997be7fdf45" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Stacked 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": [ "# Create the general blog and the \"subplots\" i.e. the bars\n", "f, ax1 = plt.subplots(1, figsize=(10,5))\n", "\n", "# Set the bar width\n", "bar_width = 0.75\n", "\n", "# positions of the left bar-boundaries\n", "bar_l = [i+1 for i in range(len(df['pre_score']))] \n", "\n", "# positions of the x-axis ticks (center of the bars as bar labels)\n", "tick_pos = [i+(bar_width/2) for i in bar_l] \n", "\n", "# Create a bar plot, in position bar_1\n", "ax1.bar(bar_l, \n", " # using the pre_score data\n", " df['pre_score'], \n", " # set the width\n", " width=bar_width,\n", " # with the label pre score\n", " label='Pre Score', \n", " # with alpha 0.5\n", " alpha=0.5, \n", " # with color\n", " color='#F4561D')\n", "\n", "# Create a bar plot, in position bar_1\n", "ax1.bar(bar_l, \n", " # using the mid_score data\n", " df['mid_score'], \n", " # set the width\n", " width=bar_width,\n", " # with pre_score on the bottom\n", " bottom=df['pre_score'], \n", " # with the label mid score\n", " label='Mid Score', \n", " # with alpha 0.5\n", " alpha=0.5, \n", " # with color\n", " color='#F1911E')\n", "\n", "# Create a bar plot, in position bar_1\n", "ax1.bar(bar_l, \n", " # using the post_score data\n", " df['post_score'], \n", " # set the width\n", " width=bar_width,\n", " # with pre_score and mid_score on the bottom\n", " bottom=[i+j for i,j in zip(df['pre_score'],df['mid_score'])], \n", " # with the label post score\n", " label='Post Score', \n", " # with alpha 0.5\n", " alpha=0.5, \n", " # with color\n", " color='#F1BD1A')\n", "\n", "# set the x ticks with names\n", "plt.xticks(tick_pos, df['first_name'])\n", "\n", "# Set the label and legends\n", "ax1.set_ylabel(\"Total Score\")\n", "ax1.set_xlabel(\"Test Subject\")\n", "plt.legend(loc='upper left')\n", "\n", "# Set a buffer around the edge\n", "plt.xlim([min(tick_pos)-bar_width, max(tick_pos)+bar_width])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "(0.625, 6.125)" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nkiRJkiTpQPx/IRzMJkx2K2wAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 17 } ], "metadata": {} } ] }