{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Building Waffle Chart\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Let's import the libraries first" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import matplotlib.patches as mpatches # needed for waffle Charts\n", "%matplotlib inline\n", "mpl.style.use('ggplot') # optional: for ggplot-like style\n", "\n", "# check for latest version of Matplotlib\n", "print ('Matplotlib version: ', mpl.__version__) # >= 2.0.0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Downloading and Prepping Data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Data downloaded and read into a dataframe!\n" ] } ], "source": [ "df_can = pd.read_excel('https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Canada.xlsx',\n", " sheet_name='Canada by Citizenship',\n", " skiprows=range(20),\n", " skipfooter=2)\n", "\n", "print('Data downloaded and read into a dataframe!')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dataset: Immigration to Canada from 1980 to 2013 - [International migration flows to and from selected countries - The 2015 revision](http://www.un.org/en/development/desa/population/migration/data/empirical2/migrationflows.shtml) from United Nation's website\n", "\n", "The dataset contains annual data on the flows of international migrants as recorded by the countries of destination. The data presents both inflows and outflows according to the place of birth, citizenship or place of previous / next residence both for foreigners and nationals. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TypeCoverageOdNameAREAAreaNameREGRegNameDEVDevName1980...2004200520062007200820092010201120122013
0ImmigrantsForeignersAfghanistan935Asia5501Southern Asia902Developing regions16...2978343630092652211117461758220326352004
1ImmigrantsForeignersAlbania908Europe925Southern Europe901Developed regions1...14501223856702560716561539620603
2ImmigrantsForeignersAlgeria903Africa912Northern Africa902Developing regions80...3616362648073623400553934752432537744331
3ImmigrantsForeignersAmerican Samoa909Oceania957Polynesia902Developing regions0...0010000000
4ImmigrantsForeignersAndorra908Europe925Southern Europe901Developed regions0...0011000011
\n", "

5 rows × 43 columns

\n", "
" ], "text/plain": [ " Type Coverage OdName AREA AreaName REG \\\n", "0 Immigrants Foreigners Afghanistan 935 Asia 5501 \n", "1 Immigrants Foreigners Albania 908 Europe 925 \n", "2 Immigrants Foreigners Algeria 903 Africa 912 \n", "3 Immigrants Foreigners American Samoa 909 Oceania 957 \n", "4 Immigrants Foreigners Andorra 908 Europe 925 \n", "\n", " RegName DEV DevName 1980 ... 2004 2005 2006 \\\n", "0 Southern Asia 902 Developing regions 16 ... 2978 3436 3009 \n", "1 Southern Europe 901 Developed regions 1 ... 1450 1223 856 \n", "2 Northern Africa 902 Developing regions 80 ... 3616 3626 4807 \n", "3 Polynesia 902 Developing regions 0 ... 0 0 1 \n", "4 Southern Europe 901 Developed regions 0 ... 0 0 1 \n", "\n", " 2007 2008 2009 2010 2011 2012 2013 \n", "0 2652 2111 1746 1758 2203 2635 2004 \n", "1 702 560 716 561 539 620 603 \n", "2 3623 4005 5393 4752 4325 3774 4331 \n", "3 0 0 0 0 0 0 0 \n", "4 1 0 0 0 0 1 1 \n", "\n", "[5 rows x 43 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_can.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Clean up data. We will make some modifications to the original dataset to make it easier to create our visualization." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "data dimensions: (195, 38)\n" ] } ], "source": [ "# clean up the dataset to remove unnecessary columns (eg. REG) \n", "df_can.drop(['AREA','REG','DEV','Type','Coverage'], axis = 1, inplace = True)\n", "\n", "# let's rename the columns so that they make sense\n", "df_can.rename (columns = {'OdName':'Country', 'AreaName':'Continent','RegName':'Region'}, inplace = True)\n", "\n", "# for sake of consistency, let's also make all column labels of type string\n", "df_can.columns = list(map(str, df_can.columns))\n", "\n", "# set the country name as index - useful for quickly looking up countries using .loc method\n", "df_can.set_index('Country', inplace = True)\n", "\n", "# add total column\n", "df_can['Total'] = df_can.sum (axis = 1)\n", "\n", "# years that we will be using in this lesson - useful for plotting later on\n", "years = list(map(str, range(1980, 2014)))\n", "print ('data dimensions:', df_can.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Waffle Charts \n", "\n", "\n", "A `waffle chart` is an interesting visualization that is normally created to display progress toward goals. It is commonly an effective option when you are trying to add interesting visualization features to a visual that consists mainly of cells, such as an Excel dashboard." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's revisit the previous case study about Denmark, Norway, and Sweden." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/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", " \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", " \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", "
ContinentRegionDevName1980198119821983198419851986...200520062007200820092010201120122013Total
Country
DenmarkEuropeNorthern EuropeDeveloped regions272293299106937393...621019710881929394813901
NorwayEuropeNorthern EuropeDeveloped regions1167710651315456...5753736675464953592327
SwedenEuropeNorthern EuropeDeveloped regions281308222176128158187...2051391931651671591341401405866
\n", "

3 rows × 38 columns

\n", "
" ], "text/plain": [ " Continent Region DevName 1980 1981 1982 1983 \\\n", "Country \n", "Denmark Europe Northern Europe Developed regions 272 293 299 106 \n", "Norway Europe Northern Europe Developed regions 116 77 106 51 \n", "Sweden Europe Northern Europe Developed regions 281 308 222 176 \n", "\n", " 1984 1985 1986 ... 2005 2006 2007 2008 2009 2010 2011 \\\n", "Country ... \n", "Denmark 93 73 93 ... 62 101 97 108 81 92 93 \n", "Norway 31 54 56 ... 57 53 73 66 75 46 49 \n", "Sweden 128 158 187 ... 205 139 193 165 167 159 134 \n", "\n", " 2012 2013 Total \n", "Country \n", "Denmark 94 81 3901 \n", "Norway 53 59 2327 \n", "Sweden 140 140 5866 \n", "\n", "[3 rows x 38 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# let's create a new dataframe for these three countries \n", "df_dsn = df_can.loc[['Denmark', 'Norway', 'Sweden'], :]\n", "\n", "# let's take a look at our dataframe\n", "df_dsn" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Unfortunately, unlike R, `waffle` charts are not built into any of the Python visualization libraries. Therefore, we will learn how to create them from scratch." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 1.** The first step into creating a waffle chart is determing the proportion of each category with respect to the total." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Denmark: 0.32255663965602777\n", "Norway: 0.1924094592359848\n", "Sweden: 0.48503390110798744\n" ] } ], "source": [ "# compute the proportion of each category with respect to the total\n", "total_values = sum(df_dsn['Total'])\n", "category_proportions = [(float(value) / total_values) for value in df_dsn['Total']]\n", "\n", "# print out proportions\n", "for i, proportion in enumerate(category_proportions):\n", " print (df_dsn.index.values[i] + ': ' + str(proportion))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 2.** The second step is defining the overall size of the `waffle` chart." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of tiles is 400\n" ] } ], "source": [ "width = 40 # width of chart\n", "height = 10 # height of chart\n", "\n", "total_num_tiles = width * height # total number of tiles\n", "\n", "print ('Total number of tiles is ', total_num_tiles)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 3.** The third step is using the proportion of each category to determe it respective number of tiles" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Denmark: 129\n", "Norway: 77\n", "Sweden: 194\n" ] } ], "source": [ "# compute the number of tiles for each catagory\n", "tiles_per_category = [round(proportion * total_num_tiles) for proportion in category_proportions]\n", "\n", "# print out number of tiles per category\n", "for i, tiles in enumerate(tiles_per_category):\n", " print (df_dsn.index.values[i] + ': ' + str(tiles))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Based on the calculated proportions, Denmark will occupy 129 tiles of the `waffle` chart, Norway will occupy 77 tiles, and Sweden will occupy 194 tiles." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 4.** The fourth step is creating a matrix that resembles the `waffle` chart and populating it." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Waffle chart populated!\n" ] } ], "source": [ "# initialize the waffle chart as an empty matrix\n", "waffle_chart = np.zeros((height, width))\n", "\n", "# define indices to loop through waffle chart\n", "category_index = 0\n", "tile_index = 0\n", "\n", "# populate the waffle chart\n", "for col in range(width):\n", " for row in range(height):\n", " tile_index += 1\n", "\n", " # if the number of tiles populated for the current category is equal to its corresponding allocated tiles...\n", " if tile_index > sum(tiles_per_category[0:category_index]):\n", " # ...proceed to the next category\n", " category_index += 1 \n", " \n", " # set the class value to an integer, which increases with class\n", " waffle_chart[row, col] = category_index\n", " \n", "print ('Waffle chart populated!')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's take a peek at how the matrix looks like." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2.,\n", " 2., 2., 2., 2., 2., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3.],\n", " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2.,\n", " 2., 2., 2., 2., 2., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3.],\n", " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2.,\n", " 2., 2., 2., 2., 2., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3.],\n", " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2.,\n", " 2., 2., 2., 2., 2., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3.],\n", " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2.,\n", " 2., 2., 2., 2., 2., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3.],\n", " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2.,\n", " 2., 2., 2., 2., 2., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3.],\n", " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2.,\n", " 2., 2., 2., 2., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3.],\n", " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2.,\n", " 2., 2., 2., 2., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3.],\n", " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2.,\n", " 2., 2., 2., 2., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3.],\n", " [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2., 2.,\n", " 2., 2., 2., 2., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3., 3.,\n", " 3., 3., 3., 3., 3., 3., 3., 3.]])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "waffle_chart" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As expected, the matrix consists of three categories and the total number of each category's instances matches the total number of tiles allocated to each category." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 5.** Map the `waffle` chart matrix into a visual." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# instantiate a new figure object\n", "fig = plt.figure()\n", "\n", "# use matshow to display the waffle chart\n", "colormap = plt.cm.coolwarm\n", "plt.matshow(waffle_chart, cmap=colormap)\n", "plt.colorbar()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 6.** Prettify the chart." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([], )" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# instantiate a new figure object\n", "fig = plt.figure()\n", "\n", "# use matshow to display the waffle chart\n", "colormap = plt.cm.coolwarm\n", "plt.matshow(waffle_chart, cmap=colormap)\n", "plt.colorbar()\n", "\n", "# get the axis\n", "ax = plt.gca()\n", "\n", "# set minor ticks\n", "ax.set_xticks(np.arange(-.5, (width), 1), minor=True)\n", "ax.set_yticks(np.arange(-.5, (height), 1), minor=True)\n", " \n", "# add gridlines based on minor ticks\n", "ax.grid(which='minor', color='w', linestyle='-', linewidth=2)\n", "\n", "plt.xticks([])\n", "plt.yticks([])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Step 7.** Create a legend and add it to chart." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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I9A4Jk+ePLkiD/jlQpzK8EecQMqFONUTJ5ByIU71xAmkXIhTPXECKRfiVE+cQMqFONUTJ5ByCcQ41entf56QYcjrMbj3lZc71TJYEwMAAAAEqSF//tqndkvTm1ZpHhXF7mQAAABAkPLH9smXA0UMAAAAEKRKSkoudwq/CUUMAAAAEKQYiQEAAABgKRQxAAAAACzFqnt8UcQAAAAAQcoTgPeA8QVFDAAAABCkmE4GAAAAwFIMg5EYAAAAABbicVPEAH5nGIaOHz+u8+fPX+5UAAAXERISovr168tms13uVABUkIeRGMD/jh8/LrfbrZo1a17uVAAAF3H+/HkdP35cDRo0uNypAKgg1sQAVeD8+fMUMAAQ4EJCQlRcXHy50wDwGxjsTgYAAADAShiJAQAAAGAp7E4GVIN9x8J1ttjht3hhNUuU0Oj0Jds0atRI11xzjdxutxwOh4YOHarRo0fLbrf7LY/KaNq0qb7++utLtiksLNSwYcO0YsUKff/997r33ntVUlIit9utUaNGacSIEZKkd999V88995w8Ho9cLpfS0tIkSefOndODDz6oPXv2KCoqSgsXLlRcXJzy8/M1atQo7dq1S8OGDdPMmTPNPgcOHKhFixbpyiuv9PvPfO7saXk8JX6LZ7c7VCss/JJtGjRooJSUFE2ZMkWSNH/+fJ05c0aPPfaY3/KorB9//FGPPvqoXn/9dW3cuFHTpk3T+fPnFRISorS0NHXt2lWSNHToUP34448qKSlRhw4d9PTTT8vhcGjy5Mlau3atQkJC1LRpU82bN08RERFatmyZ5s+fb/azb98+ffjhh7ruuuuq9Hk+POFpFR781m/xajdroqueefySbZ577jmtWLFCdrtddrtds2fPVrt27fyWgy9/r77KyMjQlVdeqaFDh2rWrFl67bXXFB0dLUmaNGmSXC6Xzp8/r0ceeUSfffaZ3G63hgwZoocffliSVFBQoEceeURffvmlbDab5syZo/bt20uSXnnlFS1atEg1atQwXwv27dunF198Uc8//7xf8gcQGDyMxABV72yxQyeKQqq1z9DQUG3YsEFS6UYDKSkpOnnypB5//NJvhqqaYRgyDN9eeN544w3deuutcjgcatiwod577z3VqlVLp0+fVmJiopKTk1WzZk099dRT+te//qV69erpwQcf1ObNm9WtWze9/vrrioiI0LZt2/TOO+9o6tSpevnll1WrVi09/vjj+vLLL/Xll1+W6XPw4MFasmSJHnnkEb//7B5PiYwS/xUxvnwGVatWLb3//vt6+OGHzTeKFeF2u1WjRtW+5L744ou6++67JUnR0dF67bXX1KhRI/3v//6vhg4dqr1790oqfYNap04dGYahkSNHauXKlbrtttuUmJioJ554QjVq1NCUKVM0d+5c/eUvf9GgQYM0aNAgSaUFzH/8x3/ouuuuk1S1z3PhwW91eutuv8e9mO3bt2vt2rX68MMPVatWLeXl5QXszohut1tvvPGG1q1bZ54bPXq0xhRyR/QAABAySURBVI4dW6bdypUrVVxcrE2bNuns2bPq2rWrbrvtNsXFxWnSpEnq0aOHFi9erOLiYhUWFkqSPvroI61Zs0YbN25UrVq1dPz4cUlSQkKCvv/+e3333Xdq3Lhx9f2wAKqUx+2f/08XLFignTt3KiIiQunp6eWuG4ahJUuWaNeuXapVq5bGjBmj+Ph4SdLGjRu1YsUKSdLtt9+upKQkr/0FxkfJgEXUr19f6enpWrx4sQzDUElJiSZPnqzevXsrMTFR//3f/y1JyszM1IABAzRy5Eh16tRJKSkpZsHRrl07TZ8+XTfffLN69eqlvXv3asiQIWrfvr1effVVSdLp06c1cOBA9ezZU4mJiVqzZo0k6ZtvvlHnzp312GOPqWfPnjp69KiZW15enm6++Wb961//Kpf38uXLlZycLEmqWbOmatWqJUkqLi6W5/8v6Dty5Iji4+NVr149SVK3bt20evVqSdIHH3ygoUOHSpL69eunLVu2yDAMXXHFFerYsaNCQ0PL9ZmcnKx33nmncv/gAcThcGj48OHKyMgod+3bb7/VwIEDlZiYqIEDB+q7776TJD300EN68sknddttt2nKlClKTExUQUGBDMNQy5Yt9dZbb0mSxowZo02bNumbb75Rv3791LNnT/Xs2VPbtm0zr//8OyBJKSkp+uCDD8rlsXr1avXo0UOSdN1116lRo0aSpFatWuncuXM6d+6cJKlOnTqSSt8Inz9/3twWt3v37mah1a5dO33//ffl+njnnXd0++23m9//np7nH3/8UdHR0ebfR3R0tBo1aqSdO3eao5Vr1qxRXFyciouLVVRUJKfTKUk6fPiwhg4dKpfLpX79+unAgQOSSv+ubr75ZvXu3bvMSKUkvfDCC+Zrx9NPPy3p//7GH330UXXt2lWDBw82i4tf2rJli1q3bu21MLbZbDp79qzcbreKiooUEhKiOnXq6NSpU9q6davuuusuSaWvCxEREZKkV199VePGjTP/HerXr2/G69Onz+/m+QZQyjA8Ph3eJCUl6b/+678uen3Xrl06duyY5s2bp/vvv1+vvPKKpNL3PMuWLdOMGTM0Y8YMLVu2TKdPX3qWjEQRA1RY06ZN5fF4dPz4cb3++uuqW7eu1q5dq7Vr1+q1117TkSNHJEmfffaZpk2bpo8++khHjhzRp59+asaIiYnRmjVr1LFjRz300ENavHix1qxZo1mzZkkqHf159dVXtW7dOq1YsUJpaWlmEZSdna0hQ4Zo/fr1atKkiSQpJydHd911lx5//HH16tWrTL7FxcU6cuSI4uLizHNHjx5VYmKibrjhBj344INq1KiRrrrqKmVnZ+ubb76R2+3WmjVrzDexx44dU2xsrCSpRo0aqlOnjvLz8y/573TllVfq3LlzXttZyciRI7V8+XKdPHmyzPmJEydq8ODB2rRpkwYOHFjmRfzQoUNatmyZpkyZovbt22vbtm368ssv9Yc//MH8ndixY4fatWunevXq6e2339a6dev08ssva9KkSZKku+++W2+++aYk6eTJk8rKypLL5SqTw5EjR3TllVeabzx/afXq1br22mvLXBsyZIgSEhIUHh6ufv36lXvMm2++qZ49e5Y7/+677+q2224zv/89Pc9JSUk6evSoOnbsqMcee0wff/yxJKl169b6/PPPJUlbt25Vq1attGvXLu3cudOcavaf//mf+utf/6oPP/xQkydPNkdqn3jiCY0YMUJr164tUwxs2LBBhw8f1j//+U9t2LBBe/fu1SeffCKp9Hfm3nvv1ZYtWxQREWF+mPBL27Zt0/XXX1/m3OLFi5WYmKiHH35YJ06ckFT6oUNYWJiuu+46tW3bVmPGjFFkZKS+/vprRUdHa9y4cerRo4ceeeQRnTlzRpJ08OBBbd26VcnJyfr3f/937dq1y+zj+uuvL/NaBsD6DI/h0+HNz/+nXExWVpa6desmm82mq6++WmfOnNFPP/2k3bt3q3Xr1goPD1d4eLhat26t3bu9j8IznQz4DX4uKDZu3Kh9+/Zp1apVkqRTp07p0KFDqlmzpm644QbFxMRIkq699lp9++236tixoySZoyLXXHONzpw5Y/7h1qpVSwUFBQoLC9P06dP1ySefyG6369ixY8rJyZEkNWnSxPz0Vyr9NH3QoEGaOXOmOnXqVC7X/Px88xPWn8XGxmrTpk06duyY7rnnHvXr108NGjTQrFmzdP/998tms6l9+/ZmQXahaWu+3NSuXr16OnbsmKKiory2tYI6depo8ODBevnll8uMPmVlZWnJkiWSSqdX/bxuRip9E+lwlK7j6tixoz755BM1btxYI0aM0N///nf98MMPioyMVHh4uE6ePKnU1FR98cUXstvtOnTokCSpU6dOSk1N1fHjx/Xee+/p1ltvLfcJ/M+jCL/25ZdfasqUKVq6dGmZ80uXLlVRUZEeeOABbdmypczQ/XPPPSeHw2FOIfvZjh07FBYWpmuuuabM+d/L8xweHq4PP/xQW7du1UcffaQ//elPevLJJzVs2DA1bdpUX331lXbt2qWUlBRt3brVXFN0+vRpbd++XaNGjTJj/bzd8LZt27R48WJJpYXj1KlTJZW+dmzcuNEcOTtz5owOHTqk2NhYxcXFmdP1WrdurW+/Lb8uKCcnR1dffbX5/YgRI/TnP/9ZNptNM2fOVFpamubOnaudO3fKbrdr7969OnHihPr3769u3bqppKREe/fu1YwZM9SuXTtNmjRJzz//vFJTU1VSUqKCggKtWbNGu3bt0p/+9Cdt375dNptN9evX17Fjx6rmCQBwWWz5R1ef2hUWFuqpp54yv3e5XOU+ULuU/Px8c7aHVDranZ+fr/z8/DL/f0VFRfn0wRhFDFBBX3/9tRwOh+rXry/DMDRjxgzzjcjPMjMzy3zq7XA4VPKLNRw/3/vGbreXuQ+O3W6X2+3W8uXLlZeXpw8//FAhISFq166dORUoLCysTF81atRQ69attWHDhgsWMaGhoeZjf61Ro0Zq2bKlPv30U/Xr1099+vRRnz59JEl/+9vfzDff//Zv/6ajR48qJiZGbrdbp06dUmRkpNd/q3Pnzl1wqpmVjR49Wi6XS8OGDbtom18WeFdccYX59U033aTFixerSZMmmjhxot5//32tWrVKHTp0kCS99NJLql+/vjZs2CCPx2OOtEnSoEGDtHz5cr377ruaM2dOuT5r165d7nn+/vvvNWLECL3wwgu66qqryj0mNDRUffr00QcffGAWMf/zP/+jtWvXavny5eUK1V+Pwvzs9/Q8OxwOde7cWZ07d1ZCQoLeeustDRs2TB07dtS6desUEhKibt26ady4ceZ0UsMwVLduXXPt3K9dqOA3DEPjxo3TPffcU+b8N998U+61o6ioqNzjf/13/cubTN59993m2qgVK1aoR48eCgkJUf369XXjjTdqz5496tixo2JiYsyRpH79+mnevHmSSv/eb731VtlsNrVt21Y2m015eXmqV6+eioqKfjfPNYCKqV27drlpsRVRkQ9EffmglOlkQAXk5uZqwoQJGjlypGw2m7p3765XX33VXPx78OBBc0pGZZw8eVL16tVTSEiIPvroowt+EvtLc+fO1YEDB8w3Ib905ZVXqqSkxHwj9P3335tz7E+cOKFt27apWbNmkmQu4D1x4oSWLFlivhHq06ePuX5j1apV6tKli9cXGMMwlJOTU2Ya2+9BZGSk+vfvrzfeeMM81759e3OdwPLly3XjjTde8LGxsbHKz8/XoUOH1LRpU914441asGCBOUJ36tQpNWzYUHa7XW+//XaZwnfYsGFauHChpNI1Lr8WHx9f5vekoKBAd955pyZNmmQWSVLp3OMff/xRUuko3rp169SiRQtJ0vr16/XCCy/o73//e7li2ePxaOXKlRowYECZ87+n5zk7O9sc/ZKkzz//3FzAftNNN2nhwoVyOp2qV6+efvrpJ2VnZ6tVq1aqU6eO4uLitHLlSkml/yY/Tz+78cYbzd+NZcuWmbG7d++uN99805z3/cMPP5h/f75o0aKFDh8+bH7/83MqSe+//775OxIbG6uPPvpIhmHozJkz2rFjh5o3b66GDRsqJiZG2dnZkqTNmzebIzs333yztmzZIqn0Ne38+fPmp6QHDx684O8fAHgTHR2t3Nxc8/u8vDxFRkYqKipKeXl55vn8/HyfPihlJAaWElbTfztS+RqvqKhI3bt3N7dYHjx4sB544AFJpZ94fvvtt3K5XDIMQ9HR0ebi/soYOHCg7r77bvXq1UvXXnut+SbzYhwOhxYuXKi7775b4eHhGjlyZJnrSUlJ+vTTT5WYmKivvvpKaWlpstlsMgxDY8aMUUJCgqTS+ftffPGFJOnPf/6zWdzcddddGjt2rG688UZFRkaWWdzerl07nTp1SsXFxVqzZo2WLl2qli1bas+ePWrXrl2V7Mhltzt82lGsIvEq4oEHHjCnCEnS9OnTNX78eM2fP1/16tXT3LlzL/rYtm3bmpspdOzYUdOnTzeLjHvvvVf33nuvVq1apc6dO5cpJBo0aKAWLVro5ptvvmDcK664Qk2bNtWhQ4cUHx+vRYsW6euvv9azzz6rZ599VlLpFDLDMDR8+HCdO3dOHo9HXbp0MUcDUlNTVVxcrMGDB0sqfW5nz54tSfrkk08UExOjpk2blum3Kp/n2s2aeG/kx3hnzpzRxIkTdfLkSTkcDl111VXmDjtt27bV8ePHzYIzISFB9erVM4v5F198UY899pieffZZud1uDRgwQNdee62mTZumlJQUvfzyy+rbt6/ZV/fu3XXgwAHdeuutkkpHWBcsWGCOfnrTs2fPMjuRPfXUU+bfblxcnPm8jRw5Ug8//LC6desmwzA0bNgw/fGPf5QkzZgxQw888ICKi4v1hz/8wfwQ5M477zQfExISoueff978OTMzM8utuwMAXzidTn3wwQfq3LmzDhw4oLCwMEVGRqpNmzZlPtTZs2eP7rzzTq/xbIave7QCl8HRo0fLTLfCb/PZZ5/pxRdf1IIFC6qtz0mTJqlPnz7q1q1btfX5e3b27FklJiZq3bp1qlu37gXbvPfee9q7d68mTpxYbXnxPF8+99xzj9LS0swtSqvauXPnNGDAAK1ateqCRWtxcbG5AQiA4DNnzhzt27dPp06dUkREhIYMGSK32y1J6t27twzD0KJFi7Rnzx7VrFlTY8aMMT8sXb9+vTlqffvtt6t79+5e+2MkBggC1113nbp06aKSkhKfP+mtrFatWvHG1k82bdqk8ePHKyUl5aIFjCTdeuut+umnn6oxM57ny+nJJ5/Ujz/+WG1FzNGjR837CAHAr40fP/6S1202m+67774LXuvRo0e59cXeMBKDgMZIDABYAyMxAKoTC/sBAAAAWApFDAJaSEiIufMXACAwnT9/XiEhIZc7DQBBhOlkCGiGYej48eMUMgAQwH6+D40v93YAAH+giAEAAABgKUwnAwAAAGApFDEAAAAALIUiBgAAAIClUMQAAAAAsBSKGAAAAACW8v8AbkjwTQI1iXAAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# instantiate a new figure object\n", "fig = plt.figure()\n", "\n", "# use matshow to display the waffle chart\n", "colormap = plt.cm.coolwarm\n", "plt.matshow(waffle_chart, cmap=colormap)\n", "plt.colorbar()\n", "\n", "# get the axis\n", "ax = plt.gca()\n", "\n", "# set minor ticks\n", "ax.set_xticks(np.arange(-.5, (width), 1), minor=True)\n", "ax.set_yticks(np.arange(-.5, (height), 1), minor=True)\n", " \n", "# add gridlines based on minor ticks\n", "ax.grid(which='minor', color='w', linestyle='-', linewidth=2)\n", "\n", "plt.xticks([])\n", "plt.yticks([])\n", "\n", "# compute cumulative sum of individual categories to match color schemes between chart and legend\n", "values_cumsum = np.cumsum(df_dsn['Total'])\n", "total_values = values_cumsum[len(values_cumsum) - 1]\n", "\n", "# create legend\n", "legend_handles = []\n", "for i, category in enumerate(df_dsn.index.values):\n", " label_str = category + ' (' + str(df_dsn['Total'][i]) + ')'\n", " color_val = colormap(float(values_cumsum[i])/total_values)\n", " legend_handles.append(mpatches.Patch(color=color_val, label=label_str))\n", "\n", "# add legend to chart\n", "plt.legend(handles=legend_handles,\n", " loc='lower center', \n", " ncol=len(df_dsn.index.values),\n", " bbox_to_anchor=(0., -0.2, 0.95, .1)\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And there you go! What a good looking *delicious* `waffle` chart, don't you think?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now it would very inefficient to repeat these seven steps every time we wish to create a `waffle` chart. So let's combine all seven steps into one function called *create_waffle_chart*. This function would take the following parameters as input:\n", "\n", "> 1. **categories**: Unique categories or classes in dataframe.\n", "> 2. **values**: Values corresponding to categories or classes.\n", "> 3. **height**: Defined height of waffle chart.\n", "> 4. **width**: Defined width of waffle chart.\n", "> 5. **colormap**: Colormap class\n", "> 6. **value_sign**: In order to make our function more generalizable, we will add this parameter to address signs that could be associated with a value such as %, $, and so on. **value_sign** has a default value of empty string." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "def create_waffle_chart(categories, values, height, width, colormap, value_sign=''):\n", "\n", " # compute the proportion of each category with respect to the total\n", " total_values = sum(values)\n", " category_proportions = [(float(value) / total_values) for value in values]\n", "\n", " # compute the total number of tiles\n", " total_num_tiles = width * height # total number of tiles\n", " print ('Total number of tiles is', total_num_tiles)\n", " \n", " # compute the number of tiles for each catagory\n", " tiles_per_category = [round(proportion * total_num_tiles) for proportion in category_proportions]\n", "\n", " # print out number of tiles per category\n", " for i, tiles in enumerate(tiles_per_category):\n", " print (df_dsn.index.values[i] + ': ' + str(tiles))\n", " \n", " # initialize the waffle chart as an empty matrix\n", " waffle_chart = np.zeros((height, width))\n", "\n", " # define indices to loop through waffle chart\n", " category_index = 0\n", " tile_index = 0\n", "\n", " # populate the waffle chart\n", " for col in range(width):\n", " for row in range(height):\n", " tile_index += 1\n", "\n", " # if the number of tiles populated for the current category \n", " # is equal to its corresponding allocated tiles...\n", " if tile_index > sum(tiles_per_category[0:category_index]):\n", " # ...proceed to the next category\n", " category_index += 1 \n", " \n", " # set the class value to an integer, which increases with class\n", " waffle_chart[row, col] = category_index\n", " \n", " # instantiate a new figure object\n", " fig = plt.figure()\n", "\n", " # use matshow to display the waffle chart\n", " colormap = plt.cm.coolwarm\n", " plt.matshow(waffle_chart, cmap=colormap)\n", " plt.colorbar()\n", "\n", " # get the axis\n", " ax = plt.gca()\n", "\n", " # set minor ticks\n", " ax.set_xticks(np.arange(-.5, (width), 1), minor=True)\n", " ax.set_yticks(np.arange(-.5, (height), 1), minor=True)\n", " \n", " # add dridlines based on minor ticks\n", " ax.grid(which='minor', color='w', linestyle='-', linewidth=2)\n", "\n", " plt.xticks([])\n", " plt.yticks([])\n", "\n", " # compute cumulative sum of individual categories to match color schemes between chart and legend\n", " values_cumsum = np.cumsum(values)\n", " total_values = values_cumsum[len(values_cumsum) - 1]\n", "\n", " # create legend\n", " legend_handles = []\n", " for i, category in enumerate(categories):\n", " if value_sign == '%':\n", " label_str = category + ' (' + str(values[i]) + value_sign + ')'\n", " else:\n", " label_str = category + ' (' + value_sign + str(values[i]) + ')'\n", " \n", " color_val = colormap(float(values_cumsum[i])/total_values)\n", " legend_handles.append(mpatches.Patch(color=color_val, label=label_str))\n", "\n", " # add legend to chart\n", " plt.legend(\n", " handles=legend_handles,\n", " loc='lower center', \n", " ncol=len(categories),\n", " bbox_to_anchor=(0., -0.2, 0.95, .1)\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now to create a `waffle` chart, all we have to do is call the function `create_waffle_chart`. Let's define the input parameters:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "width = 40 # width of chart\n", "height = 10 # height of chart\n", "\n", "categories = df_dsn.index.values # categories\n", "values = df_dsn['Total'] # correponding values of categories\n", "\n", "colormap = plt.cm.coolwarm # color map class" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now let's call our function to create a `waffle` chart." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of tiles is 400\n", "Denmark: 129\n", "Norway: 77\n", "Sweden: 194\n" ] }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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I9A4Jk+ePLkiD/jlQpzK8EecQMqFONUTJ5ByIU71xAmkXIhTPXECKRfiVE+cQMqFONUTJ5ByCcQ41entf56QYcjrMbj3lZc71TJYEwMAAAAEqSF//tqndkvTm1ZpHhXF7mQAAABAkPLH9smXA0UMAAAAEKRKSkoudwq/CUUMAAAAEKQYiQEAAABgKRQxAAAAACzFqnt8UcQAAAAAQcoTgPeA8QVFDAAAABCkmE4GAAAAwFIMg5EYAAAAABbicVPEAH5nGIaOHz+u8+fPX+5UAAAXERISovr168tms13uVABUkIeRGMD/jh8/LrfbrZo1a17uVAAAF3H+/HkdP35cDRo0uNypAKgg1sQAVeD8+fMUMAAQ4EJCQlRcXHy50wDwGxjsTgYAAADAShiJAQAAAGAp7E4GVIN9x8J1ttjht3hhNUuU0Oj0Jds0atRI11xzjdxutxwOh4YOHarRo0fLbrf7LY/KaNq0qb7++utLtiksLNSwYcO0YsUKff/997r33ntVUlIit9utUaNGacSIEZKkd999V88995w8Ho9cLpfS0tIkSefOndODDz6oPXv2KCoqSgsXLlRcXJzy8/M1atQo7dq1S8OGDdPMmTPNPgcOHKhFixbpyiuv9PvPfO7saXk8JX6LZ7c7VCss/JJtGjRooJSUFE2ZMkWSNH/+fJ05c0aPPfaY3/KorB9//FGPPvqoXn/9dW3cuFHTpk3T+fPnFRISorS0NHXt2lWSNHToUP34448qKSlRhw4d9PTTT8vhcGjy5Mlau3atQkJC1LRpU82bN08RERFatmyZ5s+fb/azb98+ffjhh7ruuuuq9Hk+POFpFR781m/xajdroqueefySbZ577jmtWLFCdrtddrtds2fPVrt27fyWgy9/r77KyMjQlVdeqaFDh2rWrFl67bXXFB0dLUmaNGmSXC6Xzp8/r0ceeUSfffaZ3G63hgwZoocffliSVFBQoEceeURffvmlbDab5syZo/bt20uSXnnlFS1atEg1atQwXwv27dunF198Uc8//7xf8gcQGDyMxABV72yxQyeKQqq1z9DQUG3YsEFS6UYDKSkpOnnypB5//NJvhqqaYRgyDN9eeN544w3deuutcjgcatiwod577z3VqlVLp0+fVmJiopKTk1WzZk099dRT+te//qV69erpwQcf1ObNm9WtWze9/vrrioiI0LZt2/TOO+9o6tSpevnll1WrVi09/vjj+vLLL/Xll1+W6XPw4MFasmSJHnnkEb//7B5PiYwS/xUxvnwGVatWLb3//vt6+OGHzTeKFeF2u1WjRtW+5L744ou6++67JUnR0dF67bXX1KhRI/3v//6vhg4dqr1790oqfYNap04dGYahkSNHauXKlbrtttuUmJioJ554QjVq1NCUKVM0d+5c/eUvf9GgQYM0aNAgSaUFzH/8x3/ouuuuk1S1z3PhwW91eutuv8e9mO3bt2vt2rX68MMPVatWLeXl5QXszohut1tvvPGG1q1bZ54bPXq0xhRyR/QAABAySURBVI4dW6bdypUrVVxcrE2bNuns2bPq2rWrbrvtNsXFxWnSpEnq0aOHFi9erOLiYhUWFkqSPvroI61Zs0YbN25UrVq1dPz4cUlSQkKCvv/+e3333Xdq3Lhx9f2wAKqUx+2f/08XLFignTt3KiIiQunp6eWuG4ahJUuWaNeuXapVq5bGjBmj+Ph4SdLGjRu1YsUKSdLtt9+upKQkr/0FxkfJgEXUr19f6enpWrx4sQzDUElJiSZPnqzevXsrMTFR//3f/y1JyszM1IABAzRy5Eh16tRJKSkpZsHRrl07TZ8+XTfffLN69eqlvXv3asiQIWrfvr1effVVSdLp06c1cOBA9ezZU4mJiVqzZo0k6ZtvvlHnzp312GOPqWfPnjp69KiZW15enm6++Wb961//Kpf38uXLlZycLEmqWbOmatWqJUkqLi6W5/8v6Dty5Iji4+NVr149SVK3bt20evVqSdIHH3ygoUOHSpL69eunLVu2yDAMXXHFFerYsaNCQ0PL9ZmcnKx33nmncv/gAcThcGj48OHKyMgod+3bb7/VwIEDlZiYqIEDB+q7776TJD300EN68sknddttt2nKlClKTExUQUGBDMNQy5Yt9dZbb0mSxowZo02bNumbb75Rv3791LNnT/Xs2VPbtm0zr//8OyBJKSkp+uCDD8rlsXr1avXo0UOSdN1116lRo0aSpFatWuncuXM6d+6cJKlOnTqSSt8Inz9/3twWt3v37mah1a5dO33//ffl+njnnXd0++23m9//np7nH3/8UdHR0ebfR3R0tBo1aqSdO3eao5Vr1qxRXFyciouLVVRUJKfTKUk6fPiwhg4dKpfLpX79+unAgQOSSv+ubr75ZvXu3bvMSKUkvfDCC+Zrx9NPPy3p//7GH330UXXt2lWDBw82i4tf2rJli1q3bu21MLbZbDp79qzcbreKiooUEhKiOnXq6NSpU9q6davuuusuSaWvCxEREZKkV199VePGjTP/HerXr2/G69Onz+/m+QZQyjA8Ph3eJCUl6b/+678uen3Xrl06duyY5s2bp/vvv1+vvPKKpNL3PMuWLdOMGTM0Y8YMLVu2TKdPX3qWjEQRA1RY06ZN5fF4dPz4cb3++uuqW7eu1q5dq7Vr1+q1117TkSNHJEmfffaZpk2bpo8++khHjhzRp59+asaIiYnRmjVr1LFjRz300ENavHix1qxZo1mzZkkqHf159dVXtW7dOq1YsUJpaWlmEZSdna0hQ4Zo/fr1atKkiSQpJydHd911lx5//HH16tWrTL7FxcU6cuSI4uLizHNHjx5VYmKibrjhBj344INq1KiRrrrqKmVnZ+ubb76R2+3WmjVrzDexx44dU2xsrCSpRo0aqlOnjvLz8y/573TllVfq3LlzXttZyciRI7V8+XKdPHmyzPmJEydq8ODB2rRpkwYOHFjmRfzQoUNatmyZpkyZovbt22vbtm368ssv9Yc//MH8ndixY4fatWunevXq6e2339a6dev08ssva9KkSZKku+++W2+++aYk6eTJk8rKypLL5SqTw5EjR3TllVeabzx/afXq1br22mvLXBsyZIgSEhIUHh6ufv36lXvMm2++qZ49e5Y7/+677+q2224zv/89Pc9JSUk6evSoOnbsqMcee0wff/yxJKl169b6/PPPJUlbt25Vq1attGvXLu3cudOcavaf//mf+utf/6oPP/xQkydPNkdqn3jiCY0YMUJr164tUwxs2LBBhw8f1j//+U9t2LBBe/fu1SeffCKp9Hfm3nvv1ZYtWxQREWF+mPBL27Zt0/XXX1/m3OLFi5WYmKiHH35YJ06ckFT6oUNYWJiuu+46tW3bVmPGjFFkZKS+/vprRUdHa9y4cerRo4ceeeQRnTlzRpJ08OBBbd26VcnJyfr3f/937dq1y+zj+uuvL/NaBsD6DI/h0+HNz/+nXExWVpa6desmm82mq6++WmfOnNFPP/2k3bt3q3Xr1goPD1d4eLhat26t3bu9j8IznQz4DX4uKDZu3Kh9+/Zp1apVkqRTp07p0KFDqlmzpm644QbFxMRIkq699lp9++236tixoySZoyLXXHONzpw5Y/7h1qpVSwUFBQoLC9P06dP1ySefyG6369ixY8rJyZEkNWnSxPz0Vyr9NH3QoEGaOXOmOnXqVC7X/Px88xPWn8XGxmrTpk06duyY7rnnHvXr108NGjTQrFmzdP/998tms6l9+/ZmQXahaWu+3NSuXr16OnbsmKKiory2tYI6depo8ODBevnll8uMPmVlZWnJkiWSSqdX/bxuRip9E+lwlK7j6tixoz755BM1btxYI0aM0N///nf98MMPioyMVHh4uE6ePKnU1FR98cUXstvtOnTokCSpU6dOSk1N1fHjx/Xee+/p1ltvLfcJ/M+jCL/25ZdfasqUKVq6dGmZ80uXLlVRUZEeeOABbdmypczQ/XPPPSeHw2FOIfvZjh07FBYWpmuuuabM+d/L8xweHq4PP/xQW7du1UcffaQ//elPevLJJzVs2DA1bdpUX331lXbt2qWUlBRt3brVXFN0+vRpbd++XaNGjTJj/bzd8LZt27R48WJJpYXj1KlTJZW+dmzcuNEcOTtz5owOHTqk2NhYxcXFmdP1WrdurW+/Lb8uKCcnR1dffbX5/YgRI/TnP/9ZNptNM2fOVFpamubOnaudO3fKbrdr7969OnHihPr3769u3bqppKREe/fu1YwZM9SuXTtNmjRJzz//vFJTU1VSUqKCggKtWbNGu3bt0p/+9Cdt375dNptN9evX17Fjx6rmCQBwWWz5R1ef2hUWFuqpp54yv3e5XOU+ULuU/Px8c7aHVDranZ+fr/z8/DL/f0VFRfn0wRhFDFBBX3/9tRwOh+rXry/DMDRjxgzzjcjPMjMzy3zq7XA4VPKLNRw/3/vGbreXuQ+O3W6X2+3W8uXLlZeXpw8//FAhISFq166dORUoLCysTF81atRQ69attWHDhgsWMaGhoeZjf61Ro0Zq2bKlPv30U/Xr1099+vRRnz59JEl/+9vfzDff//Zv/6ajR48qJiZGbrdbp06dUmRkpNd/q3Pnzl1wqpmVjR49Wi6XS8OGDbtom18WeFdccYX59U033aTFixerSZMmmjhxot5//32tWrVKHTp0kCS99NJLql+/vjZs2CCPx2OOtEnSoEGDtHz5cr377ruaM2dOuT5r165d7nn+/vvvNWLECL3wwgu66qqryj0mNDRUffr00QcffGAWMf/zP/+jtWvXavny5eUK1V+Pwvzs9/Q8OxwOde7cWZ07d1ZCQoLeeustDRs2TB07dtS6desUEhKibt26ady4ceZ0UsMwVLduXXPt3K9dqOA3DEPjxo3TPffcU+b8N998U+61o6ioqNzjf/13/cubTN59993m2qgVK1aoR48eCgkJUf369XXjjTdqz5496tixo2JiYsyRpH79+mnevHmSSv/eb731VtlsNrVt21Y2m015eXmqV6+eioqKfjfPNYCKqV27drlpsRVRkQ9EffmglOlkQAXk5uZqwoQJGjlypGw2m7p3765XX33VXPx78OBBc0pGZZw8eVL16tVTSEiIPvroowt+EvtLc+fO1YEDB8w3Ib905ZVXqqSkxHwj9P3335tz7E+cOKFt27apWbNmkmQu4D1x4oSWLFlivhHq06ePuX5j1apV6tKli9cXGMMwlJOTU2Ya2+9BZGSk+vfvrzfeeMM81759e3OdwPLly3XjjTde8LGxsbHKz8/XoUOH1LRpU914441asGCBOUJ36tQpNWzYUHa7XW+//XaZwnfYsGFauHChpNI1Lr8WHx9f5vekoKBAd955pyZNmmQWSVLp3OMff/xRUuko3rp169SiRQtJ0vr16/XCCy/o73//e7li2ePxaOXKlRowYECZ87+n5zk7O9sc/ZKkzz//3FzAftNNN2nhwoVyOp2qV6+efvrpJ2VnZ6tVq1aqU6eO4uLitHLlSkml/yY/Tz+78cYbzd+NZcuWmbG7d++uN99805z3/cMPP5h/f75o0aKFDh8+bH7/83MqSe+//775OxIbG6uPPvpIhmHozJkz2rFjh5o3b66GDRsqJiZG2dnZkqTNmzebIzs333yztmzZIqn0Ne38+fPmp6QHDx684O8fAHgTHR2t3Nxc8/u8vDxFRkYqKipKeXl55vn8/HyfPihlJAaWElbTfztS+RqvqKhI3bt3N7dYHjx4sB544AFJpZ94fvvtt3K5XDIMQ9HR0ebi/soYOHCg7r77bvXq1UvXXnut+SbzYhwOhxYuXKi7775b4eHhGjlyZJnrSUlJ+vTTT5WYmKivvvpKaWlpstlsMgxDY8aMUUJCgqTS+ftffPGFJOnPf/6zWdzcddddGjt2rG688UZFRkaWWdzerl07nTp1SsXFxVqzZo2WLl2qli1bas+ePWrXrl2V7Mhltzt82lGsIvEq4oEHHjCnCEnS9OnTNX78eM2fP1/16tXT3LlzL/rYtm3bmpspdOzYUdOnTzeLjHvvvVf33nuvVq1apc6dO5cpJBo0aKAWLVro5ptvvmDcK664Qk2bNtWhQ4cUHx+vRYsW6euvv9azzz6rZ599VlLpFDLDMDR8+HCdO3dOHo9HXbp0MUcDUlNTVVxcrMGDB0sqfW5nz54tSfrkk08UExOjpk2blum3Kp/n2s2aeG/kx3hnzpzRxIkTdfLkSTkcDl111VXmDjtt27bV8ePHzYIzISFB9erVM4v5F198UY899pieffZZud1uDRgwQNdee62mTZumlJQUvfzyy+rbt6/ZV/fu3XXgwAHdeuutkkpHWBcsWGCOfnrTs2fPMjuRPfXUU+bfblxcnPm8jRw5Ug8//LC6desmwzA0bNgw/fGPf5QkzZgxQw888ICKi4v1hz/8wfwQ5M477zQfExISoueff978OTMzM8utuwMAXzidTn3wwQfq3LmzDhw4oLCwMEVGRqpNmzZlPtTZs2eP7rzzTq/xbIave7QCl8HRo0fLTLfCb/PZZ5/pxRdf1IIFC6qtz0mTJqlPnz7q1q1btfX5e3b27FklJiZq3bp1qlu37gXbvPfee9q7d68mTpxYbXnxPF8+99xzj9LS0swtSqvauXPnNGDAAK1ateqCRWtxcbG5AQiA4DNnzhzt27dPp06dUkREhIYMGSK32y1J6t27twzD0KJFi7Rnzx7VrFlTY8aMMT8sXb9+vTlqffvtt6t79+5e+2MkBggC1113nbp06aKSkhKfP+mtrFatWvHG1k82bdqk8ePHKyUl5aIFjCTdeuut+umnn6oxM57ny+nJJ5/Ujz/+WG1FzNGjR837CAHAr40fP/6S1202m+67774LXuvRo0e59cXeMBKDgMZIDABYAyMxAKoTC/sBAAAAWApFDAJaSEiIufMXACAwnT9/XiEhIZc7DQBBhOlkCGiGYej48eMUMgAQwH6+D40v93YAAH+giAEAAABgKUwnAwAAAGApFDEAAAAALIUiBgAAAIClUMQAAAAAsBSKGAAAAACW8v8AbkjwTQI1iXAAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "create_waffle_chart(categories, values, height, width, colormap)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There seems to be a new Python package for generating `waffle charts` called [PyWaffle](https://github.com/ligyxy/PyWaffle), but it looks like the repository is still being built. But feel free to check it out and play with it." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Thanks for reading :)\n", "Created by [Alex Aklson](https://www.linkedin.com/in/aklson/) and modified by [Tarun kamboj](https://www.linkedin.com/in/kambojtarun/)" ] } ], "metadata": { "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.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }