{ "metadata": { "name": "", "signature": "sha256:334033bd747eb3f6eb0ab0e9c2ca1c5665a54833d8e8e63affcc7386c0c82926" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Stacked Percentage 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" ], "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 a figure with a single subplot\n", "f, ax = plt.subplots(1, figsize=(10,5))\n", "\n", "# Set bar width at 1\n", "bar_width = 1\n", "\n", "# positions of the left bar-boundaries\n", "bar_l = [i 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 the total score for each participant\n", "totals = [i+j+k for i,j,k in zip(df['pre_score'], df['mid_score'], df['post_score'])]\n", "\n", "# Create the percentage of the total score the pre_score value for each participant was\n", "pre_rel = [i / j * 100 for i,j in zip(df['pre_score'], totals)]\n", "\n", "# Create the percentage of the total score the mid_score value for each participant was\n", "mid_rel = [i / j * 100 for i,j in zip(df['mid_score'], totals)]\n", "\n", "# Create the percentage of the total score the post_score value for each participant was\n", "post_rel = [i / j * 100 for i,j in zip(df['post_score'], totals)]\n", "\n", "# Create a bar chart in position bar_1\n", "ax.bar(bar_l, \n", " # using pre_rel data\n", " pre_rel, \n", " # labeled \n", " label='Pre Score', \n", " # with alpha\n", " alpha=0.9, \n", " # with color\n", " color='#019600',\n", " # with bar width\n", " width=bar_width,\n", " # with border color\n", " edgecolor='white'\n", " )\n", "\n", "# Create a bar chart in position bar_1\n", "ax.bar(bar_l, \n", " # using mid_rel data\n", " mid_rel, \n", " # with pre_rel\n", " bottom=pre_rel, \n", " # labeled \n", " label='Mid Score', \n", " # with alpha\n", " alpha=0.9, \n", " # with color\n", " color='#3C5F5A', \n", " # with bar width\n", " width=bar_width,\n", " # with border color\n", " edgecolor='white'\n", " )\n", "\n", "# Create a bar chart in position bar_1\n", "ax.bar(bar_l, \n", " # using post_rel data\n", " post_rel, \n", " # with pre_rel and mid_rel on bottom\n", " bottom=[i+j for i,j in zip(pre_rel, mid_rel)], \n", " # labeled \n", " label='Post Score',\n", " # with alpha\n", " alpha=0.9, \n", " # with color\n", " color='#219AD8', \n", " # with bar width\n", " width=bar_width,\n", " # with border color\n", " edgecolor='white'\n", " )\n", "\n", "# Set the ticks to be first names\n", "plt.xticks(tick_pos, df['first_name'])\n", "ax.set_ylabel(\"Percentage\")\n", "ax.set_xlabel(\"\")\n", "\n", "# Let the borders of the graphic\n", "plt.xlim([min(tick_pos)-bar_width, max(tick_pos)+bar_width])\n", "plt.ylim(-10, 110)\n", "\n", "# rotate axis labels\n", "plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')\n", "\n", "# shot plot\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n19P/B8WkMsoAyiK/AAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 4 } ], "metadata": {} } ] }