{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from bokeh.sampledata.iris import flowers as data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
05.13.51.40.2setosa
14.93.01.40.2setosa
24.73.21.30.2setosa
34.63.11.50.2setosa
45.03.61.40.2setosa
\n", "
" ], "text/plain": [ " sepal_length sepal_width petal_length petal_width species\n", "0 5.1 3.5 1.4 0.2 setosa\n", "1 4.9 3.0 1.4 0.2 setosa\n", "2 4.7 3.2 1.3 0.2 setosa\n", "3 4.6 3.1 1.5 0.2 setosa\n", "4 5.0 3.6 1.4 0.2 setosa" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "image/png": "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\nJO2RlCnp7TDDv7PWHnQptKQzZMgQzZkzR6+//ro2bNggSRo8eLAkqVWrVpKkatWqRVxVp1GjRho9\nerRGjx6tvLw8de3aVQ888ID69esX8PjWrVtr6dKl2r9/f9BVzebNm8vr9WrLli1q165dUfuePXu0\nf/9+NW/ePGg8zZs318cff1yqvfBt8lBjASAS+Zs3q94ZIW/SRX1ON74TKJSIK5olpcu3Wrk3zHFG\n0jpjzNfGmKXGmF+4H1rZ1VCNiPrd0KdPH9WtW1dz587V/Pnz1a1bt6Ikq0GDBurVq5eeeuop7d69\nu9TYvLzwWzJ5vV4dPOif99evX1+nnnqqjh4Nfuv/iiuukNfr1aRJk4IeM2DAAFlr9cgjj/i1T506\nVcYYXXLJJSHH7t692++xgZMnT+qxxx7TKaecEvTZTgCIxKcvvKAZ7drp0xdeqLA53fhOoLiEW9Es\nzvjuiz4i6W1r7achDv1G0o2S1kqqIWmUpBXGmG7W2nUhxlWYeqqv2zTWlbfInapataoGDhyouXPn\n6tChQ5o6dapf/+OPP67zzz9fnTp10qhRo9SqVSt9++23Wr16tXbt2qUPP/yw6Fhrban5v//+e51+\n+ukaNGiQOnfurNq1a2vZsmVau3at39vkJfXq1UvXXHONHn30UW3evFn9+/eX1+vVqlWr1Lt3b918\n8806++yzNXz4cD399NPat2+fevbsqTVr1mjOnDkaOHBgyGTxhhtu0FNPPaURI0Zo7dq1RdsbrV69\nWtOnT/d74xwAosF6vXrj7rslSW/ec4/aDxwoE2Hp3XBzuvGdQEkJnWhKekJSB0m/DHWQtXazpM3F\nmt4zxrSWNFbScDcCc7JCGYtkMpwhQ4Zo5syZ8ng8uvLKK/362rdvr7Vr12rSpEmaPXu28vPz1bBh\nQ3Xt2rXUG+GBnpWsWbOmbrnlFi1durToWdA2bdroH//4h2644YaQ42fNmqXOnTtr5syZmjBhgtLS\n0nTOOefoF7/4aaF65syZat26tWbNmqWXX35ZjRs31l133RXwbfXi86ekpGjlypW64447NGfOHB08\neFDt2rXTrFmzdM0115QaR610AJH6dOFC5X/2mSQpb9MmbXzxRXUYNMjVOd34TqAkE2ilKREYY2ZI\n+rWk8621Ox2Mf0jSL621pZJUY0yGpJwePXooLS3Nry8rK0tZWVnKzc1VZmamcnJyijYIL8mtfS4L\n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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# MATPLOTLIB\n", "import matplotlib.pyplot as plt\n", "import matplotlib\n", "import matplotlib.cm as cm\n", "import matplotlib.patches as patches\n", "\n", "N = len(data['species'].unique())\n", "cmap = cm.jet(pd.np.linspace(0, 1, num=N))\n", "colors = {k: cmap[i] for i, k in enumerate(data['species'].unique())}\n", "\n", "mmap = ['o', 's', '^']\n", "markers = {k: mmap[i] for i, k in enumerate(data['species'].unique())}\n", "\n", "data['color'] = data['species'].apply(lambda x: colors[x])\n", "data['marker'] = data['species'].apply(lambda x: markers[x])\n", "\n", "fig, ax = plt.subplots(1, 1, figsize=(7.5, 5))\n", "\n", "artists = list()\n", "legends = list()\n", "for k in data['species'].unique():\n", " s = data.loc[data['species']==k]\n", " a = ax.scatter(s['petal_length'], s['petal_width'], marker=markers[k], edgecolor=colors[k], facecolor=colors[k])\n", " legends.append(k)\n", " artists.append(a)\n", "\n", "ax.set_xlabel('petal_length')\n", "ax.set_ylabel('petal_width')\n", "ax.legend(artists, legends, loc='upper left')\n", "\n", "plt.savefig('./../static/img/iris-matplotlib.png')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "(function(global) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", "\n", " if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", " window._bokeh_onload_callbacks = [];\n", " window._bokeh_is_loading = undefined;\n", " }\n", "\n", "\n", " \n", " if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n", " window._bokeh_timeout = Date.now() + 5000;\n", " window._bokeh_failed_load = false;\n", " }\n", "\n", " var NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " if (window.Bokeh !== undefined) {\n", " document.getElementById(\"84ea8d6e-fb78-494a-826e-7c9592260999\").textContent = \"BokehJS successfully loaded.\";\n", " } else if (Date.now() < window._bokeh_timeout) {\n", " setTimeout(display_loaded, 100)\n", " }\n", " }\n", "\n", " function run_callbacks() {\n", " window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", " delete window._bokeh_onload_callbacks\n", " console.info(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(js_urls, callback) {\n", " window._bokeh_onload_callbacks.push(callback);\n", " if (window._bokeh_is_loading > 0) {\n", " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " window._bokeh_is_loading = js_urls.length;\n", " for (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " var s = document.createElement('script');\n", " s.src = url;\n", " s.async = false;\n", " s.onreadystatechange = s.onload = function() {\n", " window._bokeh_is_loading--;\n", " if (window._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", " run_callbacks()\n", " }\n", " };\n", " s.onerror = function() {\n", " console.warn(\"failed to load library \" + url);\n", " };\n", " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", " }\n", " };var element = document.getElementById(\"84ea8d6e-fb78-494a-826e-7c9592260999\");\n", " if (element == null) {\n", " console.log(\"Bokeh: ERROR: autoload.js configured with elementid '84ea8d6e-fb78-494a-826e-7c9592260999' but no matching script tag was found. \")\n", " return false;\n", " }\n", "\n", " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.4.min.js\"];\n", "\n", " var inline_js = [\n", " function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", " \n", " function(Bokeh) {\n", " \n", " document.getElementById(\"84ea8d6e-fb78-494a-826e-7c9592260999\").textContent = \"BokehJS is loading...\";\n", " },\n", " function(Bokeh) {\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.4.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.4.min.css\");\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.4.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.4.min.css\");\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " \n", " if ((window.Bokeh !== undefined) || (force === true)) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", " inline_js[i](window.Bokeh);\n", " }if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < window._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!window._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " window._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " var cell = $(document.getElementById(\"84ea8d6e-fb78-494a-826e-7c9592260999\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", "\n", " }\n", "\n", " if (window._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(js_urls, function() {\n", " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(this));" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from bokeh.plotting import figure, show, output_notebook\n", "output_notebook()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from bokeh.charts import Scatter, output_file, show\n", "from bokeh.sampledata.iris import flowers as data\n", "from bokeh.embed import components\n", "scatter = Scatter(data, x='petal_length', y='petal_width',\n", " color='species', marker='species',\n", " title='Iris Dataset Color and Marker by Species', width=500, height=400,\n", " legend=True)\n", "show(scatter)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 1 }