diff --git a/Applied-Plotting-Charting-And-Data-Representation-in-Python/week3/week3_Assignment.ipynb b/Applied-Plotting-Charting-And-Data-Representation-in-Python/week3/week3_Assignment.ipynb index 34205a0..8442664 100644 --- a/Applied-Plotting-Charting-And-Data-Representation-in-Python/week3/week3_Assignment.ipynb +++ b/Applied-Plotting-Charting-And-Data-Representation-in-Python/week3/week3_Assignment.ipynb @@ -49,16 +49,827 @@ }, { "cell_type": "code", - "execution_count": 57, - "metadata": { - "collapsed": false - }, + "execution_count": 151, + "metadata": {}, + "outputs": [], + "source": [ + "# Use the following data for this assignment:\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib\n", + "%matplotlib inline\n", + "%matplotlib notebook\n", + "\n", + "np.random.seed(12345)\n", + "\n", + "df = pd.DataFrame([np.random.normal(32000,200000,3650), \n", + " np.random.normal(43000,100000,3650), \n", + " np.random.normal(43500,140000,3650), \n", + " np.random.normal(48000,70000,3650)], \n", + " index=[1992,1993,1994,1995])\n", + "\n", + "# confidence_interval_1 = stats.norm.interval(0.95, loc=32000, scale=2000)\n", + "# confidence_interval_2 = stats.norm.interval(0.95, loc=43000, scale=1000)\n", + "# confidence_interval_3 = stats.norm.interval(0.95, loc=43500, scale=1400)\n", + "# confidence_interval_4 = stats.norm.interval(0.95, loc=48000, scale=700)\n", + "\n", + "#Get year average (year_avg), year standard devition (year_std), number of year (year_count) and standard error (yerr):\n", + "year_avg = df.mean(axis = 1)\n", + "year_std = df.std(axis = 1)\n", + "year_count = df.count(axis = 1)\n", + "yerr = year_std*1.96/np.sqrt(year_count)\n", + "\n", + "#Get the lower and upper bound error value in the plot coordinates:\n", + "lower_bound = year_avg - yerr\n", + "upper_bound = year_avg + yerr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Easiest option implementation:** Implement the bar coloring as described above - a color scale with only three colors, (e.g. blue, white, and red). Assume the user provides the y axis value of interest as a parameter or variable:" + ] + }, + { + "cell_type": "code", + "execution_count": 253, + "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEICAYAAAC0+DhzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFsxJREFUeJzt3X20XXV95/H3hwCCDxAeUpYSamhFOsG1REyBmdrKyAwE\nnBRmLWVwHEkdNEzFWa0zjkXrkhbFaqdKq1VLWrJ4sEqpjoItGiPCdOqIcKkKRQUiVQPyEAmCimiB\n7/xxftc55HeTe5Pc3HNv7vu11lln7+/+7b1/e+fkfs5+OOekqpAkadhuo+6AJGn2MRwkSR3DQZLU\nMRwkSR3DQZLUMRwkSR3DQfNGklcm+eyo+zEVSZYkqSS7j7ovmp8MB82oJN9K8uMkPxx6PGsm1l1V\nf1lVJ8zEupIcl+SuGVrXc5NcmWRjkk1J1iY5fLM2b0hyb5KHk6xJ8pShaW9PckuSx5L83lbWs6YF\n1nN24uZoljAcNAorqurpQ4/vbsvMGdhtsto2LnMuv0NfCFwFHA4cBNwAXDk+McmJwDnA8cCzgV8A\nfn9o/vXAm4C/3dIKkrwI+MXp7rhmL8NBs0aSY5P83yTfT/LVJMcNTbsuyflJvgA8AvzCFmr7Jrko\nyT1J7k7yjiQL2jJ+I8nfDy2zkpyd5A7gjlb7kyQb2jvsm5L86lb6+5Qkf5TkO0nuS/JnSfZO8jTg\n08CztnZ0lOSlSb7c1rVha+/at6aqbqiqi6pqU1X9M3ABcHiSA1qTlcBFVXVrVT0IvB34jaH5L6mq\nTwM/2MJ27g68H/iv29M/zU2Gg2aFJAczeOf6DmB/4I3Ax5MsGmr2KmAV8Azg21uoXQw8BjwHeAFw\nAvCaraz6VOAYYGkbvxE4svXhI8BfJ9lrC/O+C3hua/8c4GDgbVX1I+Ak4LuTHB39CDiDwTv/lwK/\nmeTUrfR1qn4NuLeqHmjjRwBfHZr+VeCgofCYzBuAv6uqm6ehb5ojDAeNwifb0cH3k3yy1f4TcHVV\nXV1VT1TVOmAMOHlovovbu9/H2jvkJ9UY/EE/GfjtqvpRVd3P4F306Vvpyx+0d9w/BqiqD1fVA20d\n7wGewuB0zZMkCYNQekOb/wfAOydZ15NU1XVVdUvb3puBjwIvnur8E0myGPgA8N+Gyk8HHhoaHx9+\nxhSWdwhwFvC2HemX5p65fJ5Vc9epVfW5zWrPBl6eZMVQbQ/g2qHxDRMsa7j27DbPPYO/3cDgDdBE\n8024zCRvBM4EngUUsA9w4ATzLQKeCtw0tK4AC7ayridJcgyDo4/nAXsyCKK/nur8EyxvEfBZ4INV\n9dGhST9ksB3jxocnPI20mT8GzquqhyZtqV2KRw6aLTYAl1XVwqHH06rqXUNtJvoK4eHaBuAnwIFD\ny9inqo7Yynp/Nn+7vvAm4DRgv6payOBddiaY73vAj4Ejhta1b1U9fSt93dxHGFxIPqSq9gX+bAvr\nmlSS/RgEw1VVdf5mk28Fnj80/nzgvqHTTltzPPA/251O97baF5P8x+3pp+YOw0GzxYeBFUlOTLIg\nyV7tdtDFU11AVd3D4A/ke5Lsk2S3JL+YZKqnap7B4HrFRmD3JG/jye+4h9f1BPDnwAVJfg4G103a\nnUEA9wEHJNl3kvVtqqpHkxwNbPEPbpLfS3LdFqbtA6wFvlBV50zQ5FLgzCRLkywE3srg2sz4/Hu0\n6yq7te3ea/wiPoNrKs9ncF3lyFZbAXxiK9ulXYDhoFmhqjYApwBvYfDHeQPwP9j21+gZDE7RfA14\nEPgY8MwpzrsW+AxwO4OL24+y9VNSv8PgNtDrkzwMfI52faKqvsHgGsKd7drKRJ/leB1wXpIfMDin\nf8VW1nUI8IUtTPv3wC8Dr86TPz/y860vnwH+kMEpuu+0bTt3aP4/Z3AU9Argd9vwq9q891fVveOP\n1v5749dotOuKP/YjzX5JvgIcP8VTQdIOMxwkSR1PK0mSOoaDJKljOEiSOnP2Q3AHHnhgLVmyZNTd\nkKQ546abbvpeVS2avOUcDoclS5YwNjY26m5I0pyR5NuTtxrwtJIkqWM4SJI6hoMkqWM4SJI6UwqH\nDH7395YkX0ky1mr7J1mX5I72vF+rJ8n7kqxPcnOSo4aWs7K1vyPJyqH6C9vy17d5t+ubKSVJ02Nb\njhz+dVUdWVXL2vg5wDVVdRhwTRuHwS9gHdYeq4APwSBMGHzZ1zHA0cC544HS2rx2aL7l271FkqQd\ntiOnlU4BLmnDlzD4ucXx+qU1cD2wMMkzgROBde1Xsx4E1gHL27R9qur6GnzR06VDy5IkjcBUw6GA\nz7YfXF/Vage1788HuBc4qA0fzJO/5viuVtta/a4J6p0kq5KMJRnbuHHjFLsuSdpWU/0Q3Iuq6u72\noybrknxjeGJVVZKd/vWuVbUaWA2wbNkyv05WknaSKR05VNXd7fl+Br8AdTRwXzslRHu+vzW/m8EP\nk4xb3Gpbqy+eoC5Js8pxxx3HcccdN+puzIhJwyHJ05I8Y3wYOAH4Rwa/fTt+x9FK4Mo2fBVwRrtr\n6VjgoXb6aS1wQpL92oXoE4C1bdrDSY5tdymdMbQsSdIITOW00kHAJ9rdpbsDH6mqzyS5EbgiyZkM\nfnbwtNb+auBkBj+f+AjwaoCq2pTk7cCNrd15VbWpDb+OwW/a7g18uj0kSSMyaThU1Z0MfmB88/oD\nwPET1As4ewvLWgOsmaA+BjxvCv2VJM0APyEtSeoYDpKkjuEgSeoYDpKkzpz9JThJ89Ntt501snU/\n8sjtI+/D4YdfOCPr8chBktQxHCRJHcNBktQxHCRJHcNBktQxHCRJHcNBktTxcw6SNEWXXbZi1F2Y\nMR45SJI6hoMkqWM4SJI6hoMkqWM4aE6ZTz/wLo2S4SBJ6hgOkqSO4SBJ6hgOkqSO4SDNI17Q11QZ\nDpKkjuEgSeoYDpKkjuEgSerM2a/sfuCBB7j44otH3Q3NsCOPPBLAf/vttCvsv0ceOWDUXRipL37x\n4hlZz5wNB43O7Q/cPrJ1//ixH4+8D8894LkjW7c0U1JVo+7Ddlm2bFmNjY2Nuhvz0lmfOmtk6/7U\nWz4FwIp3ju5HVy5cceHI1r2jxm9jve6660bajx1x222je/3NBocfvv2vvyQ3VdWyqbT1moMkqWM4\nSJI6hoMkqTPlcEiyIMmXk/xNGz80yZeSrE/yV0n2bPWntPH1bfqSoWW8udVvS3LiUH15q61Pcs70\nbZ4kaXtsy5HDbwFfHxp/N3BBVT0HeBA4s9XPBB5s9QtaO5IsBU4HjgCWAx9sgbMA+ABwErAUeEVr\nK0kakSmFQ5LFwEuBv2jjAV4CfKw1uQQ4tQ2f0sZp049v7U8BLq+qn1TVPwHrgaPbY31V3VlVPwUu\nb20lSSMy1SOHPwbeBDzRxg8Avl9Vj7Xxu4CD2/DBwAaANv2h1v5n9c3m2VK9k2RVkrEkYxs3bpxi\n1yVJ22rScEjy74D7q+qmGejPVlXV6qpaVlXLFi1aNOruSNIuayqfkP4V4NeTnAzsBewD/AmwMMnu\n7ehgMXB3a383cAhwV5LdgX2BB4bq44bn2VJd2uWcNcLPcN1+++j7cOHc/QzhvDLpkUNVvbmqFlfV\nEgYXlD9fVa8ErgVe1pqtBK5sw1e1cdr0z9fgY9hXAae3u5kOBQ4DbgBuBA5rdz/t2dZx1bRsnXY5\nK965YqSfjpbmix35bqXfAS5P8g7gy8BFrX4RcFmS9cAmBn/sqapbk1wBfA14DDi7qh4HSPJ6YC2w\nAFhTVbfuQL8kSTtom8Khqq4DrmvDdzK402jzNo8CL9/C/OcD509Qvxq4elv6MlftCt9tI2nX5yek\nJUkdw0GS1DEcJEkdw0GS1DEcJEkdw0GS1DEcJEkdw0GS1DEcJEkdw0GS1DEcJEkdw0GS1NmRb2WV\nNMesWHHdqLugOcIjB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSZ35+Qvqs\ns0a37ttvH30fLrxwdOuWNCd45CBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ6hgOkqSO4SBJ\n6kwaDkn2SnJDkq8muTXJ77f6oUm+lGR9kr9KsmerP6WNr2/Tlwwt682tfluSE4fqy1ttfZJzpn8z\nJUnbYipHDj8BXlJVzweOBJYnORZ4N3BBVT0HeBA4s7U/E3iw1S9o7UiyFDgdOAJYDnwwyYIkC4AP\nACcBS4FXtLaSpBGZNBxq4IdtdI/2KOAlwMda/RLg1DZ8ShunTT8+SVr98qr6SVX9E7AeOLo91lfV\nnVX1U+Dy1laSNCJTuubQ3uF/BbgfWAd8E/h+VT3WmtwFHNyGDwY2ALTpDwEHDNc3m2dLdUnSiEwp\nHKrq8ao6EljM4J3+L+3UXm1BklVJxpKMbdy4cRRdkKR5YZvuVqqq7wPXAv8SWJhk/Cu/FwN3t+G7\ngUMA2vR9gQeG65vNs6X6ROtfXVXLqmrZokWLtqXrkqRtMJW7lRYlWdiG9wb+LfB1BiHxstZsJXBl\nG76qjdOmf76qqtVPb3czHQocBtwA3Agc1u5+2pPBReurpmPjJEnbZyo/9vNM4JJ2V9FuwBVV9TdJ\nvgZcnuQdwJeBi1r7i4DLkqwHNjH4Y09V3ZrkCuBrwGPA2VX1OECS1wNrgQXAmqq6ddq2UJK0zSYN\nh6q6GXjBBPU7GVx/2Lz+KPDyLSzrfOD8CepXA1dPob+SpBngJ6QlSR3DQZLUMRwkSR3DQZLUmcrd\nSppG161YMeouSNKkPHKQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lS\nx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQ\nJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSZ9JwSHJIkmuTfC3JrUl+q9X3T7IuyR3teb9WT5L3JVmf\n5OYkRw0ta2Vrf0eSlUP1Fya5pc3zviTZGRsrSZqaqRw5PAb896paChwLnJ1kKXAOcE1VHQZc08YB\nTgIOa49VwIdgECbAucAxwNHAueOB0tq8dmi+5Tu+aZKk7TVpOFTVPVX1D234B8DXgYOBU4BLWrNL\ngFPb8CnApTVwPbAwyTOBE4F1VbWpqh4E1gHL27R9qur6qirg0qFlSZJGYJuuOSRZArwA+BJwUFXd\n0ybdCxzUhg8GNgzNdlerba1+1wT1ida/KslYkrGNGzduS9clSdtgyuGQ5OnAx4HfrqqHh6e1d/w1\nzX3rVNXqqlpWVcsWLVq0s1cnSfPWlMIhyR4MguEvq+p/tfJ97ZQQ7fn+Vr8bOGRo9sWttrX64gnq\nkqQRmcrdSgEuAr5eVe8dmnQVMH7H0UrgyqH6Ge2upWOBh9rpp7XACUn2axeiTwDWtmkPJzm2reuM\noWVJkkZg9ym0+RXgVcAtSb7Sam8B3gVckeRM4NvAaW3a1cDJwHrgEeDVAFW1KcnbgRtbu/OqalMb\nfh1wMbA38On2kCSNyKThUFV/D2zpcwfHT9C+gLO3sKw1wJoJ6mPA8ybriyRpZvgJaUlSx3CQJHUM\nB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lS\nx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSx3CQ\nJHUMB0lSx3CQJHUMB0lSx3CQJHUMB0lSZ9JwSLImyf1J/nGotn+SdUnuaM/7tXqSvC/J+iQ3Jzlq\naJ6Vrf0dSVYO1V+Y5JY2z/uSZLo3UpK0baZy5HAxsHyz2jnANVV1GHBNGwc4CTisPVYBH4JBmADn\nAscARwPnjgdKa/Paofk2X5ckaYZNGg5V9XfAps3KpwCXtOFLgFOH6pfWwPXAwiTPBE4E1lXVpqp6\nEFgHLG/T9qmq66uqgEuHliVJGpHtveZwUFXd04bvBQ5qwwcDG4ba3dVqW6vfNUF9QklWJRlLMrZx\n48bt7LokaTI7fEG6veOvaejLVNa1uqqWVdWyRYsWzcQqJWle2t5wuK+dEqI939/qdwOHDLVb3Gpb\nqy+eoC5JGqHtDYergPE7jlYCVw7Vz2h3LR0LPNROP60FTkiyX7sQfQKwtk17OMmx7S6lM4aWJUka\nkd0na5Dko8BxwIFJ7mJw19G7gCuSnAl8GzitNb8aOBlYDzwCvBqgqjYleTtwY2t3XlWNX+R+HYM7\novYGPt0ekqQRmjQcquoVW5h0/ARtCzh7C8tZA6yZoD4GPG+yfkiSZo6fkJYkdQwHSVLHcJAkdQwH\nSVLHcJAkdQwHSVLHcJAkdQwHSVLHcJAkdQwHSVLHcJAkdQwHSVLHcJAkdQwHSVLHcJAkdQwHSVLH\ncJAkdQwHSVLHcJAkdQwHSVLHcJAkdQwHSVLHcJAkdQwHSVLHcJAkdQwHSVLHcJAkdQwHSVLHcJAk\ndQwHSVLHcJAkdQwHSVLHcJAkdWZNOCRZnuS2JOuTnDPq/kjSfDYrwiHJAuADwEnAUuAVSZaOtleS\nNH/NinAAjgbWV9WdVfVT4HLglBH3SZLmrVTVqPtAkpcBy6vqNW38VcAxVfX6zdqtAla10cOB22a0\no9PnQOB7o+7EHOb+2zHuvx0zl/ffs6tq0VQa7r6zezKdqmo1sHrU/dhRScaqatmo+zFXuf92jPtv\nx8yX/TdbTivdDRwyNL641SRJIzBbwuFG4LAkhybZEzgduGrEfZKkeWtWnFaqqseSvB5YCywA1lTV\nrSPu1s4050+NjZj7b8e4/3bMvNh/s+KCtCRpdpktp5UkSbOI4SBJ6syKaw5zXZK3Ab8KPFhVp7Xa\nc4E3A08Fvgu8tap+lGQP4C0MPgn+BPBHVXVTkr2AdzO4U+tx4P9U1ftnfmtm3nTsvzbP+xncg74A\n+Arwrqp6Yqa3Z6ZN1/4bWt57gcXjy9rVTePrbzWD19+jbdGvr6pNM7ox06mqfOzgAzgK+CXgiqHa\npcBRbfjXgd9sw6cB57bh/YEPMziC2wtY1up7AH8B/KtRb9tc2X9t/GntOcAfAieMetvm0v5rtZcA\n5w8va1d/TOPrbzWwdNTbM10PTytNg6r6B+DhzcrPBr7chr/E4D8dwKEMbt2lBu8qfgD8i6p6tKrG\nWv2fgW8AB+3krs8K07H/2viPWpsFDAJ2Xpiu/ZfkqcArgYt2cpdnlenaf7saw2Hn+Sbw4jb8b/j/\nf+jvAF6cZEGSZzF4YT0pBJI8A/g14IYZ6utstF37L8mfAuuAR4DPzVx3Z53t2X//hcE74UfR9v7/\nPTfJR5K8JklmrrvTz3DYec4DXp7kw8DTgMda/UrgPuAy4I3AzQzOXQI/+4ba84HLq2o+f0p8u/Zf\nDb6P60QGRw6/PJMdnmW2af+1c+yLq+raUXR2Ftqe199bq+o/AK8BXgCcPKM9nmZekN5JqupbwNkA\nSX4eeFGrPw68d7xdkjXAd4Zm/V1gQ1V9ZMY6OwvtwP6jqn6a5H8zeOf3pRnq8qyyHfvvKGBpkk8x\nOC23f5LVVbWKeWh7Xn9VdX97fiTJZ4AjgL+d0Y5PI48cdpIk+7fn3Ri8k/hYG98ryd5t+Bjg8aq6\ns42/Dng68J6RdHoW2db9l+SpSQ5s9QUM/jN/axR9nw22df9V1ceqanlVrWjtvzNfgwG26/W3IMnC\nVt+dwd1P3xxJ56eJRw7TIMk7gRcCC5NcDVwIPDXJy1uTa4FPteH9gT9N8gRwP/C2toyfA/4zgz9o\nH26nK6+oqk/O1HaMynTsPwZ3e723fTfXbsAY8PEZ2oSRmqb9N29N0/7bs9V3Z/D6uwH4xAxtwk7h\n12dIkjqeVpIkdQwHSVLHcJAkdQwHSVLHcJAkdQwHSVLHcJAkdf4fplY266m4yjcAAAAASUVORK5C\nYII=\n", + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -75,57 +1725,904 @@ }, { "data": { + "text/html": [ + "" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 57, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "# Use the following data for this assignment:\n", + "#Initialize figure and axes:\n", + "fig, ax = plt.subplots()\n", "\n", - "import pandas as pd\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", + "#Set thereshold (manual input):\n", + "threshold = 41000\n", "\n", - "np.random.seed(12345)\n", + "#Set the bar colour:\n", + "colormap = matplotlib.colors.LinearSegmentedColormap.from_list(\"colormap\",[\"blue\", \"white\", \"red\"])\n", + "def colour_list(threshold):\n", + " colour_list=[]\n", + " for l,u in zip(lower_bound,upper_bound):\n", + " cnorm = matplotlib.colors.Normalize(vmin=l,vmax=u) # normalize based on l and u\n", + " cpick = matplotlib.cm.ScalarMappable(norm=cnorm,cmap=colormap) # scale it based on norm and cmap\n", + " cpick.set_array([]) # set an array\n", + " colour_list.append(cpick.to_rgba(threshold)) #transform it to colour and append it to norm\n", + " return colour_list\n", "\n", - "df = pd.DataFrame([np.random.normal(32000,200000,3650), \n", - " np.random.normal(43000,100000,3650), \n", - " np.random.normal(43500,140000,3650), \n", - " np.random.normal(48000,70000,3650)], \n", - " index=[1992,1993,1994,1995])\n", + "#plot\n", + "plot(colour_list(threshold))\n", + " \n", + "#show figure:\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Even Harder option implementation:** Add interactivity to the above, which allows the user to click on the y axis to set the value of interest. The bar colors should change with respect to what value the user has selected." + ] + }, + { + "cell_type": "code", + "execution_count": 243, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('