{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\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": [ "\n", "< [Density and Contour Plots](04.04-Density-and-Contour-Plots.ipynb) | [Contents](Index.ipynb) | [Customizing Plot Legends](04.06-Customizing-Legends.ipynb) >" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Histograms, Binnings, and Density" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A simple histogram can be a great first step in understanding a dataset.\n", "Earlier, we saw a preview of Matplotlib's histogram function (see [Comparisons, Masks, and Boolean Logic](02.06-Boolean-Arrays-and-Masks.ipynb)), which creates a basic histogram in one line, once the normal boiler-plate imports are done:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "plt.style.use('seaborn-white')\n", "\n", "data = np.random.randn(1000)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nknok/u2336qnp0f79+/XunXrtHPnzmR+eQDAHZJ6JN7R0aFZs2ZJkqZOnarOzs7bnu/t7ZUkXbly\nJbEFov97X/MBgFt++eWXhF73Ty//6eedkhrxSCQin88Xf5yamqobN24oLe3mMqFQSJJUUlKS0NdP\nv/8RAcAVc/9n+329PhQK3fP0dFIj7vP5FI1G44/7+vriAZek/Px8NTU1aezYsUpNTU3m0gDwUOrt\n7VUoFFJ+fv49n09qxKdNm6bW1lYtXLhQp06dUl5e3m3PZ2RkqKioKJlLAsBDr78LRDyO4zjJWuif\nq1POnTsnx3FUXV2tp59+OllfHgBwh6RGfDj8+eefWrduna5du6ZRo0bpgw8+0BNPPOH2WEMSDodV\nXl6uSCSi69evq6KiQoWFhW6PlbCjR4/qm2++UU1NjdujDNrDdPnr6dOn9dFHH6mhocHtUYbs+vXr\nqqys1KVLl9TT06PVq1dr7ty5bo81ZL29vaqqqtKPP/4oj8ejd999964zDyPlgb/Zp6WlRVOmTFFT\nU5NeeeUV1dfXuz3SkO3du1fPPfecGhsbtWPHDr333ntuj5Sw7du3q6amRn19fW6PMiQPy+Wv9fX1\nqqqqUiwWc3uUhBw+fFhjxozRvn379Pnnn2vbtm1uj5SQ1tZWSVJzc7PKysr08ccfuzbLA3/b/YoV\nK+KX1ly+fFnZ2dkuTzR0K1askNfrlXTzO3h6ut3rbKZNm6Z58+Zp//79bo8yJANd/mpFbm6udu3a\npfXr17s9SkIWLFggv98vSXIcx+wFDvPmzdOcOXMkud+lByriBw4c0JdffnnbturqahUUFGj58uU6\nd+6c9u7d69J0g9PfewiFQiovL1dlZaVL0w3ef72PhQsXqr293aWpEjfQ5a9W+P3+hK83fhBkZmZK\nuvn/sWbNGpWVlbk8UeLS0tK0YcMGHT16VJ988ol7gziGnD9/3pk7d67bYySku7vbWbhwoXP8+HG3\nR7lv33//vVNWVub2GENSXV3tHDlyJP541qxZLk5zf37++Wdn6dKlbo+RsMuXLzuLFi1yDhw44PYo\nSfH77787c+bMcaLRqCvrP/DnxPfs2aNDhw5Juvld3OKPX+fPn9fbb7+tmpoaPf/8826P80iaNm2a\n2traJOmel79iZFy9elWlpaUqLy/XkiVL3B4nYYcOHdKePXskSaNHj5bH41FKijs5feB/lnz99de1\nYcMGHTx4UL29vaqurnZ7pCGrqalRT0+P3n//fUk3b4r67LPPXJ7q0TJ//nydOHFCb7zxRvzyV4y8\n3bt369q1a6qrq1NdXZ2kmx/WZmRkuDzZ0Lz44ovauHGjSkpKdOPGDVVWVrr2Hh74SwwBAP/tgT+d\nAgD4b0QcAAwj4gBgGBEHAMOIOAAYRsQBwDAiDgCGEXEAMOz/AGBcJVr7eYjkAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist(data);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ``hist()`` function has many options to tune both the calculation and the display; \n", "here's an example of a more customized histogram:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD0CAYAAACLpN0/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFTVJREFUeJzt3W9sW+XZx/Gf/8xNqLPmBRFUimqlkcKLVVNwq2kSi4pa\nUqZq7RTSzolCU9aoSHuzVcs6aMWyLAuOJxYNrU+bAZNYlxXVEKZqYShA1u6xFGkTBBlhTUlF1VZ0\niBC2VezYaR3nnOdFnhpCS06SxjW5+X5e5ZzbF7mOKn69evsc2+M4jiMAwIrnLXYDAIDlQaADgCEI\ndAAwBIEOAIYg0AHAEP5i/NIrV64olUqpoqJCPp+vGC0AwIozMzOjyclJbdiwQSUlJdetFyXQU6mU\nWlpaivGrAWDFO3HihDZt2nTd+aIEekVFhaTZpu68885itAAAK87777+vlpaWfIZ+WlEC/do2y513\n3qnKyspitAAAK9ZnbVXzpigAGIJABwBDEOgAYAgCHQAMQaADgCEIdAAwBIEOAIYoyn3ogCn6//fs\ngl63Z3NNgTsBmNABwBgEOgAYgi0XfG6xnQEsDhM6ABiCQAcAQ7huudi2rc7OTo2PjysQCKi7u1uh\nUOi61/3kJz/RmjVr9KMf/WjBNQCA5eM6oQ8PDyubzSoej6u9vV2xWOy615w8eVJnz55dVA0AYHm5\nBvro6Kjq6uokSbW1tUqlUnPW33zzTb311luKRCILrgEALD/XQLcsS8FgMH/s8/mUy+UkSR988IGO\nHj2qjo6OBdcAAArDdQ89GAwqnU7nj23blt8/WzY0NKT//Oc/evjhhzU5OakrV65o/fr189YAAArD\ndUIPh8NKJBKSpGQyqZqaj+/5bW1t1R//+Ef19/fr4Ycf1re+9S098MAD89YAAArDdWyur6/XyMiI\nmpqa5DiOotGoBgcHlclk5uybu9UAAArLNdC9Xq+6urrmnKuurr7udQ888MC8NQCAwuLBIgAwBO9U\n4pZb6Ge0AFgcJnQAMASBDgCGINABwBAEOgAYgkAHAEMQ6ABgCAIdAAxBoAOAIQh0ADAEgQ4AhiDQ\nAcAQBDoAGIJABwBDEOgAYAgCHQAM4fp56LZtq7OzU+Pj4woEAuru7lYoFMqvv/LKK3r66afl8Xi0\nY8cO7d27V5LU0NCgYDAoSaqsrFRPT0+BLgEAIC0g0IeHh5XNZhWPx5VMJhWLxdTX1ydJmpmZUW9v\nr1588UXddttt2r59u3bs2KHVq1fLcRz19/cX/AKAQuBLOLASuW65jI6Oqq6uTpJUW1urVCqVX/P5\nfHr55ZdVVlamy5cvy7ZtBQIBjY2NaWpqSvv27VNra6uSyWThrgAAIGkBE7plWfmtE2k2xHO5nPz+\n2VK/369XX31VXV1d2rx5s0pLS1VSUqK2tjbt3r1bFy5c0P79+zU0NJSvAZYT0zQwy3VCDwaDSqfT\n+WPbtq8L5m3btimRSGh6elqnTp1SVVWVdu7cKY/Ho6qqKpWXl2tycnL5uwcA5LkGejgcViKRkCQl\nk0nV1NTk1yzL0oMPPqhsNiuv16vS0lJ5vV4NDAwoFotJkiYmJmRZlioqKgp0CQAAaQFbLvX19RoZ\nGVFTU5Mcx1E0GtXg4KAymYwikYh27NihlpYW+f1+3XXXXdq5c6dmZmZ06NAhNTc3y+PxKBqNst0C\nAAXmmrJer1ddXV1zzlVXV+d/jkQiikQic9Z9Pp96e3uXqUUAwELwYBEAGIJABwBDEOgAYAgCHQAM\nQaADgCEIdAAwBIEOAIYg0AHAEAQ6ABiCQAcAQxDoAGAIAh0ADEGgA4AhCHQAMASBDgCGINABwBAE\nOgAYwvUbi2zbVmdnp8bHxxUIBNTd3a1QKJRff+WVV/T000/L4/Fox44d2rt3r2sNAGD5uU7ow8PD\nymazisfjam9vz3/5syTNzMyot7dXv/vd7xSPx/Xcc8/p3//+97w1AIDCcJ3QR0dHVVdXJ0mqra1V\nKpXKr/l8Pr388svy+/3617/+Jdu2FQgE5q0BABSG64RuWZaCwWD+2OfzKZfL5Y/9fr9effVVffvb\n39bXvvY1lZaWutYAAJafa6AHg0Gl0+n8sW3b8vvnDvbbtm1TIpHQ9PS0Tp06taAaAMDycg30cDis\nRCIhSUomk6qpqcmvWZalBx98UNlsVl6vV6WlpfJ6vfPWAAAKw3Vsrq+v18jIiJqamuQ4jqLRqAYH\nB5XJZBSJRLRjxw61tLTI7/frrrvu0s6dO+XxeK6rAQAUlmuge71edXV1zTlXXV2d/zkSiSgSiVxX\n9+kaAEBh8WARABiCdyqBW6D/f88u6HV7NvN+E5aOCR0ADEGgA4Ah2HKBK7YLgJWBCR0ADMGEjmWz\n0EkeQGEwoQOAIQh0ADAEgQ4AhiDQAcAQvCkKfI5wiyhuBhM6ABiCQAcAQxDoAGAIAh0ADOH6pqht\n2+rs7NT4+LgCgYC6u7sVCoXy6y+99JKOHz8un8+nmpoadXZ2yuv1qqGhIf9F0ZWVlerp6SncVQAA\n3AN9eHhY2WxW8XhcyWRSsVhMfX19kqQrV67oySef1ODgoEpLS/XDH/5QZ86c0Te+8Q05jqP+/v6C\nXwAAYJbrlsvo6Kjq6uokSbW1tUqlUvm1QCCgkydPqrS0VJKUy+W0atUqjY2NaWpqSvv27VNra6uS\nyWSB2gcAXOM6oVuWld86kSSfz6dcLie/3y+v16vbb79dktTf369MJqN77rlHZ8+eVVtbm3bv3q0L\nFy5o//79Ghoakt/Pbe8AUCiuCRsMBpVOp/PHtm3PCWbbtvXEE0/o/PnzOnLkiDwej6qqqhQKhfI/\nl5eXa3JyUmvXri3MVQAA3LdcwuGwEomEJCmZTKqmZu4Tah0dHbp69aqOHTuW33oZGBhQLBaTJE1M\nTMiyLFVUVCx37wCAT3Cd0Ovr6zUyMqKmpiY5jqNoNKrBwUFlMhlt2LBBAwMD2rRpk/bu3StJam1t\n1a5du3To0CE1NzfL4/EoGo2y3QIABeaasl6vV11dXXPOVVdX538eGxu7YV1vb+9NtgYAWAweLAIA\nQxDoAGAIAh0ADEGgA4AhCHQAMASBDgCG4ObwL7CFft0ZgJWBCR0ADEGgA4AhCHQAMASBDgCGINAB\nwBAEOgAYgkAHAEMQ6ABgCAIdAAxBoAOAIVwf/bdtW52dnRofH1cgEFB3d7dCoVB+/aWXXtLx48fl\n8/lUU1Ojzs5OSZq3BgCw/Fwn9OHhYWWzWcXjcbW3t+e//FmSrly5oieffFK///3vdfLkSVmWpTNn\nzsxbAwAoDNdAHx0dVV1dnSSptrZWqVQqvxYIBHTy5EmVlpZKknK5nFatWjVvDQCgMFwD3bIsBYPB\n/LHP51Mul5st9np1++23S5L6+/uVyWR0zz33zFsDACgM1z30YDCodDqdP7ZtW36/f87xE088ofPn\nz+vIkSPyeDyuNQBujcV8RPKezTUF7AS3guuEHg6HlUgkJEnJZFI1NXP/0Ds6OnT16lUdO3Ysv/Xi\nVgMAWH6uY3N9fb1GRkbU1NQkx3EUjUY1ODioTCajDRs2aGBgQJs2bdLevXslSa2trTesAQAUlmug\ne71edXV1zTlXXV2d/3lsbOyGdZ+uAQAUFg8WAYAhCHQAMASBDgCGINABwBAEOgAYgkAHAEMQ6ABg\nCAIdAAxBoAOAIQh0ADAEH4EIrECL+RRFfHEwoQOAIQh0ADAEgQ4AhiDQAcAQBDoAGIJABwBDuN62\naNu2Ojs7NT4+rkAgoO7uboVCoTmvmZqa0ne/+109/vjj+W8zamhoUDAYlCRVVlaqp6enAO0DAK5x\nDfTh4WFls1nF43Elk0nFYjH19fXl199++2399Kc/1cTERP7c1atX5TiO+vv7C9M1AOA6rlsuo6Oj\nqqurkyTV1tYqlUrNWc9mszp69KjWr1+fPzc2NqapqSnt27dPra2tSiaTy9w2AODTXCd0y7LyWyeS\n5PP5lMvl5PfPlm7cuPG6mpKSErW1tWn37t26cOGC9u/fr6GhoXwNAGD5uSZsMBhUOp3OH9u27RrM\nVVVVCoVC8ng8qqqqUnl5uSYnJ7V27dqb7xgAcEOuWy7hcFiJREKSlEwmVVNT4/ofHRgYUCwWkyRN\nTEzIsixVVFTcZKsAgPm4Tuj19fUaGRlRU1OTHMdRNBrV4OCgMpmMIpHIDWt27dqlQ4cOqbm5WR6P\nR9FolO0WACgw15T1er3q6uqac+7arYmf9Mk7WgKBgHp7e5ehPSwFn8QHfDHxYBEAGIJABwBDEOgA\nYAgCHQAMQaADgCEIdAAwBIEOAIbgaR8Akhb+/MKeze5Pi6M4mNABwBAEOgAYgkAHAEMQ6ABgCAId\nAAxBoAOAIQh0ADAEgQ4AhiDQAcAQroFu27Y6OjoUiUS0Z88eXbx48brXTE1NqampSefOnVtwDQBg\nebkG+vDwsLLZrOLxuNrb2/Nf/nzN22+/rZaWFr377rsLrgEALD/XQB8dHVVdXZ0kqba2VqlUas56\nNpvV0aNHtX79+gXXAACWn+uHc1mWpWAwmD/2+XzK5XLy+2dLN27cuOgaAMDyc53Qg8Gg0ul0/ti2\nbddgXkoNAODmuAZ6OBxWIpGQJCWTSdXUuH905lJqAAA3x3Vsrq+v18jIiJqamuQ4jqLRqAYHB5XJ\nZBSJRBZcAwAoLI/jOM6t/qWXLl3S1q1b9Ze//EWVlZW3+tcbb6FfVAAUEl+EsfzcspMHiwDAELxT\nWWRM0wCWCxM6ABiCQAcAQxDoAGAIAh0ADEGgA4AhCHQAMASBDgCGINABwBAEOgAYgkAHAEMQ6ABg\nCD7LpUD4jBZgYRb6/wqf3uiOCR0ADEGgA4AhXLdcbNtWZ2enxsfHFQgE1N3drVAolF8/ffq0jh49\nKr/fr8bGRn3nO9+RJDU0NOS/KLqyslI9PT0FugQAgLSAQB8eHlY2m1U8HlcymVQsFlNfX58kaXp6\nWj09PRoYGFBpaamam5u1ZcsWlZWVyXEc9ff3F/wCAACzXLdcRkdHVVdXJ0mqra1VKpXKr507d07r\n1q3TmjVrFAgEtHHjRr3++usaGxvT1NSU9u3bp9bWViWTycJdAQBA0gImdMuy8lsnkuTz+ZTL5eT3\n+2VZlsrKyvJrq1evlmVZKikpUVtbm3bv3q0LFy5o//79Ghoakt/PTTUAUCiuCRsMBpVOp/PHtm3n\ng/nTa+l0WmVlZaqqqlIoFJLH41FVVZXKy8s1OTmptWvXFuASbi1uRwTweeW65RIOh5VIJCRJyWRS\nNTUf3wtaXV2tixcv6vLly8pms3rjjTd09913a2BgQLFYTJI0MTEhy7JUUVFRoEsAAEgLmNDr6+s1\nMjKipqYmOY6jaDSqwcFBZTIZRSIRPfroo2pra5PjOGpsbNQdd9yhXbt26dChQ2pubpbH41E0GmW7\nBQAKzDVlvV6vurq65pyrrq7O/7xlyxZt2bJlznogEFBvb+8ytQgAWAgeLAIAQxDoAGAIAh0ADME7\nlQAKglt8bz0mdAAwBIEOAIZgywXAisAXYbhjQgcAQzCh/z/ewAGw0jGhA4AhCHQAMMSK3XLhDRIA\nN/JFzgYmdAAwxIqd0AHg86bY/zpgQgcAQxg/oXM7IoAbWUw2rJT9diZ0ADCEa6Dbtq2Ojg5FIhHt\n2bNHFy9enLN++vRpNTY2KhKJ6Pnnn19QDQBg+bluuQwPDyubzSoejyuZTCoWi6mvr0+SND09rZ6e\nHg0MDKi0tFTNzc3asmWL3nzzzc+sAYCVZqVs3boG+ujoqOrq6iRJtbW1SqVS+bVz585p3bp1WrNm\njSRp48aNev3115VMJj+zRpJmZmYkSe+///6SG7/84cSSawGgmC5dum1Jddcy81qGfpproFuWpWAw\nmD/2+XzK5XLy+/2yLEtlZWX5tdWrV8uyrHlrJGlyclKS1NLSsoRLAoCV7X9usn5yclKhUOi6866B\nHgwGlU6n88e2beeD+dNr6XRaZWVl89ZI0oYNG3TixAlVVFTI5/Mt7YoA4AtmZmZGk5OT2rBhww3X\nXQM9HA7rzJkz2r59u5LJpGpqPr59p7q6WhcvXtTly5d122236Y033lBbW5s8Hs9n1khSSUmJNm3a\ndJOXBgBfPDeazK/xOI7jzFds27Y6Ozt19uxZOY6jaDSqf/zjH8pkMopEIjp9+rSOHj0qx3HU2Nio\nlpaWG9ZUV1cv+4UBAD7mGuifJ5lMRu3t7froo4/0pS99Sb/4xS90xx13FLutRfnvf/+rgwcPyrIs\nTU9P69FHH9Xdd99d7LaW5LXXXtPQ0JB6e3uL3cqiXBs4xsfHFQgE1N3dPe/U83n21ltv6Ze//KX6\n+/uL3cqiTU9P6/Dhw/rnP/+pbDar733ve9q6dWux21q0mZkZPfbYYzp//rw8Ho9+9rOfXbcrcaus\nqAeLnn/+eX3lK1/RiRMntHPnTj3zzDPFbmnRnn32WX3961/XH/7wB/X09Kirq6vYLS1Jd3e3ent7\nZdt2sVtZtE/eitve3q5YLFbslpbkmWee0WOPPaarV68Wu5Ul+dOf/qTy8nI999xz+u1vf6uf//zn\nxW5pSc6cOSNJOnnypA4cOKBf/epXRetlRT36/9BDD+Vv13nvvff05S9/ucgdLd5DDz2kQCAgafZv\n9lWrVhW5o6UJh8O67777FI/Hi93Kos13K+5Ksm7dOh05ckQ//vGPi93Kknzzm9/U/fffL0lyHGfF\n3iBx33336d5775VU/Fz63Ab6Cy+8oOPHj885F41G9dWvflWtra06e/asnn322SJ1tzDzXcPk5KQO\nHjyow4cPF6m7hfmsa9i+fbv+/ve/F6mrm+N2W+1Kcf/99+vSpUvFbmPJVq9eLWn2z+P73/++Dhw4\nUOSOls7v9+uRRx7Ra6+9pl//+tfFa8RZod555x1n69atxW5jScbGxpzt27c7f/3rX4vdyk3529/+\n5hw4cKDYbSxaNBp1/vznP+eP6+rqitjNzXn33Xed3bt3F7uNJXvvvfechoYG54UXXih2K8vigw8+\ncO69914nnU4X5fevqD30p556SqdOnZI0+7f7Svwn2jvvvKMf/OAH6u3t1ebNm4vdzhdSOBxWIpGQ\npBveVotb48MPP9S+fft08OBB7dq1q9jtLNmpU6f01FNPSZJKS0vl8Xjk9RYnWlfUvzEbGxv1yCOP\n6MUXX9TMzIyi0WixW1q03t5eZbNZPf7445JmH87ic25urfr6eo2MjKipqSl/Wy1uvd/85jf66KOP\ndOzYMR07dkzS7Bu9JSUlRe5scbZt26ZDhw6ppaVFuVxOhw8fLto1rKjbFgEAn21FbbkAAD4bgQ4A\nhiDQAcAQBDoAGIJABwBDEOgAYAgCHQAMQaADgCH+D9uI4eqz7cnqAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist(data, bins=30, normed=True, alpha=0.5,\n", " histtype='stepfilled', color='steelblue',\n", " edgecolor='none');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ``plt.hist`` docstring has more information on other customization options available.\n", "I find this combination of ``histtype='stepfilled'`` along with some transparency ``alpha`` to be very useful when comparing histograms of several distributions:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nUkVFhSKRiAoLC+2xgoICtba26uDBgxo5cqS+/vpr3XXXXWnfHzFihCZNmjQIvw0AyC1/n2kfMcyy\nLKuvLx5ZVfLjjz/KsiyFw2Ft2bJF7e3tCoVC9qoSy7I0ffr0QWqJAAB64xjcx6urq0sLFixQNBpV\nIpHQAw88oMsuu8zNUx637du3a8aMGfryyy81fPhwr8s5yh9//KHHHntMsVhMnZ2deuKJJ3T++ed7\nXVYap2WkmaKzs1Pz5s3Trl27lEgkdO+99+ryyy/3uqw+7d+/XzfddJNee+01FRQUeF1Oj5YvX66N\nGzeqs7NTt956q2655RavS+rRkf9/du3aJZ/Pp2effTZj/0y7c/2W9/fee0/JZFJr167V0qVL1dra\n6vYpj0ssFtPChQuVl5fndSm9ev3113XhhRfqrbfe0oIFC1RbW+t1SUfpvox07ty5qqur87qkHr3/\n/vsaPXq01qxZo1deeUXPPpvZF8A7OztVXV2tESNGeF1Kr7766it9++23evvtt7Vq1aqBrygbAp9/\n/rmdT/fff78WLVrkdUn94vqdk1988YXOPvts3X333bIsS0899ZTbpxywI/U9+uijuu+++7wup1e3\n3367/RdLV1dXRv5U0Ncy0kxy9dVX66qrrpJ0+N9/pl9AX7hwoSorK7VixQqvS+nVF198ocLCQt1/\n//2KxWJ6/PHHvS6pV//85z/V1dWlVCqlWCxmL7zIdINa5bp167Ry5cq090455RQNHz5cy5cv1+bN\nm/Xkk09q9erVg3naAemp1jPOOEMVFRU655xzPKrqaD3VGQ6Hdd5556mtrU2PPfaY5s2b51F1vetr\nGWkmGTVqlKTD9T744IN6+OGHPa6od++8847GjBmjsrKyjA7uAwcOaPfu3Vq2bJl++eUX3Xvvvdqw\nYYOGDRvmdWlHGTlypHbt2qWpU6fqwIEDWrZsmdcl9Y/lsocfftjasGGDfXzRRRe5fcoBu+KKK6xZ\ns2ZZs2bNsoqKiqyZM2d6XVKvtm7dalVUVFifffaZ16X0KBwOWx9++KF9XFZW5mE1fdu9e7d14403\nWuvWrfO6lD7NnDnTqqqqsmbNmmWVlpZa06dPt/bu3et1WUd5/vnnrVdffdU+vu6666x9+/Z5WFHv\nwuGw9cILL1iWdfi/g/Lycqujo8Pjqpy5Pv0pLS3V559/rquuukpbt27V6aef7vYpB+zTTz+1X0+Z\nMkWvvfaah9X07qefftJDDz2kRYsWZdRPB931tYw0k+zbt0933nmnqqurNXnyZK/L6VP3n1Rnz56t\nmpoajRs3zsOKelZaWqo333xTd9xxh/bu3atDhw5p9OjM3AbgpJNO0gknnCBJOvnkk5VMJnu8UzHT\nuB7cM2bM0NNPP60ZM2bIsiw988wzbp8y67344otKJBJ67rnnJB2+EerI/jGZory8XM3NzaqsrLSX\nkWaiZcuW6ffff9eSJUu0ZMkSSdLLL7+c0Rf/Mt1ll12mzZs36+abb5ZlWaqurs7Yawe333675s2b\np5kzZ6qzs1OPPPKIRo4c6XVZjlxfDggAGFw8AQcADENwA4BhCG4AMAzBDQCGIbgBwDAENwAYhuAG\nAMMQ3ABgmP8HZIT43Z5YaQcAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x1 = np.random.normal(0, 0.8, 1000)\n", "x2 = np.random.normal(-2, 1, 1000)\n", "x3 = np.random.normal(3, 2, 1000)\n", "\n", "kwargs = dict(histtype='stepfilled', alpha=0.3, normed=True, bins=40)\n", "\n", "plt.hist(x1, **kwargs)\n", "plt.hist(x2, **kwargs)\n", "plt.hist(x3, **kwargs);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you would like to simply compute the histogram (that is, count the number of points in a given bin) and not display it, the ``np.histogram()`` function is available:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 52 289 447 183 29]\n" ] } ], "source": [ "counts, bin_edges = np.histogram(data, bins=5)\n", "print(counts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Two-Dimensional Histograms and Binnings\n", "\n", "Just as we create histograms in one dimension by dividing the number-line into bins, we can also create histograms in two-dimensions by dividing points among two-dimensional bins.\n", "We'll take a brief look at several ways to do this here.\n", "We'll start by defining some data—an ``x`` and ``y`` array drawn from a multivariate Gaussian distribution:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "mean = [0, 0]\n", "cov = [[1, 1], [1, 2]]\n", "x, y = np.random.multivariate_normal(mean, cov, 10000).T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ``plt.hist2d``: Two-dimensional histogram\n", "\n", "One straightforward way to plot a two-dimensional histogram is to use Matplotlib's ``plt.hist2d`` function:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWYAAAD0CAYAAACo/4zqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtwVOX5B/Dv2SS7Cbu5FA2iJuFHkBQo8ANKCa0CWk1D\n6VgshYBxgpTadqgtBJiQEENABCJjiVqmEEwr2iSKofFCS9sREY0NGBUFCnIZUrWGa7jkl+wK2Uv2\n90fMajDmfXP27O7Zk++H2Rmyec/ZZ3N5eHnPc55X8Xq9XhARkW6YQh0AERF1xcRMRKQzTMxERDrD\nxExEpDNMzEREOhMZiJNevXoV7x88jOuvT0REZEQgXoKIdECmqEtRlB4/73F70HK5CSNHjkR0dLTq\nWJqbm2G326XG2mw2JCQkqH6tQAtIYj58+DB+Nve+QJyaiAyqqqoK48ePV3Vsc3Mzxqffigi4pcbH\nx8fj1Vdf1W1yDkhiTkxMBABs/XMVbhg4MBAvQUQ6oMWM+dzZs/jZ3Pt8eUMNu92OCLhxLnoC3ErP\ns+5I71Xg/96B3W7vW4k5IqJj+eKGgQNx881JgXgJItIBLRJzp8684Q+3KRoeU7+eB7X7/TIBF5DE\nTEQUEoqp4yEao3NMzERkHIrS8RCN0TkmZiIyDiUCMAmWRLz6rxRjYibqg7RaG5ZdPw4aRZFYytBZ\nzN1gYiYi4+BSBhGRzvDiHxGRznDGTESkMwaZMes/QiIiWSZTR1VGj4/u097BgweRk5PT5bm//vWv\nmD17tu/j6upqzJgxA1lZWdizZ0/A3gZnzERkIBIz5m7mo+Xl5dixYwdiYmJ8z3344Yf4y1/+4qtg\naWpqQkVFBWpqatDW1obs7GzceuutMJvNWr6Br4mQiChcmRS5xzVSUlKwceNG38eXL19GaWkpCgsL\nfc8dOnQIY8eOhdlsRmxsLFJSUnDs2LGAvA3OmMmwtOzjoAUt9j3WXd2w3qhcY87MzERjYyMAwOPx\n4KGHHsLy5cthsVh8Y+x2O2JjY30fW61W6TajvcXETETGoUFVxpEjR/DJJ59g1apVaGtrw8mTJ7F2\n7VpMnDgRDofDN87hcHRJ1FpiYiYi4+i8+Cca04PRo0dj586dAIDGxkYsWbIEDz30EJqamvDEE0+g\nra0NTqcTDQ0NSEtL0yryLpiYicg4Algul5iYiJycHGRnZ8Pr9WLx4sVdljq0xMRMRAYisZSB7j+f\nlJSE6urqHp/LyspCVlaWv0EKMTETkXEY5AYTJmYiMg4FEhf/ghKJX5iYKaiCWcKm1XlcbvFeRJER\n4tfytPf83iO6qa+9lhYldwAgCAUAYIK+yg2lcMZMRKQzJolG+aLP6wATMxEZh0FmzH5FePHiRUyZ\nMgUNDQ1axUNEpF7nGnOPj1AHKaZ6xuxyuVBcXIzo6Ggt4yEi8oO6JkZ6ozrC9evXY86cORgwYICW\n8RARqSecLcvUOYeeqsT84osvon///pg0aZLW8RARqde5xix66JyqpYyamhooioJ9+/bh6NGjyM/P\nx+bNm5GYmKh1fGQwMuVVMiVhotIz2deSqFCT4vbIxBP4c3SMEQ/SqjRPbx38FJMJiqAXhujzeqAq\nMVdVVfn+npOTg1WrVjEpE1HIdaxU9PwPQRisZLBcjogMRIG46qIvJOaKigot4iAi8puiKBIzZv1n\nZs6YicgwFEgk5jCYMjMxE5FhmEwmeAUX90xGvfhHRKRLXGMm6kqrzmcya4Ay3dzaXB7hGJmQtegc\nBwDtgiZ1MqV7ERJfm3aJWGS+V5ER+p9ZfoXEGnM4lGUwMRORYfDiHxGRzjAxExHpDG8wISLSGUVR\noAgW68NhxhyGq/tERN3rXMoQPbpz8OBB5OTkAACOHj2K7Oxs5OTk4Oc//zkuXLgAAKiursaMGTOQ\nlZWFPXv2BOx9cMZMRIahdo25vLwcO3bsQExMDABg7dq1WLFiBYYPH45t27ahvLwcDzzwACoqKlBT\nU4O2tjZkZ2fj1ltvhdls1vx9cMZMRMahSD6ukZKSgo0bN/o+Li0txfDhwwEAHo8HFosFhw4dwtix\nY2E2mxEbG4uUlBQcO3YsIG+DM2YKKpnWlu1e8a7UV13iMVotJdrbxK9l0qDFqMSXBtFR4rmUTK1z\ntFm8IWkw69K1onbGnJmZicbGRt/HnRuAvP/++6isrERVVRXeeustxMbG+sZYrVbY7XaNIu+KiZmI\njEPDG0z+/ve/Y/PmzXjqqafQv39/2Gw2OBwO3+cdDkeXRK0lLmUQkWGYFBNMJsFDYgeTV155BZWV\nlaioqEBycjIAYPTo0di/fz/a2trQ2tqKhoYGpKWlBeR9cMZMRMahQa8Mj8eDtWvX4sYbb8Rvf/tb\nAMB3vvMdLFy4EDk5OcjOzobX68XixYthsVg0CftaTMxEZBiKAuFSxdd9OikpCdXV1QCAd955p9sx\nWVlZyMrK8idEKUzMRGQYisQu2OFwgwkTMxEZBhMz9Sluj0x5mjY/8G6JtpUybTZbrri0CEeq/WWk\nRM9O0ZfHFi3+dZR5HZl4ZVqiWqLEJXUy3wcTeh6jVVkegI7bsUW3ZGu1NXoAMTETkWFwxkxEpDsS\ndcxhsIUJEzMRGYbMjDkc+n4yMRORcXDPPyIifeGMmYhIZ0wmiLtFhUEjCiZmg5MpRZIpeZIqi5KY\niLS5ZTrHiUu5LjvEpXCXHE7hmJu/ESOOxymOR2YSFi0oP2uT6JjnjZToLmcK3g7YMt/zYO7Bxxkz\nEZHOKFxjJiLSFwUSM+YwyMxMzERkHBJ52av/vMzETETGYTKJd8n2mhSIV/NDi4mZiAyDiZmISGdk\nijLCYImZiTkUZErYtCohkilzk3ktR5tbi3BwvqVNOMZ+VfxaH7WIN8G8Pka8u8RbnzQJx3wzQbyv\nm6gUDhB3j4sIYtczmZeS+dkJZswyZDZjZbkcEVFQiROzNwymzKoSs8vlQmFhIU6dOgWn04kFCxbg\nzjvv1Do2IqJeMcj9JeoS844dO5CQkIDHHnsMzc3NuOeee5iYiSjkTCYFJuEt2frPzKoS89SpU5GZ\nmQmgY700IkK8vkZEFGgdM2Z1m7Hqiaob5q1WK2w2G+x2OxYuXIjc3Fyt4yIi6rXOpQzRozsHDx5E\nTk4OAOCTTz7Bvffei+zsbKxcuRLt7R0FdtXV1ZgxYwaysrKwZ8+egL0P1Z1Mzpw5g7lz52L69Om4\n++67tYyJiEiVzqoM0eNa5eXlKCoqQltbR9VQSUkJcnNz8dxzz8Hr9WL37t1oampCRUUFtm3bhj/9\n6U8oLS2F0ylulKWGqsR84cIFzJ8/H3l5eZg5c6bWMRERqaJ2xpySkoKNGzf6Pj5y5AgmTJgAAJg8\neTL27t2LQ4cOYezYsTCbzYiNjUVKSgqOHTsWkPehao25rKwMLS0t2LRpEzZt2gSg41+c6OhoTYPr\ny2RqnSXKTCGzAbFMjfJliRaaMrsqv3v6knDMgH7i+uP/XLoqHHO8/YpwTFK8WTim6Yq49jo1xiYc\nI1r7lKkbNku0/ZSpS5cZI9rdWp/U7fmXmZmJxsZG38der9d3HqvVitbWVtjtdsTGflHTbrVaYbeL\n6+nVUJWYi4qKUFRUpHUsRER+kanK8EpUZZhMX/wD6HA4EBcXB5vNBofD0eX5LydqLYVBL38iIjn+\nXPz7shEjRqC+vh4AUFtbi/Hjx2P06NHYv38/2tra0NraioaGBqSlpQXkffDOPyIyDJlbsmWWcfLz\n87FixQqUlpYiNTUVmZmZiIiIQE5ODrKzs+H1erF48WJYLOJlNzWYmInIMPy58y8pKQnV1dUAgMGD\nB6OysvIrY7KyspCVleVvmEJMzERkGFrNmEONiZmIDIOJmVSTKXOTaafolNhNWqYES2ZXakebeMze\nTy8Kx1z8TFya996n4hKkj863CsecOt0iHPPjWwcJxwxJsArHyJQ3Rgq+p7GCtqAA0C5T/6iRcEhg\n11IUcVVGexi8LyZmIjKMPt1djohIj4zSxIiJmYgMQ08z5pdffhlbtmyB0+n03Um4e/duqWOZmInI\nMEyKApMg84o+r5Xy8nKUlZXhxhtv7PWxTMxEZBiKxC3Zol20tZKcnIxBg8QXl7vDxExEhmGCeIOS\nYPWhiI6OxgMPPIDhw4f71r2XLFkidSwTcwhotUOxTOlUyxWXcEybq1045vglcemZTJnbe8fOC8c4\nneLSPJn/jf5k0v8Ix9jM4o54bonvRYzEeSIjBGVcEt9PmQ5+MqV7RqWnOuYpU6aoPpaJmYgMQw8X\n//79739j1KhRSExMVH0OJmYiMgzl8z+iMYG0b98+jBo1Cjt37vzK52677TapczAxE5FhmBSJNeYA\nz5h/+ctfAujYnurYsWP4+OOPMXToUAwZMkT6HEzMRGQYeqrK2Lx5M2prazFq1Cg888wzmDp1KubN\nmyd1LBMzERmGnuqY33jjDTz//PMwmUxwu93Izs6WTszcwYSIDEOrHUy0cN111+HKlY59J10uF/r3\n7y99LGfMOuV0i0vYrkiUlbVcEXdze/uUuCtc7clm4Zh9758SjmltFneFczT+Vzjm5v8dJRzz34vi\nzVjHJYv3bEuwiDdslSljE5GpcpMphQvHrnBaUSQ2Yw30xb/Zs2dDURRcvHgRmZmZ+OY3v4mGhgYk\nJCRIn4OJmYgMQw/lcqWlpX6fg4mZiAzDpAARwjXmwMZw8803+30OJmYiMgw93fnnDyZmIjIMPdQx\na4GJmYgMQ+2M2eVyoaCgAKdOnYLJZMIjjzyCyMhIFBQUQFEUDB06FCtXroTJJF/IVldXh61bt8Lp\ndPqe+/Of/yx1LBMzERmG2ot/b775JtxuN7Zt24a6ujo88cQTcLlcyM3NRXp6OoqLi7F7925kZGRI\nx1JSUoLCwkIMHDiwl++CiZmIDETtjHnw4MHweDxob2+H3W5HZGQkDhw4gAkTJgAAJk+ejLq6ul4l\n5htvvBHf+973evcGPtdnErNMG02ZnallziOqNZXZcVomlvP/1yYcc0yiXecnl8Xn+bBBXOt89ugJ\n4RhEimuCB4wYLhyTkhIvHBMVKf5vZ+o3+gnHJMZZhGPaZVqDCmqdZeKlnpkURfi7092df/369cOp\nU6fwwx/+EJcvX0ZZWRneffddXxK3Wq1obRXX4H/Zddddh+LiYowYMcJ3ntmzZ0sd22cSMxEZn/L5\nQzTmWs888wxuu+02LF26FGfOnMH9998Pl+uLXuYOhwNxcXG9iiUpKQkAcOHChV4dBzAxE5GBqO2V\nERcXh6ioKABAfHw83G43RowYgfr6eqSnp6O2thYTJ06UiuHs2bMYOHAgfvSjH/X+DXyOiZmIDEPt\nxb958+ahsLAQ2dnZcLlcWLx4MUaOHIkVK1agtLQUqampyMzMlIph69atWL58OYqLi31LGJ27ZLMq\ng4j6HLUX/6xWK5588smvPF9ZWdnrGJYvXw4AqKio6PWxnZiYicg4ZLrH8QYTIqLgiTCJqzJkKp5C\nTVVibm9vx6pVq3D8+HGYzWasWbMGgwYN0jo2TWn1zZA5jahjZ3SUuCzq9OWrwjH/aRbvSl33sbhc\n7p2j4p2rGz9uEo7BuQbxmMFjhUPi42OEY4bdLG6hOHGQuKXn4G/YhGPMEmVsZsEO2ACEO2uwpaf/\nFIi/RsH8CtrtdiiKgl27duGOO+5AfLy4zBNQmZhfe+01OJ1OvPDCCzhw4AAeffRRbN68Wc2piIg0\nY4J4949gVYsvXrwYt99+Oz744AO0t7dj165d+MMf/iB1rKoY9+/fj0mTJgEAxowZg8OHD6s5DRGR\npjov/okewXD+/HlMnz4dDQ0NWL16NRwOh/SxqmbMdrsdNtsX/wWMiIiA2+1GZCSXrIkodBSJ7nLB\nWg1yuVx49dVXccstt+DSpUu9SsyqZsw2m63Li7S3tzMpE1HIdV78Ez2C4Re/+AV27tyJX/3qV6io\nqMCDDz4ofayqxDxu3DjU1tYCAA4cOIC0tDQ1pyEi0lRnP2bRIxiam5vx5JNPYuDAgVi0aBH++1/x\nXpadVE1zMzIyUFdXhzlz5sDr9WLdunVqTkNEpCk97Pn3t7/9Da+//jrq6+vx9ttvA+hYVThx4gTm\nzp0rdQ5VidlkMmH16tVqDg0ZmVIkGW0u8e7VbkGnsZYrrh4/DwBXXeIOdCcviXeB/vi8uKTu8L4j\nwjGRVnFZWdSwCcIxCdeLy9xsNnEHuhtio8TniRL/eMfFiMf0M4t3wLZa/N8lm/ynSPTKCPTFv0mT\nJiExMRHNzc2+bnImkwnJycnS5+DCMBEZhh7K5eLj45Geno709HRcvHgRbW0dbXU9HvFkqxMTMxEZ\nRscNJuIxwfDwww/jzTffxIABA3xNjLZt2yZ1LBMzERmGnm7JPnjwIF577bVe7RPYiVsmEJFhKBIV\nGcGqYx40aJBvGaO3OGMmIsNQ2yg/EM6cOYM77rjD10eISxlE1CfpoVyu04YNG1Qfy8RMRIYhcwNJ\nsG4weemll77y3G9+8xupYw2RmINZoyyjXYNdshsui+uPj58T33t//uJnwjH/M+oW4Zg2iZg/s4tf\n69v/e5NwzJS0/sIxtyZdJxxzQ0K0cEykxG+pRaLtp8Qm2WHRBzjcKZ//EY0Jhuuvvx5AR3768MMP\n0d4un18MkZiJiAAgQgFE/45KtM7WxJw5c7p8/MADD0gfy8RMRIahds+/QPjoo498f29qasLp06el\nj2ViJiLD0NMac3Fxse/vFosF+fn50scyMRORYfhTlbFlyxa8/vrrcLlcuPfeezFhwgQUFBRAURQM\nHToUK1eu7NXNIhUVFbh8+TI+/fRTJCUloX9/8bWTTrzBhIgMo+MGE6XHR3eJub6+Hh988AGef/55\nVFRU4OzZsygpKUFubi6ee+45eL1e7N69u1ex/OMf/8CcOXNQVlaG2bNn45VXXpE+ljNmIjKMCFPH\nQzTmWv/617+QlpaGBx98EHa7HcuWLUN1dTUmTOjomDh58mTU1dUhIyNDOpZnnnkGL774IqxWK+x2\nO+6//35Mnz5d6lgm5i+RKWdytLmFYy60Onv8vEeitkrm7qR+FvG376JEuVzaLeLSs/MXxKV5Gd8V\n75Q++DpxCdvQ/lbhGJlSOJkyN5nveWSwLuOT30xQYBKUw3X3+cuXL+P06dMoKytDY2MjFixY4Gs8\nBABWqxWtra29ikVRFFitHT/LNpsNFotF+lgmZiIyDLVrzAkJCUhNTYXZbEZqaiosFgvOnj3r+7zD\n4UBcXFyvYklOTsajjz6K8ePH47333kNKSor0sVxjJiLDUCDRxKib47797W/jrbfegtfrxblz53Dl\nyhV897vfRX19PQCgtrYW48eP71UsJSUlSE5Oxt69e5GcnIxHHnlE+ljOmInIMNQ2Mbrjjjvw7rvv\nYubMmfB6vSguLkZSUhJWrFiB0tJSpKamIjMzs1exHDlyBB6PB8XFxVi6dCnGjh2LESNGSB3LxExE\nhuFPudyyZcu+8lxlZaXqWFavXo3HH38cAJCbm4uCggJUVVVJHcvETESGoadG+VFRUb515eTk5F7V\nQDMxE5FhKBBfOAtWjc1NN92E0tJSjBkzBocOHcKAAQOkj9V9Ytaqc5zbIz6P0yPu/iRzn72ovCpK\noozr05arwjFWid2bx428QTjm3GXxbttTxoi7wqUnxwrH3JIg3m37G1bxLtkyXeFkdq6WmT2xc1z4\n0FOvjJKSEjz//PN48803MWTIEPz617+WPlb3iZmISJYC8Yw4WP+EWiwWzJs3T9WxTMxEZBh62lrK\nH0zMRGQYepox+4OJmYgMQ1EUmATr/cFaY/YHEzMRGYYJ4qqMcLjdmYmZiAxDT1UZ/ghpYg5mKZwM\nl1tcLmeJEpdgiTQ2izu+JceJu6e1SmyQOipJ3HjlO4MThGOu6yf+URkSLy6Fk/n6yfzexPeLEg+S\nIPNLyuZy4YNrzEREOtNxS7ZoxhykYPzAxExEhmFSFESwXI6ISD+4lEFEpDP+dJfTEyZmIjIMtVtL\n6Y2qxNza2oq8vDzY7Xa4XC4UFBRg7NixWsdGRNQrfXrGvHXrVkycOBHz5s3Df/7zHyxduhQvvfSS\n1rEREfWK8vkf0Ri9U5WY582bB7O5ozWjx+Pp1e6vvSXXZlN8HplaZ9GtnIDcLtlOQT30DTZxjbJL\nIt5RA8R1wx6JWvHBCeJdqaNEe8IDSLCKa4tlzmOLDt4Km8yO5WzpGT76TFXG9u3b8eyzz3Z5bt26\ndRg9ejSampqQl5eHwsLCgAVIRCSrzyxlzJo1C7NmzfrK88ePH8eSJUuwbNkyTJgwISDBERH1hgKJ\nxByUSPyj6v+MJ0+exKJFi/DEE09g2LBhWsdERKRKn15j3rBhA5xOJ9auXQsAsNls2Lx5s6aBERH1\nlknpeIjGdOfixYuYMWMGnn76aURGRqKgoACKomDo0KFYuXJlrzZT9ZeqxMwkTER6pEjsYNJdQYHL\n5UJxcTGiozsuzJeUlCA3Nxfp6ekoLi7G7t27kZGREZCYuxMOrUmJiKQokn+utX79esyZM8e3k/WR\nI0d8184mT56MvXv3BvV9hPTOP5lSOJlyJplqJrfEeWIkWlJ+JtFqM0awe7WonA4ABsaKS+pkxEqU\nnslcpbZaxOeRKSuTeS2tytNk2sqGQ29ekqdmKePFF19E//79MWnSJDz11FMAOn52On82rFYrWltb\nAxHu1+It2URkGB1NjEQX/7qqqamBoijYt28fjh49ivz8fFy6dMn3eYfDgbg4cV9zLTExE5FhqKlj\nrqqq8v09JycHq1atwmOPPYb6+nqkp6ejtrYWEydODEC0X49rzERkGIrkQyQ/Px8bN27E7Nmz4XK5\nkJmZGaiQu8UZMxEZhr+3ZFdUVPj+XllZqVlcvcXETETGYZBO+UzMRGQYffrOP1ler7fHkiWpHYol\nSqdkSuqiNNrqODpKvCwvKpe74hSX3Jkjxa/j8ojL7mS+fjId3/oJ3hMg150vmI3aWArX9/SZJkZE\nROHCICsZTMxEZDDhkHkFmJiJyDBMEr0yDNEon4goXHApg4hIbwySmZmYichAxOVy4ZCZA5qYFUUJ\nSsmSTElYm0ub0jKLRAc6LUrCZL5sMWbx5qcyZMruZLrzmaW6y+n/l4LCF8vliIh0homZiEhneOcf\nEZHOcMZMRKQzBinKYGImIgMxSGZmYiYiw+AaMxGRzigSm7FyjVlAq12MZdp+ypA5j0zNr0XQstNq\nEddCy+0OLtFmU6K2WKaVqQzWKJMuGODHkDNmIjIMLmUQEekMy+WIiHTGIEUZTMxEZCAqMrPL5UJh\nYSFOnToFp9OJBQsW4JZbbkFBQQEURcHQoUOxcuVKmEzaXIuRwcRMRIZhUsQXxa+9Hr5jxw4kJCTg\nscceQ3NzM+655x4MGzYMubm5SE9PR3FxMXbv3o2MjIwARn5NjEF7JSKiAFMkH182depULFq0CEBH\npVhERASOHDmCCRMmAAAmT56MvXv3BucNfC6gM+b2dm+PZV8y7THdEuVpMmVaMrtOy5SoWS3iL5mo\nDFAuXvEYt0ccb7vEe4rQ6Guj0UbkROqpWMqwWq0AALvdjoULFyI3Nxfr16/3/Z5arVa0trZqH2sP\nOGMmIsNQJP9c68yZM5g7dy6mT5+Ou+++u8t6ssPhQFxcXDDfBhMzERmI8kXJ3Nc9rs3LFy5cwPz5\n85GXl4eZM2cCAEaMGIH6+noAQG1tLcaPHx/Ut8GLf0RkGGrqmMvKytDS0oJNmzZh06ZNAICHHnoI\na9asQWlpKVJTU5GZmRmgiLvnV2JuaGhAVlYW9u7dC4vFolVMRESqqLnzr6ioCEVFRV8ZV1lZqWls\nvaE6Mdvtdqxfvx5ms1nLeIiIVDPKnX+q1pi9Xi9WrFiBJUuWICYmRuuYiIhUUVMup0fCGfP27dvx\n7LPPdnnupptuwrRp0zBs2LAejzWZFKmdp3sSIfFPh0z5mcstLruL1KreSxCPTOlZu8SPj0y8WnV8\n8/f7SBQMCiRmzEGJxD/CxDxr1izMmjWry3MZGRmoqalBTU0NmpqaMH/+fFRVVQUsSCIiOcbolqFq\njXnXrl2+v3//+9/H008/rVlARERqmSQa5YfDf/5YLkdExiFx8S8MJsz+J+bXX39diziIiPzGRvlE\nRHpjjCVmJmYiMg6D5GVjbMYqc54oiQ5qMmReS0TmPcmUp8nEotXXmCgcGOUGE86YicgwFEURTjTC\nYSLCxExEhsGlDCIineFSBhGRzrBcjohIb3iDCRGRvvSZJkZEROGCSxkaCGbZikw9r0w7zkiZPqQC\nJvhfCw2ER9kPUTDx4h8Rkc6wXI6ISG8MkpmZmInIMDrysmiNWf+YmInIMNQ2ym9vb8eqVatw/Phx\nmM1mrFmzBoMGDQpMkBK06exDRKQHKndjfe211+B0OvHCCy9g6dKlePTRR4MWcncCMmP2eDwAgHNn\nzwbi9F+hRcc3AGgX79eKCA02bGXHN6IvdOaJzrzhj/PnzkG0WNExpqv9+/dj0qRJAIAxY8bg8OHD\nfsfij4Ak5qamJgDAz+beF4jTE5EBNTU1qV4+sNlsiI+Pl8458fHxsNlsvo/tdnuXjyMiIuB2uxEZ\nGZrV3oC86siRI1FVVYXExEREREQE4iWIyCA8Hg+ampowcuRI1edISEjAq6++CrvdLjXeZrMhISGh\ny8cOh8P3cXt7e8iSMhCgxBwdHY3x48cH4tREZEBaXGhLSEjokmx7Y9y4cdizZw+mTZuGAwcOIC0t\nze94/KF4tVqgJSIKU51VGSdOnIDX68W6deswZMiQkMVjmMT82WefYenSpWhpaUFUVBTWr1+PG264\nIehxtLa2Ii8vD3a7HS6XCwUFBRg7dmzQ4/iyXbt24Z///Cc2bNgQ9NfWWxkSABw8eBC/+93vUFFR\nEbIYXC4XCgsLcerUKTidTixYsAB33nlnSGLxeDwoKirCRx99BEVR8PDDD4d8xtjXGaZcrrq6Gt/6\n1rdQVVWFH//4xygvLw9JHFu3bsXEiRNRWVmJkpISrF69OiRxdFqzZg02bNiAdpmSkwDQWxlSeXk5\nioqK0NbYQoUWAAACW0lEQVTWFtI4duzYgYSEBDz33HP44x//iEceeSRksezZswcAsG3bNuTm5uLx\nxx8PWSzUwTA3mMybN89XbnP69GnExcWFLA6z2QygYyZisVhCEkencePG4a677sILL7wQktfXWxlS\nSkoKNm7ciGXLloU0jqlTpyIzMxNAR/lkKC+S33XXXbj99tsBhPZ3h74Qlol5+/btePbZZ7s8t27d\nOowePRpz587FiRMnsHXr1pDG0dTUhLy8PBQWFgY8jp5imTZtGurr64MSQ3f0VoaUmZmJxsbGkLz2\nl1mtVgAdX5+FCxciNzc3pPFERkYiPz8fu3btwu9///uQxkIAvAZ08uRJ75133hmy1z927Jh32rRp\n3jfeeCNkMXzZ22+/7c3NzQ3Ja69bt867c+dO38eTJk0KSRxf9umnn3pnzZoV6jC8p0+f9v7kJz/x\nbt++PdSh+Jw/f957++23ex0OR6hD6dMMs8a8ZcsWvPzyywA6ZiOh+q/hyZMnsWjRImzYsAFTpkwJ\nSQx6Mm7cONTW1gKALsqQ9OLChQuYP38+8vLyMHPmzJDG8vLLL2PLli0AgJiYGCiKApPJMKkhLIXl\nUkZ3fvrTnyI/Px81NTXweDxYt25dSOLYsGEDnE4n1q5dC6CjcH3z5s0hiUUPMjIyUFdXhzlz5vjK\nkAgoKytDS0sLNm3ahE2bNgHouDAZHR0d9Fh+8IMfYPny5bjvvvvgdrtRWFgYkjjoC4YplyMiMgr+\nf4WISGeYmImIdIaJmYhIZ5iYiYh0homZiEhnmJiJiHSGiZmISGeYmImIdOb/AQLFo8QT4PQHAAAA\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hist2d(x, y, bins=30, cmap='Blues')\n", "cb = plt.colorbar()\n", "cb.set_label('counts in bin')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just as with ``plt.hist``, ``plt.hist2d`` has a number of extra options to fine-tune the plot and the binning, which are nicely outlined in the function docstring.\n", "Further, just as ``plt.hist`` has a counterpart in ``np.histogram``, ``plt.hist2d`` has a counterpart in ``np.histogram2d``, which can be used as follows:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "counts, xedges, yedges = np.histogram2d(x, y, bins=30)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the generalization of this histogram binning in dimensions higher than two, see the ``np.histogramdd`` function." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ``plt.hexbin``: Hexagonal binnings\n", "\n", "The two-dimensional histogram creates a tesselation of squares across the axes.\n", "Another natural shape for such a tesselation is the regular hexagon.\n", "For this purpose, Matplotlib provides the ``plt.hexbin`` routine, which will represents a two-dimensional dataset binned within a grid of hexagons:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWYAAAD0CAYAAACo/4zqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXuwZFV5Nv6stfalb+cyZ+YMMzAzwCAY+PkZNQbQCImV\nojDGlCkqAmJGSeI/JtGgloKWDF7ih5YlZcqqSKSilqAiFlpaqaQqJfrJFzRoNMKHgkFAxGEuZ+bM\nufRtX9Zavz/WXrv37t6XPt19uvuc2c9Uz0z32uuyb+9+93t5XiKllChQoECBAlMDOukFFChQoECB\nOArBXKBAgQJThkIwFyhQoMCUoRDMBQoUKDBlKARzgQIFCkwZjM0YtN1u47HHHsPi4iIYY5sxRYEC\nBbYJOOdYWlrCi170IpRKpYHHWVlZQb1e72vbWq2G+fn5gefabGyKYH7sscfwpje9aTOGLlCgwDbF\nl770Jbz85S8fqO/KygpeftnvgcHva/u5uTn8+7//+9QK500RzIuLiwDUgd6zZ89mTFGgQIFtgmPH\njuFNb3pTKDcGQb1eB4OP46VL4ZNsrduQbWD1h6jX62eWYNbmiz179mDfvn2bMUWBAgW2GUZh9vRp\nCZxWsjcSQ0+z6dgUwVygQIECEwGh6pO3zZSjEMwFChTYPiBEffK2mXJMXDBLCYjgwyhAE46ZkAAX\n+e2UqE/3cc9rlxLw+2gnUGtIaucCkACMlHa9j3ntSfsopRq7n2Mw6DEaxTHwg1fEtH3czGM0imOw\nHa6TcRwjn3f6b/QYbDoIA2iOSUROf6TYxASzvoj84EIFAM7VCTWZ+jet3QguCgnA45F22dvuCzWO\nbgcAM3JR+qLzu/7XIOqi6m4HgouSqDmS2nlXOxeA39VOg3a9j57Ibk87RpQE/Xn2Mco6BmntozwG\nU3eMNnidjOMYpR0DM2gf5hiM7F7ikXuFB8eIqf3IOwZjE9CE9GHKKDTmREgJuJGLINYG1ZbaF/EL\ndKPt6KPdD7SCNHDZuTAHaRcyex/z2oc9RuijfbOPQXGM+jsGzgSPgW7P4p/0OOAhXdbpfbRYsoY+\nchSmjMEhkSyUCxQosD0h5LgEc+H8K1CgQIHpQqExFyhQoMCUodCYCxQoUGDKQGkfURmFYE6E9jZH\nvcQFChSYTug3/zQnYJ5lgJFO5Mbmow+NeQuQak5MY9ZxkN1hQAUKFJhORAU0AYK/0qHDCcdq0tUB\n2HnbTDkmasogwZOUkOywngIFCkwP+hG0BgGMSeRxbBMb8/SvsECBAlsOEwt80FEZeZ8EPPLIIzh0\n6BAA4PHHH8cNN9yAQ4cO4a/+6q9w8uRJAMB9992Ha665Btdeey2++93vbtpuFM6/AgUKbB/04/yj\nvfroXXfdhW9961sol8sAgI9+9KO49dZbcfHFF+Pee+/FXXfdhbe+9a24++67cf/998NxHNxwww34\nvd/7PViWNfrdGPmIG4ROly1QoMBokJWp10/7KOCJgBdk3N59bcrI+3ThwIED+PSnPx1+v+OOO3Dx\nxRcDUBVWbNvGo48+ipe+9KWwLAszMzM4cOAAnnjiiU3ZjYkJZiEBx09PzS5QoMDGIGVHEEb/32/7\nqOEJdX+PV0D3Y8boNWVcffXVMIyOAWH37t0AgJ/85Ce45557cOONN6Jer2NmZibcplqt9l3KaqOY\niCkjL8e/QIEC/WFY7Vi3b5ZNWPNtmHRMIXMjdP7967/+Kz7zmc/gs5/9LBYWFlCr1dBoNML2RqMR\nE9SjxMRNGQUKFNj+GKfCnO/8yx/mm9/8Ju655x7cfffd2L9/PwDgxS9+MX784x/DcRysr6/jqaee\nwkUXXbQpu1E4/woUKLB9MAKNmXOOj370o9i7dy/e/va3AwB+93d/F+94xztw6NAh3HDDDZBS4p3v\nfCds2x7VymMoBHOBbY3NflUfdv5Jr2/bgfZBlJ/Svm/fPtx3330AgB/+8IeJ21x77bW49tprh1pi\nP5iIYC6uwQKbiSS76rgFYJLjLTp/Xvt2w9h2a5skmExGMBPAZr0VDwoUGBb9OLs2U/iN2xkX3a57\n7J60adlr693sB8H4K5igD9rPsaxkKEzMlEGIKktjBFUgiiCNAsNi7DGzU4Zc4def32skIFBVS8b/\nBlCQGI0EhACMZZfYKVDgTMJ2MGeMVUuOoiDKL1CgQIEpQ2FjHiHO8FfQAtMEiewX/rz2EcyRO8Ww\naxjFPmRDSGAy5HIUJIELo3ubacdEBbOUhQOwQAeh4yv8a/Pm6X2blREbtQza4xvJcAMZrHFji5Qx\nI7gESemfKjaljOgw6f0zVpC7j6MCl4DkyqQxTvpjZcnInnALWDImVCU7IMcXhUA+o6EFZE/oWPjX\nxm6ivEobieNFhF1vPyWAk9qV8JSRhwgJx4+P0xGGQspY1IXW27oFZDzSIiKKZeeeIQAIlZEghBQh\nn9IfUAKTkN59GBU09cJYHYHJVBi920w5htLpT506hd///d/HU089taF+EoVQLqCQG0kxwHWS5P9J\n8wkJmU34k9YebqNGT51LCAkhJbiQccEuAR60Za1R3yu8S5GRAESfDG5J/aO/J+3DKCExvrdiQkhf\nn2nHwBqz53k4fPgwSqXSKNdToMDIMOn7jxAllPoJ48ta67BhgGdSGCFBvuAlW0BlHlhj/vjHP47r\nr78+pMcrUKBAgUmDUtrXZ9ox0Aq//vWvY2FhAVdcccWo11OgQAxZGqeUEkLILqfaRtpz5s41ZSgT\nRdocafN2z8Gz+veh7ar1pW/Yz5tD+jEeD3fzyED6/Ew5BjJl3H///SCE4Ac/+AEef/xx3HzzzfjM\nZz6DxcXFvvoTdCpkFzizkeT8S0LUaSZlr71WShl65PPbs+fvlocy4T/RbXgwQLQitAiFGQEhMnMf\npQR8LkGJBI2EMOg+NLLG6DCxbOuufYyCBsKo2/kXZ8CUkDLNgRlfj96mXxCMiYsZAPqxIU/axtUH\nBhLMX/rSl8L/Hzp0CB/84Af7FsqAOi4WK8LlznTo+6OfaArVni/gsjTHqPDqiCQSfJc9gqunP7LH\n50HnXsEQnyMNQgKCyyBaotehGC6i+7foGoOQFt0/Og4hEiSi/aZFc/T7oMyTb5RMIlyuDxvzdhXM\no4Lmy2ACcMUkV1LgzELSjRkIz019Z48G3w04wlAypfOAGPZ9Pm8dLLi3x41CMAe4++67h1/F9B+n\nAgXGhs2/HTZ/hnFqyVEUCSYFChQoMGUghIDkPBXOCI15WEhZMMsV2G4YzlQwvKFh8vCFziwc77yF\nKWNIFI6/AlH0l4RBckPfokJtI/dfXmibbueikwad5TzL5uLIW4v6d2PyI5r6rSJE1BibI4TynH8S\ngMPHT5RfCOYhIKU6aQXObAziZ+sWzklhZNHwtt7U7PgPeqy0kOGoQBZdk1ACUBInE0obv1/o/jp+\nWz8E0hAdP7o+n6vokyQBnReimBclsxG5xoM3YpN21rKp2CZcGZMRzJOYtMC2QSi8YmxrvYhrz8l3\nY14svc/T5xAy0NAyxu8XG2aa61pHYt8gPtpICCKOEyX1/hb9PpgG37WWwbtuCIXGXKDAFsFm34jD\nC+URLWST5p/0+jaEMznBpECBAgWmEZRQyDyi/KKCSYEzEf3YJvvJ8uvtT2LtmVl6UsL1BXwuYRoE\ntslAu/p7XMALMu0MRnvafaE+ABKz8YCAY5mrVOqe/lyi5SlnSsmkMGhcm+NCwvE4JADbZD3teh85\ntD17Y8cAQCzFu/cY9f62Wcrk2HTUwsY8OGiQku3xwt68ndAPKVD+GFkp1TLVSachIgJZw/UlXN+H\nxQgsg4JLCS/SLiTg+gKUAIwSCIFQIEe3gYynS4c2WATOwaAqiM8l2h6PCc2Gw0EJYBsUlBK4voi1\nt1wOgo6A7t5HEaSLUyL7yh9UDwokVlrJS2tP6DIwCMablk3yvKX5zVOBien06iINKhtMahEFpgr5\nIWvZAklKiabDY0I5CjfQYL2UdiWgZY9Q7gYhMvHmllACtunyRE1WSKDtCbQ9kdgugUBgp8+vBXQW\nDEbA9ANkglLIpOr+ZhMIlxuEKP+RRx7BoUOHAADPPvss3vjGN+KGG27AbbfdBiEUZ8R9992Ha665\nBtdeey2++93vbtp+TNzYQieUU1+gwEBIiV3WGPYNsB8B1peQm7BaqMPjJpVgslHBfNddd+EDH/gA\nHMcBANx+++246aab8OUvfxlSSjzwwANYWlrC3XffjXvvvRf//M//jDvuuAOu627KfkxcMBcoUKDA\nqEAo6evTjQMHDuDTn/50+P1nP/sZLr30UgDAlVdeie9///t49NFH8dKXvhSWZWFmZgYHDhzAE088\nsSn7UQjmAgW2GDbfLzP8DJMi1h9UY7766qthGB2Xm6KHVdtVq1Wsr6+jXq9jZmYm3KZaraJer2/K\nfkw0KkPz33oF5WeBANrOnHTzSESrTCelQudLA0VXLDP7S5k+vpQEEsn9oatm582f1d6XhxSp1hSp\n63en7GN/gyOzv85ITF2DBLzAHzDOdGyFfoqt5i8oWn6q0WhgdnYWtVoNjUYj9ntUUI8SE9OYuVBp\n2YVQ3voYvPSQDISdKtHk+AItT8AXnd/V+Kq95XKst304vuhpF1LCzSBe0dv4XIalnKL9VXidRL3N\n0fZErNyTbm+5HCfW2jhVd+H6XIXKSRnuh8/VgyMtAkFHZZiMJAorSgDLyL4l04iB9BqFUA5GtZZ4\nyars86S3R+ST3l+id7zu774A2n4QfTUmDXpUVbIvueQSPPzwwwCABx98EC9/+cvx4he/GD/+8Y/h\nOA7W19fx1FNP4aKLLtqU/ZiIxlxoydsDw95sQgACEl5X6JjHVTgbowAlBE4grDVcX8D1BSxGYRoE\nXkYkRVLatq4UQghAoPq6fmcrX0j4LgejBAZV0RxN1w/31/EFltZdmIxgR8UKQ+T0CISoqAgt6CgB\nDCMeJ20yEj5wCAFMxsAyYsp0U3ccs9qf3jBCHYPNKAmc61nxzGnHLvyf3rOc7ZLhC/UwMcahOY8o\njvnmm2/GrbfeijvuuAMHDx7E1VdfDcYYDh06hBtuuAFSSrzzne+EbdujWHUPigSTAhODkEpLToPH\nJXye3u5yAY9np0Rnh9cBrQwNgQuJhuOnhqd5gcC2jOSwIkKICl1LEbiEEJgGgUGzpUlacosmdMoK\nn+NCBokr6dvkIc20s7FBhuveL/oKEUxp37dvH+677z4AwPnnn4977rmnZ5trr70W11577dDrzEMh\nmAsUKLBtQCnys1m2QMhDIZgLpCIvCyzLUddPO4DcLLasdq0tqnjZZGedzwUYTbYrRm2og2qE+cxv\nEkSkp0YrcwZStWptihnmGJ5JGEZjniZMRDDrF7fiYpo+JNkLuwW0dqJ1fpcxngfNMxG2Q4KxDpeE\nclKpRmVrBXzZ2b7TryOwuOjYcLWjTduVCQDT6HBRyMBE0g54KAiU080yaNjuCwnXExG7sAQlnf4S\ngAjMADp6iEcOjsEIapYRUmpqZ5iGCPZRmxkYVengen9E8NDQlhpGBWyDwghIi6O2ccVpHDxgEBfS\nlACUkU5aeGQNykaeL4S66T2T2vojIE3HeFOy8zYax0qGw2QEc8CVIaRyDBQCejqQ58ThQoIn8BNL\niSDNOZnHQSIgbkdvKrPykgOmVMLKixVQ6NhGGVXCqt3lCNTju76Ah4CcSMTXKAG0fYG2L2AGgjZp\nH3gQYdG1QhCiKnHQwNZasVnEbkug/5aQ4FLC93uPkY4qYURpz912YS4kmi4HJQJliyUqdTx8mAEE\nvfNr0jT1FkHC45uGTpMeQ3YI+hOcjfo4JY+R3G7QMVcwQT9p6NMvmSdmyggvdqJC5/xCOk89uOgV\nON3IdLYh/ZYghOgg49R29SBPn0EEQjkLKgpiQLNFIJTNlFIchBAILjKPgUiS/bExgKwjpRXCpF3Q\n+xXyZGQgsZlojTxj/j6tBAQBD864ZWAfcllOv1yevI2ZkMBgX5SaKrAFsAXu6RFg+L0cf2KJAk1J\nuY5CUoJpj9aduGAuUKBAgVGhEMwjxKTy6gt0YzgHz5mA4lLtD0Jqm/x45+0nKGMrXOITFcza+ZfH\nL1tgsxHJHEsMH+tksGVkPWfPEIzLZTStOJ7FpmILZGJCg059FlImFj8N07J9DoPR1G18IcPIh7Qx\nKCE969PtbZeD2qqddh0jbT8WQTZfMt8H4t61LgiRHcInEQi90JE6mJRJW0JUSRpGqHIJCN4hyR+b\n86+flOsiXC4ZUgJuUb1k4oiS9kQfjp0AsDgoISBUBqFZ8bbuSz0YORT4Pu+kXSsObgpKZLhtd1o1\niUZ4SGC15aHe9iGD/iWDwjRo2L7cdLHcclVEAgHmyiZmS2a4LtdXBPVSAgQctklV9EPQ7nMJh4tQ\nMJmMwI7wVmguDyGB1ZaPisUwWzbC+GTPF1ht+XCDTEaTEVRtFobg6f1WO5csGFhQdcQXQYghRY+A\nJ+iQ5SsnX68zs1/nZt6bal4ce+746FAvWGxcIXP5gjmfamrymIxgRiGUpwFCpsQtAyGDWGJ4GwBC\nZSicEyMEoELoumNr9bw6FVtH5fSsQSphWnd8NF3e07/pCQiXo+1z1N142jSXwHLTw0rLw2LFjvFY\n6P3TlUTKFoVICNlUfB0cBiUqJrlrg2ZQqaRkUnAhe6qieFxipeljpsRQCipBJKZVA0ECTLxdQkWg\nqHqEvfHLej8hO4UmNqsaeIaC3zeEHI9g3ib5JdNhYy4wGQxj21evjPkDZBdMzTaNSCAsZprWf83x\nM+d2fZEpsHyeHT6XV2aqncPGJRLMMlEQkl0wFUCiUO4dZwtImzGAUpJ7PMeW7TIECsFcoECBbYM0\n2373NtOOgQSz53l4//vfjyNHjsB1XbztbW/DH/7hH456bWcs8rKrRjFGX4TsGRBSVYImQJjq3D1+\nPG27t/9q04PHJeYrZk/ShpSK2c3xlDOPJox/uu3iWMPBvG2g1MXwplOaVxwXFdOARXvX6HCOUy0f\nVcvAjGX0tOu0aUJILOW8XxCibM1ZoIFpKOts+FzCYCmmkCGFTPd1sNU17zPalPGtb30L8/Pz+MQn\nPoGVlRX86Z/+6YYEM4FyXAzq4d+uSJOV/TphsmRtlFs3g0lTzaP/TZhPCCWQo6T0LucwmeKCIFDm\ng242zw4PhsRK08Xpphc6BtdaHio2w86qDYMRrLU8nG54imcYAPeFchhSCkKApaaLZ1eb8IQAl0Dd\n9WEzip1lCyVGIAkBFyoDzwPgcBeMEMxYJmxG4XCB5bajnH0A1j0PJ5oEi2Ubs7YZOivDXdTRHLQj\noJMCIvQ+UgJULIaylV5lOMpjobIeO47Q+HlQsSoelyBEBg5C5STspF2nThOuM05on36hJEWEDCvI\nKFH3+zjQT1TGVnj4DCSYX/Oa1+Dqq68GoE4kYxsrc600CcCQRTq2Rj8K7LBOGN5HXGKSw0/D8Xgq\nf7F2lnVrtlG0PY4jKy0AXYICQMPhaDjNREECaIcfx89OroFLGXuoSwBtLnC03sZZVatX+4YiSVpx\nXDhchAI/OraQEsebbbhcoGaZievX9maTIfEgEQLYjGKmbATfe7fRESndoW7htlmhchLgXMK2k8P9\nYmuJD99ZrszWzjvbDp66rsHI+DMAz2iNuVqtAgDq9Tre8Y534KabbhpockIAgwFUAO60p+KcAcgS\nykC+IywPOpQsU7MP/+qFJwT8DGJ4AWSyqUnEGeJ6+kv0mES6kUYhqmEa2e2atCmdi6I/+2h+rG7G\n732cxmGFshHc2+PHaGr+TRoDU0YfPXoUb37zm/H6178ef/InfzLcKqb/OBUoAKC4VPvFpLRSHZWR\n95l2DKQxnzx5En/5l3+Jw4cP4xWveMWo11SgQIECA2G7mDIG0pjvvPNOrK2t4R//8R9x6NAhHDp0\nCO12e6AFSAn4BbPcCCAjn8HHGCpaQ2b3J+gn2yx9A0rIpvOqJHMydyByFiBlfsTL5u7DKK4DPc7g\nmBTVwqiqZE8aA2nMH/jAB/CBD3xgqImlVCeviMwY9kbtrfyBFB4FSpJvFh1apssw6UxkfQHrKsye\nL+BxqTLRIuPr/q0gQ69qG7GkCN1/te2i5fmwDdaVNKHsxnXXgysE5iyrKzxNtTucY85mqCeR5UuJ\nti/w/443cGDOxoxtxMo1CSFR9ziOrLmYLzHMlliio3Kp6WDONlE1jSAPIb6NyyUkRGL4HAHgcQGD\nk0QHn16n4rro5QsJx0lwfmqocyhDjaozhkzoI7vOU/KYyRhOeEko2gVKOnwZ48B20ZgnxpXhnOFa\n8kaFcVYccmJadeBFi96YhBAw0hEOMhCYvujwWAiu0ouNoOw9FxLrbT+W4eYLFbZlMABSpSdHq123\nPRe2QVGxGSCB59daWKo74RxtriqJlA0GQgjWHA/rrhdSMTa8FkqMYkfJgkkp1l0Ppx0PXEpQSjBr\nM/hCoulxVanaEzjd9MMQvZV2ExWT4vwdJSyUDay0fTy74qAR7MNyy4fFCPbOmFgox+OXuZRYbrtY\ncVzMWSZmLLNHAHuRY6RDBK1IaSsuAC7UQ84M4o8pQYw3Q0iAyA7XBSHxatid8lZqToOmxYur85x8\n/sNvQEIESG8M8+hDyYRUAtqkqgrNZuOMDpcbFoWS3D+yrqH+hHuSRqYEdNPhqefCFxIrTS81xE6V\nQvJTY6IdX+BE3cFKy02cwxMSzbaLtp+8hjYXeL7eSuXNNQLB/tTJZmL/pifwsxPNmLCLwuUSz664\nmLVZYhKIkMBpx0PJYLBSwkF9IVEhgG2yxDm40A+4lGKw0FwZvWvUsdKUSZiUgNLBpFpWDHxUQG+2\nQ2xc93whmAsUKDASQZCZIDIGm+hWEFT9gpD8qAuxBfZ3DC8XBSaFXCfUCMbPyyIbpl1vM8n2PMhx\nzFG8YvYNbWPO+0w7JlMlexKTblFkv4rGt9EQAU+Folrkivs4okVIKcNkj+Q5ZWhHppSAR7iUo/2d\nIGWThRd859X4dNvFkbUWuJQoMQqbsVh70+c41fLgC4myQVE2O3wYUkqsORzPrThouAK7ayb2zsb5\nNJYbHh49soZjay7myiYWajbMCH9ys+3j18fXceJ0C4vzJZy3dxa1cm9G32Mn2pixKPbOWqhFUqgp\nAWYtE2aGCcFkihLU8UXALx3XPg1GYDASCu+4w1Mlq1gGCTmWu+UvgdKcJJRZJM0sk4VpEULjWkY/\ndvKkZs/zcMstt+DIkSOglOIjH/kIDMPALbfcAkIILrzwQtx2220Dm5Q2iskIZgLY7MyOyoheHP2m\nY0f7RSMWNLjoCGQNzX1MiLLLciFTM/g08RAP5wp4gAOB6PkCLS/u6AOCEDMJAAKnWy6ON50Yh3Gb\nC7S5gEWVY2zZ8SGEDO3HLV+g6QuUmHIUHVl10fY7D4OlhocTDQ+7KgZMCjxxrI7lphc6xtZaHtZa\nHmolAzajOHqygeV1Jzw6S6ttnFx1sGPGwsGzZzFbsUL7rgSw7go0TrVRMigOzNvYVyuhaiVHZQDK\nCWdF7MYqAkGAQAnjksFgm71p01pAR3lFOpWtZaxgAe05z7rCdn8CunOddPYh6TrbbMFNoFLYpz0q\n43vf+x5838e9996Lhx56CJ/61KfgeR5uuukmXHbZZTh8+DAeeOABXHXVVZuz8C5MzMZMSIcvw+OY\n+uKIm4ms8Kg+eofcBm4G6YiU6BGo3XB5UshVRwi0/V6hHMXJpovjjXaP5qe/r7scDU+ktq+2BY6s\n9joLtbA6tubi2ZON9PFbHv7nRKMn61g9NySW1xxcfC4L26LbaPL9vdUSaglMcxolkwbOwmRnnsUo\nbLM3ekJDV0bpbVfnUQvoYey+HeHU7VCMLHSbCWQNRfCUPWlS+/nnnw/OOYQQqNfrMAwDP/3pT3Hp\npZcCAK688ko89NBD218waxCicurdMzx8bniM4A7ITf7Ibu8mB0ocvltqRsADbTDtLYrL7IdYksDt\nbmc5ksLM4cJI06I1hg85IyPSYrM8iqMYPxvjjF2OgvSRcp1URbtSqeDIkSP4oz/6I5w+fRp33nkn\nfvSjH4XnslqtYn19fVPWnISJC+YCBQoUGBUo8h8ISVbiL3zhC3jVq16Fd7/73Th69Cje8pa3wPO8\nsL3RaGB2dnZDa3nooYfw+c9/Hq7rhr998Ytf7KvvdAjmM9TOvHGM4R10szHhc11cauPBpCJJBg1f\nnJ2dhWkq5/Dc3Bx838cll1yChx9+GJdddhkefPBBXH755Rtay+233473v//92LNnz4b6ARMWzFIW\nfMz9QkoZvMYn8+R22lNH6Gt8IZLHF1IlS7Qz5rczUrt0yBgXMvV1X1WIVtslVusIMhVTiamlBGME\ngiebVAxGUG95mK/ZiWukBDjZ9FA2k9O1AVVNhCZUptbwuEQp5RgBHXt52nncLvAlIPnW4WO+8cYb\n8f73vx833HADPM/DO9/5TrzoRS/CrbfeijvuuAMHDx4MOej7xd69e/HKV75yQ300JpaSfSZHZAAI\nld9UQSplT3uUCwNQwksLPCFU1IU6tjHXV1gpJGkRinRHpVW3PVUpxDJoaIvVcvBk3cGphop0qFlG\n4MBCOPbJpoPjTUeF2RGEEQcyILV/9mQTP3l2FW1f4ODuCl5wVg0sSEUWUuL4ioOf/moF6y0Pi3Nl\nnLNYDatHcy6xVnfx+DPLOL3uYHbGxu7FChij4Rwi2EYIddwCfygk1HGxTIoXnDOHHTVLrTtyPFW6\nNLCraqApPPx6XWCxbKNsxAW0QQkYJQHXReccaLN5yaQoWwYkSHjAo0JAuwwdXwZjxR9ChHRs4CKh\nujiQbyOfJlnPJcD5eAnzSfAnb5tuVKtV/MM//EPP7/fcc8/Aa9m5cycOHz6MSy65JDzH1113XV99\nJ5aSfUYLZSCTED6vXQtTQuJCV3MuWFTF13p+bwREFI4n4PoyFmkhpKr8TIji0Gi6HMtNN/aAWHN8\nUBegFHC4wFLTjRHQ63O7vObgZN3Fo79Zi1U++cXRBn55rIEDO8uoWgyPH1lHvd2pdn18pYUTKy3M\nVy2ULYYm+mqHAAAgAElEQVSnj6xhvdGx062tO1hbdzBTs7Cwo4xW24cX7EOMB4IAZ82XsHdnFbvm\n7JiGqoVp1aKYLTHM2p04a4cL/KbegkUpzpurwKI0IG7qCl2DCvs0mSoj1R0ap+ch6CXY94WEL1SU\nhkEA1jU+YwRUSpUSLxXPcFJdxXB/hnY6bh64BIhU5PmbDf2QzdtmHNi3bx8ARZO8UUyHjbnAQMii\nVaSE5NpTGw5PHUNKYGndQTslPE5IYLnpopHB2Xp83cF/P7ua+BDmEvjl8Qa4xxPbJYATKy2srTlK\nC05AveGCJYaedYTU/zq4kCqwCAH2zlqpVU9cEdQaNNJNNCXTgG2ml+rQhVyz0C2Uo32zNORR1uXb\nLhg0KmOUOHbsGPbs2YM//uM/HniMQjAXKFBg22DQOOZR4vOf/zze97734fDhw7E3OELIFovKKLBh\nSKky57QtN6k9r39euxsULk26kKWUOLbmwJMSC9Xk4qVNN529DgB8X8DzOChL1no910Or3oRVLqXu\no+v4sOzkhJA8e6xao0DFoqlarS7UmnYzS2S39wMhJGgCw1yBjWNQ598o8b73vQ8AcPfdd2N5eRlH\njhzBueeeu6Fwu4lxZWTkGRQIkHSMpJTgoiuZIpKmq3ku0ug6pZRoexztoPotiY4TtK+0PRxvtMGF\nim5gBLAoAwvGf2a5iR/8agXrjg8JibmSgYvPrmGxZgEATqy7ePS5Naw0PTBGwaBI+PWzwPM4GnUH\njsOVo44Q2LYBM8iYa7dcLD2/jJXlepjBVpuvoTJTAaFU0VQiyNZremg2PZRLJqySAUoVSf25e6rY\nt6ua6gZiBGCE4HTTx+mmsjXPlQ1F0QlgxjKws2RBCImmyxWvBes4RU1GUTYV4b/PJQhURIgW0DRw\n5KXNr+3OgHKEQ0hVmDg8jykdk8baAvJ8bCnZfRRjzXMOjgr3338/7rrrLlxwwQV4+umn8fa3vx2v\nfe1r++o7Oa4MQ91YHj8zBXT3tdN9I4aeetUKIeICuRtCQqWUZhzMtsvR7EqxjK5jteXiyHobEvGI\nAC6BFudYWnfw4C+X0Q4qmWgsN308/PQqLEbgc4FWQoURk1F4XODUqSa84KRrB6eUEk7bR7PBcfr4\nMur1NkjwuyaCb6yuY31lHYt7d4EaRvhE0cfNcXw0Wx5efskiDuydhcqa7nX2aYGsbfB6lQ1XoOG6\nODBn4+COag8fBRcSLcFRNil2VO2eNxUJJaAZkShZ3RVa4jAC4d+dNu0Hx1ST6+dh2gUyQScDcFxr\nnQaNWeMrX/kKvvnNb8K2bTSbTbzlLW+ZbsGsQQMBzQXgnclkGbkgQYhX9iMsr8Zay0t31BGosko8\nQ1X7+dE61lNKz/hCaeKpmjqAdtuH7/FEbVBIiXbLRaPehhS9e8q5BDMYSEBa3z0NF4rs/byzZ5PN\nHsG/LEhA6HkTCf7dN1vONIFUbTPTbGEwmtlOSbr5CehfaEy7UB5niFwUNHjw5m0zDszPz8MwlIgt\nlUrTb8roxrRfZAUCjOA8kewsGFBCkB3kl40gPHxg5PUdxaU67PW+FW6XcWrJUUxDBZN3vetdIIRg\neXkZ11xzDX77t38bP//5z1EqlfoeYyoEc4ECBQqMAtMQx3z99df3/Pa6171uQ2NMXDBL2Sk4WWD7\nIy0mWSPNFNIvhr3n8mbva3VpKePRQYZY6LBvBeOAkADNOQybgWnQmDVV6DCYWGkpzZPh8q3PlaEz\n8fRn4wPkjS8D4nldikn2tEupHIRJ5ZpE2KYEX3e7DDLMLEYT2/UYBxbKQYZb7xqFEGjW22istyES\nnrSCc0jPgdtoQArRK1ikhGkaMC0VetedJECpMoFwX2UIdms9BlOJBb9ZakAkrF9vzhOOH6BsopQA\nK20vU+g5Pk/sr6ErjmeGI+YJ7W0ALgGHAz4fL6GRdv7lfaYdE+PKcLd4NEbWxdZdbWSj/VW7DLdz\nuYhpktHXNQmVWu1FylUzSmCyTtTDcsPFatMLHWYWI6jYRsh18fx6C79ebcILNjAoQVVXfpaK2OfZ\nlTYcX+KchQraLsdy3UHTVZVIVk838cwzS2g2Vdp0qWzhwLk7MTNXBqREY7WBpx9/FusrdbU+08TC\n3kWU52YBQiB8jrWVBlzHAzUYbFaC8H0I11fZbwZFZbYGu6zSqoUQ4R1GqSrftP/sWezeWQWlBMdW\nHFRshtkgfA5AWKaJQFVRIVDOQu2MO7ijggsWKrAYDR6EgMdFqJ1WbQOzZQMGpeG5i55CSoKHAyFh\nRRdGO44+ShAr8aXn0CBEHfdOe/q1sRUEi4YvlXC2xkSaPw0a8ygwMa6MrSyUxwElcJPD34QEuFAh\na0mv/jyIYz617qCdUDHE5RJu08ORegtrrtcT2uYLiVXHx1Ldw0qbx0LjAKBkMZy9UMGPHn0Ov/zV\nMpy2F2tvt1z8zxNHweCB+C4aa834+jwPS79+HkZlBZW5Obg9IXwEzDRh2BZKZRuGZfbcTJrt7uIX\n7MTcjN3T3nQ4mg7Hvh2lxCgIGRyn3903h8WqBSNSy40QEmjQFDVbpVxHIzX0UASReOWEm12/hVhm\nb6SGngOQAXkR7WoP1il7f9uKUPUnN38empPGrrcZBx5//HF89atfheM44W+33357X30nbmMukI48\nc2uePTZJKEfR8PzU+n8A0PJEj1COrc8XPUI5CqftQbZbGf05eFYIHyGwbFOxtSW2A7O1XqEc2wbZ\nGtKOshkTyj3zR5j2kkBzNDRCsgWB1qaz+hfoHwTjiazpB7fccgv+/M//fOvxMRcoUKDAKDENXBka\nu3btwhve8IaB+haCOQGdjLPB6BSj9uGk/roatZQIOYdjWWRSwueK2SxJoZVSwuPKyaR7RaeQUqLh\ncjicq1e7Lq1OSommz1VaMEmmYG26HA2Xo2POje9Do+XBBcOu3XNYWa7D72KZk9yHbDUhfE/xg5Iu\nrVQKyNY6Wq06jLkFULscayaEoFyxQQ2miO+7jK6EAPNzZTQcH7bJVCp11xorVjrrGwDsrJho+xxS\nSpQM1tPfZNlMZcqU0eFj7oayK+vWFK0/+DcvkKNAf5imzL9zzjkHn/3sZ3HxxReH19arXvWqvvpO\nRDBTAph0+rL9ogK585tmhooLpyQbYJInPtpf81xEha0fOtwAQJHKaxMFISQkZJdS2VU9LmPmBRmZ\nB1Ki7vo41XDDwqhCSvhSghECBqDpc5xsO2qOwCFlBGT2HhdouALH1z20/Y7gjxLDrzc9PHN0DSvr\nLiQhqM1WUKmV4bQdnFpah9tqAa11eK1WILQkJBegjEKAKm5h34HwXBBKIISE67TALBt0bidYuYJq\nrQy7UgIjBALKiSYh4Qc80bsWKti1SxHpcyHRcn20Adgmg2VQzJQMzJXN0AQRFZwEwGLVxMGFMkyq\n9srhAm0uUGIUtsFQMhiqNku1HRMCmJRGhAAJLwSd9l0yGQxGwvPY7TAkRJtZ4tcKsP0EtEqDH89c\n0+T88zwPzzzzDJ555pnwt6kWzIC62bRGOA0COi++VnM2dJ9U/TWvvwiI0dOgIwC60ZlPoOVk24yf\nO92En/BwAVSY2NFmW2naCXMYBPj1aRenW3GHY1Tw/+rYGp470ehJmSaUoFwpoVZu4PjzS6EWGA1b\nk1wAwgM8Nzxo4TGTEtxpg6yfxsKBs8EYVaxusTUooqOD5+0A6yphpYsFOB7HebsqMLvb9ToBvOzs\nGVS6nHm63eECO6oWalYyWx3QqWLSex2o7xYjKJk09pv6f2eymEBPwHbRng0SRKaMc1/60Jg328js\n+z4Mw8CHPvShgceYqCmDBE9SAsCdAuGchTyThg49S8OwUSiKvywbXs7DwRe9QjmKtp9czkjND7Qc\nP/UBJAH4jgPIZEYP9VyToZabBGYaoEhfA00hlA/nkMgkpZcAyl1CubvdTjBpxNaQo5ElVRqJIk8o\nZ7dsHRgEMLItSZsCRvOjMvqhgx0GN998Mz75yU/iNa95TXgtaD7mBx54oK8xBhLMQgh88IMfxC9+\n8QtYloW///u/x7nnnjvIUArb4Uo8AzCS0zTl53oqljcVixgOk9L486Jw9DabiU9+8pMAgO985zsD\njzFQ5t+3v/1tuK6Lr371q3j3u9+Nj33sYwMvoECBAgVGBdrnZ9ox0Bp//OMf44orrgAAvOQlL8Fj\njz028AI0J/O0Qzvx0jcYxSQ5C8hslpnxsFJKEGQQsEtV3TqP+Y1ktTOaoykR8Iy4aMk5EpK1I707\nTrPk9UEXF0/t7+cQs2TFdQPIZb5LSonv3SazeawpzJsFTyjKhXHvi3b+5X2mHQMJ5nq9jlqtFn5n\njMH3/YwevRAScPzpSc0eOMRGdpxPaVAXZ3Iigb6RuVCVRzTfRXe740twLhLbhZRYbalK1UL2tnMh\ncXTdwRNLLRxdd2N8GDo079mTTfzwiRN48jcr8Hwec8z5no+Tx07hf/7zx3j+508oW7LoPE0l5/Aa\nDTSOPg/ZXAeRPGYRJ5AgggPNFaC5CirjfBM0CKdzBcXSc8fhtRQnsz5c2uG2uFBByWJBCBq62oEX\nLFZw3g4bO8oszMoDOhzIi1UTri8T+UAIgBnbgG3Q1Adcp4pJcrv2Q+hzkCWgO+3TcPVvDryAC2ec\nAlol9GR/xiWXv/a1r8W+91vvDxjQxlyr1dBoNMLvQoiQELofCKlO2DRBPUnjMcjq92SbVfeF1h0n\nrLeRXdsw0uFJ0EIzqqSJ4F4lRAmmtsfRjoStyGBQQpSTba3lYbnp9hDcU6miQI7XHTxxsolWEBKy\n5nAcr3tYrBjYUWJ4/nQL//fxJZxad8O+zy81cNZCBft3lbG2vIof/t9HsHTsVNi+fuw4aou7sOvg\n+RDcx8n/eRLN5eXOGuurADNA7LJKv2+sAm4nA1DUTwPUAKnMQjITwq4CdgUgBJ7r4cRvTsCwDOw8\nayfKtTL2LFaxuLMac9qYQoILVa7qwsUKXnhWFVZQzXqmZGCxJnGqoVLKd1VMnDNrwwokqtaKGZGw\nDYYZ28DijA074q3S50bHmpesuNOQURlUjVGhkN0Zgvqc0oRInihkcC71Y2YLKHMbgoQS0CYdT8jc\nNDj//uVf/gXf+c538PDDD+M///M/AajqQk8++STe/OY39zXGQIL5ZS97Gb773e/ita99LX7605/i\noosuGmSYqURY0mmIcxdqTVlzSJmZ7sy5RN1JfwsRQuLp5UZ6O4BvP72c+GouJXCi4eNbDz+HRrt3\nDgng2HITP/0/D6N+6nTi+PWlk2icOA7JU56w3IdcWwaVXnIkh/AhuQ+282xw2XuwfdeHU6/j0pft\nB0tw71NKUDIN/OFFC4k3mkEJzpqx8IKF9NA3LoEXLNZ6wuuAIISQEaVBJ4yvH7Imy84064jcdOQE\naWwLjOu9YBr4mK+44gosLi5iZWUF1113nZqTUuzfv7/vMQYSzFdddRUeeughXH/99ZBS4n//7/89\nyDAFChQoMFJMQ+bf3NwcLrvsMlx22WU4depUSGLE05SYBAwkmCml+PCHPzxI1y2DYbOwdBZhmraW\n7yAaXsfI1Qxy2iUhiOfNdU9A1Tu7THGoEQJVzzrlgiQEhNLknPAAXEhkhcMKKcEydkTHjw6KvPNY\nYLpA+uDKSDuX//RP/4TvfOc78DwPb3zjG3HppZfilltuASEEF154IW677TblD+kTH/rQh/C9730P\nu3fvDq/De++9t6++k6mSPYlJ+0RSSjaQnIKd3L/LbhxES0QDzX0hw4rISf19IeF4nfgE2dXe9gVW\nmq5KppAqqy+6TcvnWG65OHeHBU9InKz7qEcyeFoux4nVFipVG6WKhXrdhRMxm/g+R3O9BcztQWVm\nEd7yEry10+HOE8NAdfdeWAs7AQm0l55H6/jRjlmDUJDaPGRlHhIEpLkMefoYwIM5KEXtnAOYOf8i\nEMOAU29i5eQKuObbIMDC4hz2n38Wjq+0ULENzFQtWBGTxkLFwHm7Slj3OEwuUDIozCh1J5Qt0ZES\nlHMYlCo+5uA8VCyGfXPl0O6cnHWpnhk8qH7dnTxiROyZIiHjUvM9d85d8hxTfUOMCOPaxX7C4ZLa\nH374Yfz3f/83vvKVr6DVauFzn/scbr/9dtx000247LLLcPjwYTzwwAO46qqr+l7LI488gm9/+9sb\nEuYakxHMBLAZ4ItMZWmsGDaEKcmRp6GUSgERcGWk9fe4gOtHhKy2d0M5/Bquj5WWp5xSAAhUuIFB\nCGTAk7HUcuFqgndCYDGCvbMmuJB45lQbT59oKNu12gCUEMzNlsCFxOrpBk4traPVcgO7JwFhBkqL\ne2Du3A2+ehpWpQxzbgcYpWEWYXXPPpR2nw1n6Tia9RZkeQYkQihPZnZBVhdAW6uo1mzU9p8Hxhhk\nQGxUnqnCrlbgtlpgVGLPvp0wGFUaOVTGYcvxUbIYXrBnBhecVYEZIZX3hITvcjAqUDUZbEZjAlQA\ncIOqKTtKFs5bqKBiGjHHLoEMnbVamEbHiAroKD+z3oaqQSACzahnjIQ4Pn2MtzPGXS1bh1TmbdON\n//iP/8BFF12Ev/mbv0G9Xsd73/te3HfffWGZqCuvvBIPPfTQhgTzueeeC8dxUC6X8zfuwsRSsgkB\nTAYYUlU4mLIgjQ1DyGz+ZCmRKpR1fye1xpZyJp5suCntSgAcqbdT+TYMRvDksTqaCeEwEkq7O3Wy\nHlYhiY4jQEAoQ3n3HjDTCH7rbZfVOUBY4f5E9w2EonTW2ZhdnAcIjb8FQPFt1OZrWFgo97xq6m0p\nAV64t5ro7JNQ0RbdQrl7mxfunoGRmDZNEomFumGZyeRG+jtLEOrBD4FA0HuzvQUygapaMu7nzqBR\nGadPn8bzzz+PO++8E7/5zW/wtre9LWYGq1arWF9f39Bajh49ile/+tVhVvTUmzKiIARgDNiAXfyM\nhPbuZ8ZL542Ro/bnsXF0kwf1jp83AgElNJWvQ9sHs6JZ1D4Mfrfncp7k9UeevZnkJtmcCRinlhyF\njmPO26Yb8/PzOHjwICzLwsGDB2HbNo4dOxa2NxoNzM7ObmgtOjV7EExcMBcoUKDAqDAoUf7v/M7v\n4Itf/CL+4i/+AidOnECr1cIrXvEKPPzww7jsssvw4IMP4vLLL9/QWr7xjW/0/Pa3f/u3ffWdDsE8\nJXbmbAynqY1qBZvZP789rcjT+Naw2Zj8Wd4eEBKZ0TSbhUHD5V796lfjRz/6Ef7sz/4MUkocPnwY\n+/btw6233oo77rgDBw8exNVXX72htezatQuAelP9+c9/nlg9Pg0TFcxSjskBGMnASzxpfTj29IZJ\nDhvFQxFNr+2eJDv1ttM/HQQSFiNwUw4WFxI2pWgFVUuS2nfP2Pj1civVJDI7W0Gr6apKz10Gc0YJ\nfF/ADDLgutspAUzLQDtwfPX0ZxS+60FCghLSY49nAWm+jmDp6U8AzxeQAqBGrz1f24YJya4ostr2\nsLNiJ7R2xsmCJ0Qqgb7GduFTHgZcApIrk8Y4irBqDJNg8t73vrfnt3vuuWfgtVx//fWx729961v7\n7juZKtnjEMgy+eYMIwWQJ4874U/R1GoV3RTv6Yt4tWrdHiT4BWKZgBL1e4eGQv3H8QUcX4TzdTz6\n2mko4XKB2ZIFjws0PR9eUG5JSGC55eGJkw2sOhwmI9hVYSiZNKw+stby8bOj6zhV92AwElZSUcdA\nQgqg1fZRrpWw/7xFrK00sLrSCoULpQTV2QrKFQuQgON4aLe88BhKKeF5qgZVbccMvLYL0XJCQSkB\n7DprHgu750AZhetyOG0/5lw5eM4sLjwwB9tkOF138eulehgySAD8zoF5XH3JHixUTKy5Pp5dbaLh\n+aEQXKzYeMFCDTO2iabn4+haC+uuHx7HuZKJgztrmCuZ6riJrnR5AAbr2Ie7I2woiVYlyZc0w8bB\nbwdo6oVxOgJJ8Cdvm3EgWrlkaWkJzz//fN99JyOYsfla8rCvzPqto3s7JYg6iQfdHBVhH5nMlQEo\n/gSfSzi+gOv38pVpHg0hg9qAkTaTUcwxCy7n+NFvVnG07qIeibTwuMTRdR8GBVqOh+OrDlZanRjl\nDsOWRLPlwfdFjPGNGQw7ds1idkcNK6frYJTCLlsdDZEApbIFu2RibaUJz/Uhow8lQmCVbZglCwYl\nKFVM7Ng5CxpxHNq2ActiKJsMCzMWzj97FpYZiVGesbGjZkFyiR0mwysP7sRc2Qzb52wTL949h7rr\no+75OGe2jIrZuZQrpoELds6g7XO0fB+7ayXU7E47IQSMdc4ho721/fQDjAAwDJoYydFPDlChPXfu\nd2MMx0GH5+VtMw4cPnw4/L9t27j55pv77jsdNuYpRK7glvHSSRvpr25wmSiUo/2zuDQMSvHkciu1\n3RfAk8cbqSF8hBDwLqEcBWMUc3OV1EQYJdxoTCh3t1dmyljYWUsN4atVLVy0fx4khYti54yFV5+3\nkMhlAQAzloE9M6VUs0LJYNgza6e2E0KC0kfp7WlcGaq9P+FcYHyYppp/d999N06fPo3nnnsO+/bt\nw8LCQt99twJndIECBQr0hTzKz35s0KPCv/3bv+H666/HnXfeieuuuw7f/OY3++5baMwpyLNBa2dT\nksakbbhSylRHkccFePCqnNSepY0DgMsFzqqZON3yEx2CQkrMlk00HA4vIbPF9wXW1towDAbLTr4M\nLMsA8QW8lEoGlm1ASolWszfxhQDYu1jD3FwZJ1Zaicdpz5yNhYqBlTZPPNYVk8LlytmW5NDUyQTp\nbwX6/KTzZeS1d7bpNUl0V1Uv+DQmj2kgMdL4whe+gK9//euoVquo1+t4y1vegte//vV99Z0YV4au\nkL2ZcwwzPKWdG7LbVqzbiSRhGm6UXzmWVs0lDEpCcnfXF6g7foyOk0gZFvlU1bRF6rFp+xzHG23U\nXR/7522cM2dhrc3xm1UnKKaq7NK+kFiYKWFHTcLxOE6tO3ACIbt8so5Ty80wYcM0GWozJVi2osi0\nLQbTYiE9qRAS63UHbmDLZowo27NloFbrpHM3G8rhd/6+HXjJJXtgm2qMC/bO4tnj6zi63IKQEhfs\nruKVFy2gWjJgUII9M8By08NS04eQwELZwAsWKqiaDC2fo+VzlAyKimmAEgKDElQsBoPR8DwL2YkE\noQSwDarsxMH56+Ys0Uhrj/Jg6CC6jhBOrkSunbmJ1bHPYBCMz66rEkzyTBnjWgtBtVoFoDjsbTs9\nGqgbE+PKsNgmR2eQju88rtUkbJsYwRHN4Eq6ETvtFOqmbLrJNmM/iKpouX6ikJdQJY+yUrallPjV\nagNNL65dUkIwXzYwW2L42bEGTrfixZkIIShZBs5eYPj5L5fwzHMrKrtOdgSJ63KsLDcwv1DBzl21\nePYdIaCMYG6uBMfx0W77YbibDNoZI9i5q4YD+3bgfx1cgMFoLEuQUoKDZ8/ion2zOLjDhmVQxYUR\ngBFgsWZhsWpi3rZgMtqTNtv2BRzfxYEdVdhGPO1a3/iUKH7ktLcUIVXETPpbinIcaWKj5AIJ/Vys\nwzHabRcQKNqFcYbLMYrUCjPRbcaB/fv342Mf+xhe/vKX47/+679w4MCBvvtO1Mas+TKsTV6Ffr1J\nvVdyX33ynQmaWCgNOvxq0GcQl7JHKEdBCcFKS2m0ac6254+vh+F33RASmAkcaSnuPAiuNMckbV6C\nYOdcCbZlJKZuE0IwWzJQDjTdJFiMwTZ6hbKGwSgsI50LQznzsp0/aUJZw6S0LwdS6vgJWvmZCEYA\n2xivUAYACtLXZxy4/fbbsX//fnz/+9/H/v378ZGPfKTvvtPh/Cuu4zFhuFe8kQicYccooiC2BMYt\nkDWiSljWZxz42c9+Bs45Dh8+jJ/85Cd48skn++47HYK5QIECBUYA7b/KLMY6prV8+MMfxh/8wR8A\nAG666SZ89KMf7bvvxKMypOwkc2z6RARIPy3R3L7UQXLa0zHsxUByk7aR6/HM0xSSTBxR9GVfzcuo\nyGjPNgYhcg43G4OfZ9W9yCrxxXgrUmsMSmK0GTBNM7Qr79+/f0OE+RMTzJqfOJWCeIQTac+7Oh0y\nuFhITzsS2jsVr5WNmJKu/oFj0GAEpiDJSSFShoU705JGtAMrqVkEWYCzpom65/Uwb+hokHNmLRxf\n9+B32bu1vP6dF+3Fz59cwmrdgYhkFKqQM4nVlRZMg4EZNOYApEHY2fysjVbLRz1Ix9ZynFG1rUFU\nNIMv488IfaRUtqOEbXRFLkDdwDXLwFzJRN1VRP7R57W2DbddjrKlsgS7TSvqGNNUez/Ra82w9XMu\nQAhFz3XSJzQr6ZktltXxdfgEiPL7eBiMay1nn3027rjjDrzkJS/Bo48+it27d/fdd2JcGc4m8y93\nBGp83si3hN+i26kGLmQstE0J5w7vRUeoE5RMBttQGX1uwGURghDYBoPFgkolgQRWr15B7TsAhpTg\nOhU7qGqy2vZVPC8hmDVNeFKixf1wbaeaPlqeACEEZ82YcHwZ9JGh0KMAFndU8PuXnovl1RaeeOok\nTpxqglCiUqzLJgghWF1zwBhBtWLBtCgICMo2Q8lSoWqzVRsLvsDqWhurDUV4dHBPFS84exZ2kFYt\npDoGbV/t34xNMV82YDICX0r4noRFiXLkAdhZsXDufBVVywj7r7Y8LDddcClRMijmShbsoLRU21Ox\nzQZDGD5XtRlMRsIQQC5UyrsIHhJW4FTU7VIqQiJ9ikxGetKuleIbf7zoLMDuGObgFBeOvy6oyi+A\n2Ue0xCgwKFH+ZuD222/HV77yFXzve9/DBRdcgL/+67/uu+/EuDI2fY6MSfp5I/d4eiyxjlumCRoV\nISQQUDyxIgkhBJbBQImAx3vDqgghMAiBEBxH1xz4XYslhMAiBAYMPHa6EXto6PaSSVAyLRxdddRL\nedccC3NlvPJl+/Gf/+8oHF/0tHMusbbu4MDeGsols6fdNCh2LVRw8YE5LFQtmF3kBJSoh9RsCahE\nyiToaCwAAB8sSURBVDBF4QqJeZPh/9s9h7LJevrvqFiYtQ20fAEj4RWQC/XgOmvO7knZ1hVbGCXg\nsjcSQ0VdADZlkCnxzXH0kt/rMZJilwv0Ylw+W4J8x9m4zpRt27jxxhsH6jtxG/N2RT8hdlmbEEIS\nCZKi7d1CeaNrMAyaSiMKIEx6SYNp0B6h3N0/SztRNQnT+xNCEoVyFHnj5xbmzDkPapystkIgTxOm\niStjGBSCuUCBAtsGBPka8fSL5S0omJOUyKQHoP6te3vZ5ezrfo0NX02RnDau2zWfMaO9tkXFkQGU\nLQbXFz3RDkJIuD4HD+zV3a/aPhdYbjrpzHNSwhMCFy6UsdL2carldRU/lWh7IrQtJynFVYviqpfu\nxdJKG4/+agX1th9r37tQxgVnzYBLieWG26NZ76yaOLizDEYJ1hze49SsWQznz5VhMoKllotmF99G\n2WDYXbax3vZQthisriKqUsrg+KSkxBOgajN4QeXq7sSSLAefBiGdeNts89aQURoFxnb0pikqYxhM\nRDBTolKyPd6/7akfm3H0eGtqTQ0hZOLNKgIprc3FnbFImL4rgdDTHw3tk0BoTjAoYlcfIQSMACWT\nQkrFkeH4Ai6PC2pNVkQCh9VKy0Pd8VNI/hWPhhZxJqPYVbWws2LidMvDiYaLuivQdEX4sNDRHvoY\n1GyKWZuFTqzaWVUcWKzg6Ok2HnnmNGplCy/cPwcrQndZsRgcX+Bk3cVc2cBFuyuxDL1dTJlV1toc\nJYPhvLkSSkbHtnxOrQRfSCw1HQDAgbkKapYBEjz4mg5Hk3CUTSWgoxmSUVuujkKrlgyUzY6RQjmY\nlIBWa857lY0WI4hfJ9Friej/FBgK5hirmBQa85BQRDPqxswT0INz3mr7oUx15IVzhH/19idQKdFZ\nY3ApQdFrv9KChRCglcLSBihn45HVdvr6pISTEPCtte2dFQtPLLXAu94IojEFu2eMXpsuUVwX+3ZV\nMDdjw+OyR6MggTPvxefUMFcyeviJCVEkTefOm1goWT39KSGwGMGB2QpqttHTro992+Opdm1CCCgF\nFqpm+L0bXAIkJ4RY7368f+c6Ud9QCOQRQAvkcR5KdZ0UNuahoYhnVAmazUNcK9q0WTJOuH4ZTo2f\nDQTKMMTr3fHL3fOzPKcIsl/zLJZOGo9g/Kz+afSd4fx9rK+f7fKQ3j/fEVigP4wrPK4bFPlRGVsh\n3XnigrlAgQIFRoUiKmPqMA0OmmlYQ4ECk8ekSm5tFxvzRLV6nZY9vBlDZ/Flxf0OO0fOChIywaKg\nJNuYwlQW8MAXFYEih08jJCdAZtyzslWnO2kIVNWULORVXcnjwuiP63gEyJhHkeaPZxnbGb5UfBnj\nFtCh0zvzM941DYKBNOb19XW85z3vQb1eh+d5uOWWW/DSl750Q2NwEZy4PrZNt70mCcPkTCzNkZBG\n1KMFU7w5iORQ6XOgCU7EMPUbgOQSNOrwkJ2IjparUqqFTBZPNmM4d6GClZaH1ZYX2RN9DAhKjKqU\n5oR9IABesW8Wz687ePp0GyKYV4eblQwCAcATqqKKPjrB8wCzNsOBORsNV+LImgMnyHykweB7azYu\n2lkBpQQnmg5aPg/fDwhRlavPm6/CohSrbRdOpNAsIUF43GwJNiNYb/OYI5QE52e+YsIyKBxPxMLz\n9BwzJQOMkB6uEA0jYsNOag8viYQ7M5a6H/ylI3UKDAZfAD4Uh4oOK91sUEJyfSnbNlzu85//PC6/\n/HLceOONePrpp/Hud78b3/jGN/ruLyTgbZBRrjsuOU27SiMjikZHRAV0dxwzIx1SICnjMcA6BE4T\nGskuIauFMEdnnqbLw0rTJLhoZEBKBCiBpCMrGAgWazYWKhaWGw5W2n6433pfLBCYVHFo+IHgjEYy\nHJgvY99cCcfqLn5xsgGLEdgmDS9GIQGXqwiSiklRtRh2lMwwtG2+DMyVGNZdjhN1D7O2gYt2VlGJ\npE2fP2eg5XOcbDuwKMW58xVUzM6ltFgrweMC644HQgh2z9ioWJ32hRqDLwTWW6rE1lzZjFUlqdgU\nJalKYnEB1Eqsp2qJPgeAIpDqjubQbzDBMzU17TozDDP4awvcx1MNP3iSGmM4jtvFlDGQYL7xxhth\nWRYAgHO+oVpWwyItcSRl64T+/aTgkpAPI60dKZqvhuMJtFOePlpAp5kNlPZoYd1NjmdW4WkUJOXh\nRgnB2TM2lppOatkuAWDvjJ2YEk0Iwaxt4Pz5CmzGejtDacAvXJhByUxuNxnFntmyijdOOOAGpdhR\n7Q2ti+5DxTZgsfTwOUaQWrEkep4LwXrmQCtfedsk4dSpU7jmmmvwuc99DoZh4JZbbgEhBBdeeCFu\nu+22DdF2Dovcmb72ta/hda97Xezzq1/9CqVSCUtLS3jPe96Dd73rXeNYa4ECBQpkYtDSUp7n4fDh\nwyiVSgAUM9xNN92EL3/5y5BS4oEHHhjrfuRqzG94wxvwhje8oef3X/ziF3jXu96F9773vbj00ks3\nZXGTxLA+izxHlk45TiPhUWnd2URFRk77rG1gpZ2sdQNAyaCZqct52VrT/soYPQcbNWMU2JoYVGP+\n+Mc/juuvvx6f/exnAaiyUFquXXnllXjooYdw1VVXjXq5qRjIlPHLX/4Sf/d3f4dPfepT+K3f+q0N\n9x/FDZtl0ugc+Hj4Wj83ogi4kPPAKMCgCpNGHYqaQ1lXXJZQadx6CyElXI+Hzi1GCUomDbmApezw\nOe8oWeBSou76sYgIm1FUTCMkq6+7Plp+x5lWMihmbAO7qza4lHjyVAO/XmuFppk9NRsvPmsWtcDu\nu9x0cKrlhO22QbGrbMMOmOO4kDEuDEYJKhYL6Ta7E2coASq2EfZXtvr4MTUivLna5h/dwmSKr1lD\ndJP/k3QnTvdDUQb+AO2xLwTy+DG+lGz1J2+bKL7+9a9jYWEBV1xxRSiY1fWitqtWq1hfX9+cBadg\nIMH8yU9+Eq7rhjWsarUaPvOZz/TdnxDAZoM5ATtjBE49RCqUkHhbFL2k5nob5STSArn75k/uq2YG\nlLOQEiVY2i7vcRYSAIQqZ18jgeyHC/U7JcqJFY1I09zMc7YJIYG2zwOyn87FxYjSjGdsA21fcVVE\nHV0MBBcv1vDCXVWcaLjYM1NCyaAxOs1dVRs7qzZW2y5YYL+OCj3Fbaz4j23DgJFg9yUIHIq2EQrU\n8BwRlSqtH5PKLtw5hoSom0BCCVuTkVh/ANDLjd4wyec5OxQu2j8PhW16eIy7gskgURn3338/CCH4\nwQ9+gMcffxw333wzlpeXw/ZGo4HZ2dlNWW8aBhLMGxHCaSAkKtSGKDGlhR8ZNLlDCQnOReorfT/O\nQi5EqqONEALOZWpZKQARzTvZkUUhUTKSHW36AVAxjcS1asatgwvVRC1T96+aRsYxUBVYDJbm91bR\nH1ZX9ER8Hzpxpt19deREdxWRaH8g/lDsxqjioAuBPDwoFNXCuI/lIKaML33pS+H/Dx06hA9+8IP4\nxCc+gYcffhiXXXYZHnzwQVx++eWbsNp0TDxtnJCONjTkSKMYZFORv8LN3YehR88QiuEmOXfF8Dfq\n9J/nAuOLW+6GUtJyPn2Mc/PNN+PTn/40rrvuOnieh6uvvnqzlx7DNkrJLlCgwJmOQWzMUdx9993h\n/++5556RrWujmArBPB5nzKCmjtGuYEtjy+9AgXFBSCDZ8La5oCTf0TguR+QwmKgpQ2WhDe4A7A+d\natUykQhBhh77gWcIQtuyhjCoqsKcBG21TeO5iI6RtQYhZaadNS0dPTp+2gxB/ETmPnpcBgUJUrIy\n0XHAJbZLvU1a0vWokBfKuIlTnyHgEnB85T8a5/EkgT8l61Owy6VABgJ5U2+9yNUQ40HQebb6O1Qo\nFgEBI0GVkmhkBbRDSn3XTrqOAAF8rrIELUNV3/CF6LkYKSWYr1rwuEDT8VWF7GCCGdtAtaQI5H0u\nsN72VfXqYH0Vi6JiKYJ6X0jUWx5awdNMp497kUWbjMScaAZVjjtKSSxVWYMRVViVBVWjHY+H4wOq\nbb5ihuFvji/QdHh4nAhRXM2MKqIjFWFCe0pmxY68rtwStGtNh8SaZY+zL0i6TER3tZPe9vxwuS1w\nz24ZSCili0A5AsehqQ5rypgWTEYwY/PfivOe0iLh5g3D2wIGm6T6YTqSxPVVlEV0jE6aMIMXKSEV\nFU4mo5irWOCB8K5YLNZuMJWq7HNViirKcwEoITtftVDjAkdOtxMraXtBBMh8xewJfYsKLxZo8VHy\ne0IISpYB21TjWiaF3RUNUjIVd0XT5ZCyl4dCSFVKy6AEqmtvGrwKjYsI5A04DZPCGOPtnX2M/tZv\n/wKjhVZ2xiGYt4spYypszJNAttakw7dSTA9E6bLZNJ8EIuMCMBiFmRIaBqhY37KVbqVjlCQK5Si6\nhXIUhJCQ/CetvWRSGCllKHQ5qSwmUIl8gbdRodzP79E1DjJuga0LpVjlaczTjzNWMBcoUGD7YZA4\n5mnExOOYu6H5j0Me5AHRz8nJ2iSrTb++mxneOoMpjTNti6wilaHd2BeZ5POLMxZKZvIpLJkUNZul\nrjHJ/tsNIYPEm5Q1mIzG0qa7YRk002G5VRwxBbYOSJ+facdENGYdgRBNhEuTP4PaAaPbJo2tK4oQ\nIOYM0wI7aa7odowp26xlBDbdgBhe2VU7nW2DwvWVvVhIFXivhZWiD+2MGQrkSGo49yUIkTAjtmAa\nLHCubGK2bML1BU7VXTRdjorFsHvWRslkIABKphKwTceHy5UzTY+lTTLRNQC6aGowvwQ4l6BEhhSb\nyvYO6EvcNigcX8ANHJa2SWNmGIOp6il+hB8kTLtGdP97z18ht7c+KMmPOBrdXGcwUf6wIER5aQ0Z\nVDnYlHC5qMMpyR4c4euNFD1KS/ntjTTr9DcZYFAWarfdWqBlUBiMwA0Yw2PtwYNACom2l5wWrqJY\nJMqUBFmSJNodJZNh73wprFLdnfbMCFArGXB85ZCMr4+EayCQqfzGQgJUqreEpGNkGxQlk4bERN1j\nGDQe7hdzxqm9jH/fAjdPgWyMmycDQH8q8Ra4tCZqY9YCmpL8un/DnFzN2pY1+DDnShHwyFSng9aM\ns/g8BPIjVdIeGkCgKWQ4ExX5f7b5gmb0B9JJ6fX43Q+E7naFtGOgBf7kE4EKDA+DACnULpuKIlxu\nhOhH6EbZ4wpsZWwDdaZALiZ1r24X599UCOYCBQoUGAW2iSVj8lEZUgJ+jhmjv4FGMEbuBMNMkt13\ndBdL+jzDzhHNdkzdpshnLgDlN8phANg8bPWQDExQY5aB46+PYiG543S+qH+SXlWyUnmzx5fhPDKw\nE8dtvTIntK/jeGQkPSlEVQWhaHsi8YI2mbIh///tnVuIHEUXx/9VPTubfLuYQYhIXhRvLBLiLagv\niagsWRbEIIksRkK++BSEZNmwGtYk+hBjlqCPm6AQCbgPEqKQJ/EKARd8EPdBCVHjW4h+oxCSCZiZ\nna7vobr6NtWXmb7O7PnBbDJT3VWna3r+3V11zintUlDWZyttNXmnTwb/nyrH7bZ+hRZm2WdVp6W1\nYgIVDuUh1xFuLeRYOUfnJGhHlKX9hxhEBOS8EbcmAPOKttNF6+q2KTuF5cq47btL1oXJ+sv8dYTV\n798vKo9CZx1yo7ZPdIUAmD2RB71Qwifo0gJwDnslDztcG95JtSGDY8Xy0GibAkOGjAB0rw1oCoF2\nu3MVbwHYawAaHHZiJc7VyShDpE1TSPc2y31O5blQNii3PXcuDGb1YduUZTKcu3NCUi4jJT/njq9L\nZ/9Yf/rgN0IkQCUqG+LynMyaQRnKKCxXRhBugc7iR6sE2ox4zmqbwXbKR/rwdoK2cZabct77y4cM\nubwThADT3GpwxsAMWO53QfYLVA1vHgx7fyvcu2LFU+tsqBgyoZKuXNXPgMCQbblcV1qLIBD9Tm6j\nGgOizKWd/Bv0O6k4EW9Jo+KS55IY8C+BGECi3eX6QZlLK8wEQRDdQu5yCSiyX6LGmN3lDPpHMDne\nqrb3bqP2X3GNIfsDL9S4L4N83PePqjjjzqq80wqDMfynKvMzt1Z8q3tD5lAODSZhDMMVFpg/2uAM\nw1Z+aXcKU3e5DKsW2vT5jPVHekUiH/I6FUiYEyAnnJK51HQ/WRhPkL2h2fDk0rBF1rWBCuc2TSHz\nSvgOSI01MyHA/XkyABhMgFviLIQjyGpSTZYzW6BVMnl7spADlSqzc2wMGdzO1aFLT2qHbFvHYDAB\nzrh1MTHl+LLLRpl/mlth4aaV9Nx7DJ4+cgkyeWUQ8nzJ7yJNkX8J4ZY4CwG02tLNqhciI31VccQF\nIOwCYQsZNOOu1mSegAhduokxeFYVcZWAMSnQ6v/eA2G2h4PWzcdqv2I4E3H+XBgq1Jmr0HNNOWPA\nENPt70yYDjNuLcOlv0PWPR24yyHNIEFeBeQtyHa7dMecDoxJUYnKlRFdUSrmhDeR6TeqruO9tuG9\niw0qDzsr05iQjKyjD34URHLy9F12MyBOGcULM0EQRGoMiDKXQ5gpirck0DgDkQ5FRebTGHMKCCED\nOULiJKztnA2CHpV10X4dhSEEeWDExU46H0CsaEOkIYtBtQgIIW3sHMdW5Qgpj9l6wBg0sbpYEYBo\n55+POY43UD+cnoWFZHcjyKbpyA3nrjwMmnBoR6Adb4Q4osi5zNmsm79jVjkQPElocLmUlHQt85fJ\nsGeVr0NXhVoRJMhUzqyc0kx/PM6KLO46nLBw+U42zrncSumvvz6vQFsbQe/l0QkLv0gSqwa5+k0B\nCfO7bKfVamFubg5Xr15Fs9nEvn378MADD+DQoUNgjOHBBx/E22+/DZ5jGGthIdlhomy7rvl9hCEF\n3RHo4G+glzUDlXuYEmh59fV6UrjLdftXKwaEUImCBIYq3pWq3fk6BDpXiVauZ+p4laeDql9+bl2w\nhNc1za7F2j/oIqLC0Q2l5jFwi7Qu54juLplyaBOAlTtFyOT5WdPLUMaFCxdQq9Vw8uRJXL9+Hdu3\nb8fY2Bimp6fx1FNP4ejRo/jmm28wPj6epekeSpvJwAy4swRi5qpIMC7BmMzkZnB9kIZyHwvbf6jC\nMTxkaF3cGJM5LIJWBFEuP0ELtjLrYqH273RviyeIcVJ0Bh2ralfXPkEUhTr3o15uJiYmcODAAQDy\nN2EYBn755Rc8+eSTAICtW7diaWkp1+NIJMxXrlzBE088gdu3b6dlD0EQRM+wmC83IyMjGB0dRaPR\nwP79+zE9Pe2ZKxkZGcHNmzdzOwYggTA3Gg3Mz8+jWq2maY9NknuwpMna5WO6KDTpexo20H0ssero\nRZkBXLt2Dbt378aLL76IF154wTOefOvWLdxxxx3Z2+6iJ2EWQuDIkSOYmZnB2rVru94/jqsht/K3\nagLtXJ/7wp9jClnQY43aX+WvaJsCK21TWyeDHGrQzQAHfR4Hdy5k+2X2JtBquMQ/nMIZULFSggYN\nezifkS8jkZz8EuU7yfKDX959/v77b+zduxezs7PYsWMHAODhhx/GDz/8AAC4ePEiNm/enM8BWERO\n/p07dw5nz571fLZhwwZMTk5ibGysp0YZA4YrsBLkdP703WOWHI4ngn8STCEn+mIKsvqPs7dVh35C\nD1D5L4RnTLjDRl87nkuP8CUZ8pdDwDSD21dj6hzxXNH89TMmwARzlfn7UHPhid2OVYM/FwbdrhOQ\nuVyC5kqyIM5Nn7/89OnTuHHjBhYWFrCwsAAAeOutt3Ds2DF88MEHuO+++7Bt27YszA0kUph37tyJ\nnTt3ej4bHx/H+fPncf78edTrdezduxeLi4tdN84tgW6bQCsgWYYjhMH1KDe0MIJyOCgvg7A8F9LW\n4Eku5/MATxHbYyLIk8SaYEth6CTsGBEo7E55rwMgJMSEm9xd5BQ9KPPhw4dx+PDhjs0++eST1Mzq\nlp7c5b766iv7/8899xzOnDmTyIjB+VF3e63Om7LbRwwKed4lu6HIP4IgiLIR54JQfl1OLszffvtt\nYiP6ZsV7ipggiFiYAuAF/Fzi+PD3w0+4sDtmtVjnSsiip2m3FzTGKoQcQ26HXCGEEJlPLTOE90Ua\n14WgOjxRfPYfgugNFY5dYXrvqqygoYwEyNUw0hVkletC1e9GN/HXuQ2DwWGvRuLe1+2NEaTdqvqw\nu/+wSUrGGCoVZrvL+YUyePLSW0d4ufd9kC3C/tMfdxdEeVkRwEpbLoqRh8sc3TEnQCCbu2Svd4T/\ns3j7MwDcYFbkT+f+fgHW+Vl3U+7fhjGGisFgutbhS1uQCSJvzOwfOAH05i5XRgZy8i+N3A3R+TCi\n9k9aHu8YSJQJwkE9XUZtU3YGUpgJglitDMY9c98Jc9xVsdNsq3NsVsC0AmI4jzN+ra83qNz9edSY\nNUEQDnHSIRSxFmG3FCLMDDJUMyjaT0eYQPWSmD3OZF1n28JO2q+Q+aEFZM4TvQHdpCjtDJnunND0\nhJYHpEeN41kR1Qck/EQaGEy+coH8mHuHWV8UZ1a+jAiBju3n3ENEcVyBNk0ROGGpEvhzlv6ySn6B\ntgXZ3sA5ZGuBk8R9QIJMpEERYdnkLpcCSqAZgGYXd8/BFaZQRwBR14Y4kw5JcNYUDG4kafskyERa\nVBhQMQpoeDCGmEsyxtwHHZUH0d1AHUX0B0Vd5AdEl0sizARBEClAASYpoXIyl52ocGkgech070k3\nCaJctEz5W8jbAyLOGpT9sEZlYcKs8mREpEEGEO02loS49cbxYEjj+6YJOGJQaLbljUYlx2T5NJSR\nANPKldENYcLYyxferdBz69IvrNVIPH7McK7CcVzP4rro9eJhQRBlQkDePQ/xfFzmaCijIHJ1vdG0\n5eTTiL+PbptY4gzSZWIwyCuzL7nLEQRBlA0KMCEIgigXlMQoAf3QMWWgH8bCCCIO+UVk01BGzzAG\nDBvSK6OtGXwasibUTCETbfupWG44amLBj4rNF9CvkGIw2EnxW2bneK/hilpqaRL6cyvUFNB7ljAA\nQ4b8V3eM3ZS3hb6PKhzgCO4jdx/02kcV1Uc99EEafVTh4X2Qy3mSYR8l7YOy9FGcPsjLbY4m/xLC\nmDwpK0LmmWiLTrcaDsAQjmudzu1G5dtYMR3BDSpXJ4m73ODSw6Jlun4orvLhirM/0HmSVQ0p7Oqk\n9ZerYwwqr3JnfzOgD7rpo577wPIn95czXx/YYuDrg7T6yBTyvbtc9UFYHxkhfeTvgyR9pOuDNPoo\n6jyJ0wddnSeWl0Q3fWALeI/nSR4wkLtcKjDr7jTIEJVPw+DZlAPS5W04rJzJH1YQ6iKTZXmWfQTI\nYxwOORui+mC19FGSPsijj7L+LSkBDiLqGDNnQJS5cGEmCIJIC6nL4crbB7pMwkwQxODQa6J80zTx\nzjvv4PLly6hWqzh27BjuueeebIyMQciDG0EQRJ/BYr58fP3112g2m/j0009x8OBBnDhxIjeTdWRy\nx9xuy3jrP//8M4vqCYIYIJROKN1Iwv/++gtRgxVyGy8//vgjtmzZAgB49NFH8fPPPye2JQmZCHO9\nXgcA7Nq1K4vqCYIYQOr1es/DB6Ojo1i3bh3+uzue5qxbtw6jo6P2+0aj4XlvGAZWVlZQqRQz2ptJ\nqxs3bsTi4iLWr18PwyhyipYgiLLTbrdRr9excePGnuuo1Wr48ssv0Wg0Ym0/OjqKWq3meX/r1i37\nvWmahYkykJEwr1mzBps3b86iaoIgBpA0JtpqtZpHbLvh8ccfx3fffYfJyUksLy/joYceSmxPEpgQ\nWWU6JgiC6A+UV8avv/4KIQSOHz+O+++/vzB7ChPmK1eu4OWXX8bS0hKGh4eLMCF3bt68idnZWTQa\nDbRaLRw6dAiPPfZY0WZlStnckPKk1Wphbm4OV69eRbPZxL59+/D8888XbVbu/PPPP3jppZdw5syZ\nQsWunyhkEKXRaGB+fh7VarWI5gvj448/xtNPP409e/bgjz/+wMGDB/H5558XbVamuN2QlpeXceLE\nCZw6dapos3LhwoULqNVqOHnyJK5fv47t27evOmFutVo4evQo1qxZU7QpfUXufsxCCBw5cgQzMzNY\nu3Zt3s0Xyp49ezA1NQVATnishieFsrkh5cnExAQOHDgAQJ73q3EifH5+HlNTU7jrrruKNqWvyPSO\n+dy5czh79qznsw0bNmBychJjY2NZNl04umM/fvw4Nm3ahHq9jtnZWczNzRVkXX6UzQ0pT0ZGRgDI\nPti/fz+mp6cLtihfPvvsM9x5553YsmULPvzww6LN6StyH2MeHx/H3XffDQBYXl7Gpk2bsLi4mKcJ\nhXL58mXMzMzgjTfewDPPPFO0OZnz3nvv4ZFHHsHk5CQAYOvWrbh48WLBVuXHtWvX8Prrr+OVV17B\njh07ijYnV3bt2mWvWn3p0iXce++9OHXqFNavX1+0aeVHFMizzz4r/v333yJNyJXffvtNbNu2TVy6\ndKloU3Ljiy++EG+++aYQQoiffvpJvPbaawVblB/1el1MTEyIpaWlok0pnFdffVX8/vvvRZvRNwz+\n82SJeP/999FsNvHuu+8CkE7tgz4RNj4+ju+//x5TU1O2G9Jq4fTp07hx4wYWFhawsLAAAPjoo49o\nIoyIhPyYCYIgSgZllyMIgigZJMwEQRAlg4SZIAiiZJAwEwRBlAwSZoIgiJJBwkwQBFEySJgJgiBK\nBgkzQRBEyfg/zNA9dkHwqhAAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.hexbin(x, y, gridsize=30, cmap='Blues')\n", "cb = plt.colorbar(label='count in bin')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "``plt.hexbin`` has a number of interesting options, including the ability to specify weights for each point, and to change the output in each bin to any NumPy aggregate (mean of weights, standard deviation of weights, etc.)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Kernel density estimation\n", "\n", "Another common method of evaluating densities in multiple dimensions is *kernel density estimation* (KDE).\n", "This will be discussed more fully in [In-Depth: Kernel Density Estimation](05.13-Kernel-Density-Estimation.ipynb), but for now we'll simply mention that KDE can be thought of as a way to \"smear out\" the points in space and add up the result to obtain a smooth function.\n", "One extremely quick and simple KDE implementation exists in the ``scipy.stats`` package.\n", "Here is a quick example of using the KDE on this data:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\ngg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from scipy.stats import gaussian_kde\n", "\n", "# fit an array of size [Ndim, Nsamples]\n", "data = np.vstack([x, y])\n", "kde = gaussian_kde(data)\n", "\n", "# evaluate on a regular grid\n", "xgrid = np.linspace(-3.5, 3.5, 40)\n", "ygrid = np.linspace(-6, 6, 40)\n", "Xgrid, Ygrid = np.meshgrid(xgrid, ygrid)\n", "Z = kde.evaluate(np.vstack([Xgrid.ravel(), Ygrid.ravel()]))\n", "\n", "# Plot the result as an image\n", "plt.imshow(Z.reshape(Xgrid.shape),\n", " origin='lower', aspect='auto',\n", " extent=[-3.5, 3.5, -6, 6],\n", " cmap='Blues')\n", "cb = plt.colorbar()\n", "cb.set_label(\"density\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "KDE has a smoothing length that effectively slides the knob between detail and smoothness (one example of the ubiquitous bias–variance trade-off).\n", "The literature on choosing an appropriate smoothing length is vast: ``gaussian_kde`` uses a rule-of-thumb to attempt to find a nearly optimal smoothing length for the input data.\n", "\n", "Other KDE implementations are available within the SciPy ecosystem, each with its own strengths and weaknesses; see, for example, ``sklearn.neighbors.KernelDensity`` and ``statsmodels.nonparametric.kernel_density.KDEMultivariate``.\n", "For visualizations based on KDE, using Matplotlib tends to be overly verbose.\n", "The Seaborn library, discussed in [Visualization With Seaborn](04.14-Visualization-With-Seaborn.ipynb), provides a much more terse API for creating KDE-based visualizations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [Density and Contour Plots](04.04-Density-and-Contour-Plots.ipynb) | [Contents](Index.ipynb) | [Customizing Plot Legends](04.06-Customizing-Legends.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.6.1" } }, "nbformat": 4, "nbformat_minor": 1 }