Skip to content

Instantly share code, notes, and snippets.

@msund
Last active June 14, 2022 03:20
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save msund/7ac1203ded66fe8134cc to your computer and use it in GitHub Desktop.
Save msund/7ac1203ded66fe8134cc to your computer and use it in GitHub Desktop.
Final version
{
"metadata": {
"name": "Three new matplotlib plots"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "21 Interactive Plots from matplotlib, ggplot for Python,<br>prettyplotlib, Stack Overflow, and seaborn"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Plotly is collaborative, makes beautiful interactive graphs with a URL for you, and stores your data and graphs together. This NB shows how to use Plotly to share plots from some awesome Python plotting libraries. The matplotlylib project is a collaboration with [mpld3](http://mpld3.github.io/index.html) and [Jake Vanderplas](https://github.com/jakevdp). We've put together a [User Guide](http://nbviewer.ipython.org/github/plotly/python-user-guide/blob/master/s00_homepage/s00_homepage.ipynb#Installation-guidelines) that outlines the full extent of Plotly's APIs.\n\nFor best results, you can copy and paste this Notebook and key. Run `$ pip install plotly` inside a terminal then start up a Notebook. We'll also be using ggplot, seaborn, and prettyplotlib, which you can also all install form pip. Let's get started."
},
{
"cell_type": "code",
"collapsed": false,
"input": "%matplotlib inline\nimport matplotlib.pyplot as plt # side-stepping mpl backend\nimport matplotlib.gridspec as gridspec # subplots\nimport numpy as np",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can use our public key and username or sign up for an account on [Plotly](plot.ly/ssi). Plotly is free for public use, you own your data, and you control the privacy. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "import plotly.plotly as py\nimport plotly.tools as tls\nfrom plotly.graph_objs import *\npy.sign_in(\"IPython.Demo\", \"1fw3zw2o13\")",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": "# tls.set_credentials_file(\"IPython.Demo\", \"1fw3zw2o13\")\n# tls.get_credentials_file()",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You'll want to have version 1.0.0. If not, run `$ pip install plotly --upgrade` in a terminal. Check out our User Guide for more details on [where to get your key](http://nbviewer.ipython.org/github/plotly/python-user-guide/blob/master/s00_homepage/s00_homepage.ipynb#Installation-guidelines). Problems or questions? Email feedback@plot.ly or find us on [Twitter](https://twitter.com/plotlygraphs)."
},
{
"cell_type": "code",
"collapsed": false,
"input": "import plotly\nplotly.__version__",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": "'1.0.0'"
}
],
"prompt_number": 4
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "I. matplotlib Gallery graphs"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "For matplotlib experts, you'll recognize these graphs from the [matplotlib gallery](matplotlib.org/gallery.html). \n\nIn addition to matplotlib and Plotly's own [Python API](https://plot.ly/python), You can also use Plotly's other [APIs](https://plot.ly/api) for MATLAB, R, Perl, Julia, and REST to write to graphs. That means you and I could edit the same graph with any language. We can even edit the graph and data from the GUI, so technical and non-technical teams can work together. And all the graphs go to your profile, like this: https://plot.ly/~IPython.Demo.\n\nYou control [the privacy](http://plot.ly/python/privacy) by setting `world_readable` to False or True, and can control your [sharing](http://plot.ly/python/file-sharing)."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Let's get started with this [damped oscillation](http://matplotlib.org/examples/pylab_examples/legend_demo2.html) graph."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig1 = plt.figure()\n# Make a legend for specific lines.\nimport matplotlib.pyplot as plt\nimport numpy as np\n\n\nt1 = np.arange(0.0, 2.0, 0.1)\nt2 = np.arange(0.0, 2.0, 0.01)\n\n# note that plot returns a list of lines. The \"l1, = plot\" usage\n# extracts the first element of the list into l1 using tuple\n# unpacking. So l1 is a Line2D instance, not a sequence of lines\nl1, = plt.plot(t2, np.exp(-t2))\nl2, l3 = plt.plot(t2, np.sin(2 * np.pi * t2), '--go', t1, np.log(1 + t1), '.')\nl4, = plt.plot(t2, np.exp(-t2) * np.sin(2 * np.pi * t2), 'rs-.')\n\nplt.xlabel('time')\nplt.ylabel('volts')\nplt.title('Damped oscillation')\n\nplt.show()",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEZCAYAAABrUHmEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXt8FOW5+L+bANlEIOEe7ksiNcSASbiJIglaBE1Rq1LE\nqqDWUooEj1VPexQZrK0W6ymXWo6n8jO0iD2KhQJRJCIBAblIEhEIaoPL/RICCbckhmR+f8zuZvaW\n7CabveX55jOfndvOvjN5Zp55n9trUFVVRRAEQRA8ICLQDRAEQRBCB1EagiAIgseI0hAEQRA8RpSG\nIAiC4DGiNARBEASPEaUhCIIgeIwoDUFoImazmYiICOrq6vzye3feeSd///vfAcjJyeGWW26xbYuI\niODQoUNNOu4777zD+PHjfdJGIfwRpSEEFJPJRExMDB07dqR///7ceuutrFy5MtDNCko+/PBDHn74\n4WYdw5Wi++lPf8rHH3/c3OYJrQRRGkJAMRgMrFu3jgsXLvDBBx9w44038tRTT/HMM88EumlhjeT0\nCk1FlIYQNAwbNozf//73zJs3jwULFvDvf/8bgNzcXNLS0oiNjWXcuHH87W9/s33H+ua8cuVKkpKS\nGDBgAO+++y7FxcWMHj2aAQMGsHDhQtv+OTk5jB49mhdeeIFevXoxefJkiouLbdsrKytZunQpI0aM\nYPTo0bz//vu2B6yqqqxYsYLk5GRSU1PZsmVLg+dz/PhxXnjhBUwmE48++iiFhYW2bVu3buWOO+6g\nc+fO9OnTh9dff922bc+ePcyYMYPu3btz7bXXsmHDBgAyMzNZunRpo9exoes1ZswYAOLi4ujYsSM7\nduxwMnV98803ZGdn069fP2bPns23335r25aZmcmrr77K+PHj6dmzJ08//TTl5eWNtkkII1RBCCAm\nk0nduHGj3brS0lK1TZs26j/+8Q9VVVU1Pz9f3bdvn3r16lV1/fr1aocOHdRvv/1WVVVV/e6771SD\nwaA++OCD6vHjx9W3335bveaaa9SsrCy1qKhI/fLLL9WOHTuqR44cUVVVVd9++221bdu26q9+9Sv1\nzJkz6quvvqr26tXL9tv/8R//oT7wwAPqd999pxYVFakpKSnqhg0bVFVV1bVr16oJCQnqZ599pn75\n5ZfqyJEj1YiICLW2ttbluY0ZM0Z98skn1TNnzqhLly5VO3bsqFZWVqqqqqrDhg1TV61apdbW1qrl\n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\n",
"text": "<matplotlib.figure.Figure at 0x106091750>"
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Now, to convert it to a Plotly figure, this is all it takes:"
},
{
"cell_type": "code",
"collapsed": false,
"input": "py.iplot_mpl(fig1)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3560\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x101ad27d0>"
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can hover, zoom, and pan on the figure. You can also strip out the matplotlib styling, and use Plotly's default styling."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig = tls.mpl_to_plotly(fig1)\nfig['layout'].update(showlegend=True)\nfig.strip_style()\npy.iplot(fig)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3561\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x1060a17d0>"
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Next up, an example from [pylab](http://matplotlib.org/examples/pylab_examples/arctest.html)."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig2 = plt.figure()\n\nfrom pylab import *\n\ndef f(t):\n 'a damped exponential'\n s1 = cos(2*pi*t)\n e1 = exp(-t)\n return multiply(s1,e1)\n\nt1 = arange(0.0, 5.0, .2)\n\n\nl = plot(t1, f(t1), 'ro')\nsetp(l, 'markersize', 30)\nsetp(l, 'markerfacecolor', 'b')\n\npy.iplot_mpl(fig2)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3562\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x10639a550>"
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Here's where this gets special. You can get the data from any Plotly graph. That means you can re-plot the graph or part of it, or use your favorite Python tools to wrangle and analyze your data. Check out our [getting started guide](http://nbviewer.ipython.org/github/plotly/python-user-guide/blob/master/s0_getting-started/s0_getting-started.ipynb) for a full background on these features."
},
{
"cell_type": "code",
"collapsed": false,
"input": "tls.mpl_to_plotly(fig2).get_data()",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": "[{'name': '_line0',\n 'x': [0.0,\n 0.20000000000000001,\n 0.40000000000000002,\n 0.60000000000000009,\n 0.80000000000000004,\n 1.0,\n 1.2000000000000002,\n 1.4000000000000001,\n 1.6000000000000001,\n 1.8,\n 2.0,\n 2.2000000000000002,\n 2.4000000000000004,\n 2.6000000000000001,\n 2.8000000000000003,\n 3.0,\n 3.2000000000000002,\n 3.4000000000000004,\n 3.6000000000000001,\n 3.8000000000000003,\n 4.0,\n 4.2000000000000002,\n 4.4000000000000004,\n 4.6000000000000005,\n 4.8000000000000007],\n 'y': [1.0,\n 0.25300171651849518,\n -0.54230030891302927,\n -0.44399794031078654,\n 0.13885028597711233,\n 0.36787944117144233,\n 0.09307413008823949,\n -0.19950113459002566,\n -0.16333771416280363,\n 0.051080165611754998,\n 0.1353352832366127,\n 0.034240058964379601,\n -0.073392365906047419,\n -0.060088587008433003,\n 0.018791342780197139,\n 0.049787068367863944,\n 0.012596213757493282,\n -0.026999542555766767,\n -0.022105355809443925,\n 0.0069129486808399343,\n 0.018315638888734179,\n 0.0046338880779826647,\n -0.0099325766273000524,\n -0.0081321059420741033,\n 0.0025431316975542792]}]"
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Or you can get the figure makeup. Here, we're using 'IPython.Demo', which is the username and '3357' which is the figure number. You can use this command on Plotly graphs to interact with them from the console. You can access graphs via a URL. For example, for this plot, it's:\n\nhttps://plot.ly/~IPython.Demo/3357/\n"
},
{
"cell_type": "code",
"collapsed": false,
"input": "pylab = py.get_figure('IPython.Demo', '3357')",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": "#print figure\nprint pylab.to_string()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "Figure(\n data=Data([\n Scatter(\n x=[0.0, 0.2, 0.4, 0.6000000000000001, 0.8, 1.0, 1.2000000000000...],\n y=[1.0, 0.2530017165184952, -0.5423003089130293, -0.44399794031...],\n name='_line0',\n mode='markers',\n marker=Marker(\n symbol='dot',\n line=Line(\n color='#000000',\n width=0.5\n ),\n size=30,\n color='#0000FF',\n opacity=1\n )\n )\n ]),\n layout=Layout(\n xaxis=XAxis(\n domain=[0.0, 1.0],\n range=[0.0, 5.0],\n showline=True,\n ticks='inside',\n showgrid=False,\n zeroline=False,\n anchor='y',\n mirror=True\n ),\n yaxis=YAxis(\n domain=[0.0, 1.0],\n range=[-0.6000000000000001, 1.2],\n showline=True,\n ticks='inside',\n showgrid=False,\n zeroline=False,\n anchor='x',\n mirror=True\n ),\n hovermode='closest',\n showlegend=False\n )\n)\n"
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Now let's suppose we wanted to add a fit to the graph (see our [fits post](http://blog.plot.ly/post/84402951992/contour-plots-error-bars-chocolate-beer-meat) to learn more), and re-style it a bit. We can go into the web app, fork a copy, and edit the image in our GUI. No coding required."
},
{
"cell_type": "code",
"collapsed": false,
"input": "from IPython.display import Image\nImage(url='https://i.imgur.com/WG0gb9J.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"https://i.imgur.com/WG0gb9J.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 12,
"text": "<IPython.core.display.Image at 0x10043b910>"
}
],
"prompt_number": 12
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We also keep the data and graph together. You can analyze it, share it, or add to other plots. You can [append data](https://plot.ly/python/add-append-extend) to your plots, copy and paste, import, or upload data. Take-away: a Python user could make plots with an Excel user, [ggplot2 Ploty package](ropensci.org/blog/2014/04/17/plotly/), and [MATLAB](plot.ly/MATLAB) user. That's collaboration. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url='https://i.imgur.com/Mq490fb.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"https://i.imgur.com/Mq490fb.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": "<IPython.core.display.Image at 0x10639a650>"
}
],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": "I can now call that graph into the NB. I can keep the styling, re-use that styling on future graphs, and save styles from other graphs. And if I want to see the data for the fit or access the figure styling, I can run the same commands, but on the updated figure and data for this graph. I don't need to re-code it, and I can save and share this version. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "tls.embed('MattSundquist', '1307')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~MattSundquist/1307\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x1060bff90>"
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Plotly graphs are always interactive, and you can even [stream data to the browser](http://nbviewer.ipython.org/github/plotly/python-user-guide/blob/master/s7_streaming/s7_streaming.ipynb). You can also embed them in the browser with an iframe snippet."
},
{
"cell_type": "code",
"collapsed": false,
"input": "from IPython.display import HTML",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": "s = \"\"\"<pre style=\"background:#f1f1f1;color:#000\">&lt;iframe src=<span style=\"color:#c03030\">\"https://plot.ly/~etpinard/176/650/550\"</span> width=<span style=\"color:#c03030\">\"650\"</span> height=550<span style=\"color:#c03030\">\" frameBorder=\"</span>0<span style=\"color:#c03030\">\" seamless=\"</span>seamless<span style=\"color:#c03030\">\" scrolling=\"</span>no<span style=\"color:#c03030\">\">&lt;/iframe></span></pre>\"\"\"",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": "h = HTML(s); h",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<pre style=\"background:#f1f1f1;color:#000\">&lt;iframe src=<span style=\"color:#c03030\">\"https://plot.ly/~etpinard/176/650/550\"</span> width=<span style=\"color:#c03030\">\"650\"</span> height=550<span style=\"color:#c03030\">\" frameBorder=\"</span>0<span style=\"color:#c03030\">\" seamless=\"</span>seamless<span style=\"color:#c03030\">\" scrolling=\"</span>no<span style=\"color:#c03030\">\">&lt;/iframe></span></pre>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 17,
"text": "<IPython.core.display.HTML at 0x1060bf350>"
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Where it remains interactive. That means your for-free defaults are: D3 graphs, drawn with JavaScript, and shared data. Here's how it looks in the Washington Post."
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url='http://i.imgur.com/XjvtYMr.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"http://i.imgur.com/XjvtYMr.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 18,
"text": "<IPython.core.display.Image at 0x10639ad90>"
}
],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {},
"source": "It's fun to zoom. Then double-click to re-size. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "HTML('<br><center><iframe class=\"vine-embed\" src=\"https://vine.co/v/Mvzin6HZzLB/embed/simple\" width=\"600\" height=\"600\" frameborder=\"0\"></iframe><script async src=\"//platform.vine.co/static/scripts/embed.js\" charset=\"utf-8\"></script></center><br>')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<br><center><iframe class=\"vine-embed\" src=\"https://vine.co/v/Mvzin6HZzLB/embed/simple\" width=\"600\" height=\"600\" frameborder=\"0\"></iframe><script async src=\"//platform.vine.co/static/scripts/embed.js\" charset=\"utf-8\"></script></center><br>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 19,
"text": "<IPython.core.display.HTML at 0x1060a3150>"
}
],
"prompt_number": 19
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Plots can be collaboratively edited and shared with others."
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url='https://i.imgur.com/CxIYtzG.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"https://i.imgur.com/CxIYtzG.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 20,
"text": "<IPython.core.display.Image at 0x1060bff90>"
}
],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": "So you can keep all your plots for your project, team, or personal work in one plce, you get a profile, like this: https://plot.ly/~jackp/. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url='https://i.imgur.com/gUC4ajR.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"https://i.imgur.com/gUC4ajR.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 21,
"text": "<IPython.core.display.Image at 0x1060bfc90>"
}
],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can also plot with Plotly with pandas, NumPy, datetime, and more of your favorite Python tools. We've already imported numpy and matplotlib; here we've kept them in so you can simply copy and paste these examples into your own NB. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig3 = plt.figure()\n\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# make a little extra space between the subplots\nplt.subplots_adjust(wspace=0.5)\n\ndt = 0.01\nt = np.arange(0, 30, dt)\nnse1 = np.random.randn(len(t)) # white noise 1\nnse2 = np.random.randn(len(t)) # white noise 2\nr = np.exp(-t/0.05)\n\ncnse1 = np.convolve(nse1, r, mode='same')*dt # colored noise 1\ncnse2 = np.convolve(nse2, r, mode='same')*dt # colored noise 2\n\n# two signals with a coherent part and a random part\ns1 = 0.01*np.sin(2*np.pi*10*t) + cnse1\ns2 = 0.01*np.sin(2*np.pi*10*t) + cnse2\n\nplt.subplot(211)\nplt.plot(t, s1, 'b-', t, s2, 'g-')\nplt.xlim(0,5)\nplt.xlabel('time')\nplt.ylabel('s1 and s2')\nplt.grid(True)\n\nplt.subplot(212)\ncxy, f = plt.csd(s1, s2, 256, 1./dt)\nplt.ylabel('CSD (db)')\n\npy.iplot_mpl(fig3)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3563\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x106435a90>"
}
],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Another subplotting example using Plotly's defaults. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig4 = plt.figure()\n\nfrom pylab import figure, show\nfrom numpy import arange, sin, pi\n\nt = arange(0.0, 1.0, 0.01)\n\nfig = figure(1)\n\nax1 = fig.add_subplot(211)\nax1.plot(t, sin(2*pi*t))\nax1.grid(True)\nax1.set_ylim( (-2,2) )\nax1.set_ylabel('1 Hz')\nax1.set_title('A sine wave or two')\n\nfor label in ax1.get_xticklabels():\n label.set_color('r')\n\n\nax2 = fig.add_subplot(212)\nax2.plot(t, sin(2*2*pi*t))\nax2.grid(True)\nax2.set_ylim( (-2,2) )\nl = ax2.set_xlabel('Hi mom')\nl.set_color('g')\nl.set_fontsize('large')\n\npy.iplot_mpl(fig4, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3564\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x106488d50>"
}
],
"prompt_number": 23
},
{
"cell_type": "markdown",
"metadata": {},
"source": "From the gallery here we're shwoing [Anscombe's quartet](http://matplotlib.org/examples/pylab_examples/anscombe.html). You might also like Plotly's [blog post](blog.plot.ly/post/68951620673/why-graph-anscombes-quartet) on the subject."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig5 = plt.figure()\n\nfrom __future__ import print_function\n\"\"\"\nEdward Tufte uses this example from Anscombe to show 4 datasets of x\nand y that have the same mean, standard deviation, and regression\nline, but which are qualitatively different.\n\nmatplotlib fun for a rainy day\n\"\"\"\n\nfrom pylab import *\n\nx = array([10, 8, 13, 9, 11, 14, 6, 4, 12, 7, 5])\ny1 = array([8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68])\ny2 = array([9.14, 8.14, 8.74, 8.77, 9.26, 8.10, 6.13, 3.10, 9.13, 7.26, 4.74])\ny3 = array([7.46, 6.77, 12.74, 7.11, 7.81, 8.84, 6.08, 5.39, 8.15, 6.42, 5.73])\nx4 = array([8,8,8,8,8,8,8,19,8,8,8])\ny4 = array([6.58,5.76,7.71,8.84,8.47,7.04,5.25,12.50,5.56,7.91,6.89])\n\ndef fit(x):\n return 3+0.5*x\n\n\n\nxfit = array( [amin(x), amax(x) ] )\n\nsubplot(221)\nplot(x,y1,'ks', xfit, fit(xfit), 'r-', lw=2)\naxis([2,20,2,14])\nsetp(gca(), xticklabels=[], yticks=(4,8,12), xticks=(0,10,20))\ntext(3,12, 'I', fontsize=20)\n\nsubplot(222)\nplot(x,y2,'ks', xfit, fit(xfit), 'r-', lw=2)\naxis([2,20,2,14])\nsetp(gca(), xticklabels=[], yticks=(4,8,12), yticklabels=[], xticks=(0,10,20))\ntext(3,12, 'II', fontsize=20)\n\nsubplot(223)\nplot(x,y3,'ks', xfit, fit(xfit), 'r-', lw=2)\naxis([2,20,2,14])\ntext(3,12, 'III', fontsize=20)\nsetp(gca(), yticks=(4,8,12), xticks=(0,10,20))\n\nsubplot(224)\n\nxfit = array([amin(x4),amax(x4)])\nplot(x4,y4,'ks', xfit, fit(xfit), 'r-', lw=2)\naxis([2,20,2,14])\nsetp(gca(), yticklabels=[], yticks=(4,8,12), xticks=(0,10,20))\ntext(3,12, 'IV', fontsize=20)\n\n#verify the stats\npairs = (x,y1), (x,y2), (x,y3), (x4,y4)\nfor x,y in pairs:\n print ('mean=%1.2f, std=%1.2f, r=%1.2f'%(mean(y), std(y), corrcoef(x,y)[0][1]))\n\npy.iplot_mpl(fig5, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "mean=7.50, std=1.94, r=0.82\nmean=7.50, std=1.94, r=0.82\nmean=7.50, std=1.94, r=0.82\nmean=7.50, std=1.94, r=0.82\n"
},
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3565\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x106d446d0>"
}
],
"prompt_number": 24
},
{
"cell_type": "markdown",
"metadata": {},
"source": "And a final [histogram](http://matplotlib.org/examples/statistics/histogram_demo_features.html) from the matplotlib gallery. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig6 = plt.figure()\n\nimport numpy as np\nimport matplotlib.mlab as mlab\nimport matplotlib.pyplot as plt\n\n\n# example data\nmu = 100 # mean of distribution\nsigma = 15 # standard deviation of distribution\nx = mu + sigma * np.random.randn(10000)\n\nnum_bins = 50\n# the histogram of the data\nn, bins, patches = plt.hist(x, num_bins, normed=1, facecolor='green', alpha=0.5)\n# add a 'best fit' line\ny = mlab.normpdf(bins, mu, sigma)\nplt.plot(bins, y, 'r--')\nplt.xlabel('Smarts')\nplt.ylabel('Probability')\n\n# Tweak spacing to prevent clipping of ylabel\nplt.subplots_adjust(left=0.15)\n\npy.iplot_mpl(fig6, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3566\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x106cf8d10>"
}
],
"prompt_number": 25
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Want to see more matplotlylib graphs? Head over to our [API](https://plot.ly/python) and copy and paste away."
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url='https://i.imgur.com/HEJEnjQ.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"https://i.imgur.com/HEJEnjQ.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 26,
"text": "<IPython.core.display.Image at 0x106372890>"
}
],
"prompt_number": 26
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "II. ggplot for Python"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "An exciting package by [Greg Lamp](https://github.com/glamp) and the team at [\u0177hat](https://yhathq.com/) is [ggplot for Python](https://github.com/yhat/ggplot). You can draw figures with ggplot's wonderful syntax and share them with Plotly. You'll want to run `$ pip install ggplot` to get started."
},
{
"cell_type": "code",
"collapsed": false,
"input": "from ggplot import *",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 27
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We'll start out with a plot from the diamonds dataset. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "a = ggplot(aes(x='price'), data=diamonds) + geom_histogram() + facet_wrap(\"cut\") ",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 28
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Then share it to Plotly."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig = a.draw() \npy.iplot_mpl(fig, strip_style=True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3582\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x1126eb490>"
}
],
"prompt_number": 52
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Line charts can be interactive (drag your mouse along the line to see the data on the hover)."
},
{
"cell_type": "code",
"collapsed": false,
"input": "b = ggplot(aes(x='date', y='beef'), data=meat) + \\\n geom_line() ",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 30
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig = b.draw() \npy.iplot_mpl(fig)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3568\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x10645a490>"
}
],
"prompt_number": 31
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Histograms are also fun to hover over to get the exact data. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "c = ggplot(aes(x='price'), data=diamonds) + geom_histogram() + ggtitle('My Diamond Histogram')",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 32
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig = c.draw() \npy.iplot_mpl(fig, strip_style=True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3569\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x1115a4b50>"
}
],
"prompt_number": 33
},
{
"cell_type": "code",
"collapsed": false,
"input": "d = ggplot(aes(x='x', y='y', color='z'), data=diamonds.head(1000)) +\\\n geom_point() ",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 34
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig = d.draw() \npy.iplot_mpl(fig, strip_style=True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3570\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x110c96f90>"
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can also use more advanced plotting types in collaboration with pandas. You can add a geom."
},
{
"cell_type": "code",
"collapsed": false,
"input": "import pandas as pd",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 36
},
{
"cell_type": "code",
"collapsed": false,
"input": "random_walk1 = pd.DataFrame({\n \"x\": np.arange(100),\n \"y\": np.cumsum(np.random.choice([-1, 1], 100))\n})\nrandom_walk2 = pd.DataFrame({\n \"x\": np.arange(100),\n \"y\": np.cumsum(np.random.choice([-1, 1], 100))\n})\ne = ggplot(aes(x='x', y='y'), data=random_walk1) + \\\n geom_step() + \\\n geom_step(aes(x='x', y='y'), data=random_walk2)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig = e.draw() \npy.iplot_mpl(fig, strip_style=True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3571\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x110c1c210>"
}
],
"prompt_number": 38
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "III. Prettyplotlib graphs in Plotly"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "The lovely gallery of [examples](http://nbviewer.ipython.org/github/olgabot/prettyplotlib/blob/master/ipython_notebooks/Examples%20of%20everything%20pretty%20and%20plotted!.ipynb?create=1) from [prettyplotlib](https://github.com/olgabot/prettyplotlib), a matplotlib enhnacing library by [Olga Botvinnik](https://github.com/olgabot), is a fun one to make interactive. Here's a scatter; let us know if you make others. You'll note that not all elements of the styling come through. Head over to [the homepage](http://olgabot.github.io/prettyplotlib/) for documentation."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig12 = plt.figure()\n\nimport prettyplotlib as ppl\n\n# Set the random seed for consistency\nnp.random.seed(12)\n\n# Show the whole color range\nfor i in range(8):\n x = np.random.normal(loc=i, size=800)\n y = np.random.normal(loc=i, size=800)\n ax = ppl.scatter(x, y, label=str(i))\n \nppl.legend(ax)\nax.set_title('prettyplotlib `scatter`')\nax.legend().set_visible(False)\n\npy.iplot_mpl(fig12)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3572\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x111596390>"
}
],
"prompt_number": 39
},
{
"cell_type": "markdown",
"metadata": {},
"source": "And another prettyplotlib example."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig13 = plt.figure()\n\nimport prettyplotlib as ppl\n\n# Set the random seed for consistency\nnp.random.seed(12)\n\n# Show the whole color range\nfor i in range(8):\n y = np.random.normal(size=1000).cumsum()\n x = np.arange(1000)\n\n # Specify both x and y\n ppl.plot(x, y, label=str(i), linewidth=0.75)\n \npy.iplot_mpl(fig13)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3573\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x110171b50>"
}
],
"prompt_number": 40
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "IV. Plotting with seaborn"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Another library we really dig is [seaborn](http://stanford.edu/~mwaskom/software/seaborn/index.html), a library to maximize aesthetics of matplotlib plots. It's by by [Michael Waskom](http://stanford.edu/~mwaskom/). You'll need to install it with ` $ pip install seaborn`, and may need to [import six](http://stackoverflow.com/questions/13967428/importerror-no-module-named-six), which you can do from pip. The styling isn't yet translated to Plotly, so we'll go to Plotly's default settings. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "import seaborn as sns\nfrom matplotlylib import fig_to_plotly",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 41
},
{
"cell_type": "code",
"collapsed": false,
"input": "def sinplot(flip=1):\n x = np.linspace(0, 14, 100)\n for i in range(1, 7):\n plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 42
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig14 = plt.figure()\n\nsns.set_style(\"dark\")\nsinplot()\n\npy.iplot_mpl(fig14, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3574\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x110c84f50>"
}
],
"prompt_number": 43
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can also run subplots like this."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig15 = plt.figure()\n\nwith sns.axes_style(\"darkgrid\"):\n plt.subplot(211)\n sinplot()\nplt.subplot(212)\nsinplot(-1)\n\npy.iplot_mpl(fig15, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3575\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x110ce3150>"
}
],
"prompt_number": 44
},
{
"cell_type": "markdown",
"metadata": {},
"source": "And a final example, [combining plot types](http://stanford.edu/~mwaskom/software/seaborn/tutorial/plotting_distributions.html#basic-visualization-with-histograms)."
},
{
"cell_type": "code",
"collapsed": false,
"input": "import numpy as np\nfrom numpy.random import randn\nimport pandas as pd\nfrom scipy import stats\nimport matplotlib as mpl\nimport matplotlib.pyplot as plt\nimport seaborn as sns",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 45
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig16 = plt.figure()\n\nsns.set_palette(\"hls\")\nmpl.rc(\"figure\", figsize=(8, 4))\ndata = randn(200)\nsns.distplot(data);\n\npy.iplot_mpl(fig16, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3576\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x110cf2550>"
}
],
"prompt_number": 46
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "V. Stack Overflow Answers"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We love Stack Overflow, so wanted answer a few questions from there, in Plotly. If you want to plot data you already have as a [histogram](http://stackoverflow.com/questions/5328556/histogram-matplotlib) and make it interactive, try this one out."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig17 = plt.figure()\n\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nmu, sigma = 100, 15\nx = mu + sigma * np.random.randn(10000)\nhist, bins = np.histogram(x, bins=50)\nwidth = 0.7 * (bins[1] - bins[0])\ncenter = (bins[:-1] + bins[1:]) / 2\nplt.bar(center, hist, align='center', width=width)\n\npy.iplot_mpl(fig17, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3577\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x11157f510>"
}
],
"prompt_number": 47
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Here is how to create a [density plot](http://stackoverflow.com/questions/4150171/how-to-create-a-density-plot-in-matplotlib/4152016#4152016) like you might in R, but in matplotlib."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig18 = plt.figure()\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom scipy.stats import gaussian_kde\ndata = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8\ndensity = gaussian_kde(data)\nxs = np.linspace(0,8,200)\ndensity.covariance_factor = lambda : .25\ndensity._compute_covariance()\nplt.plot(xs,density(xs))\n\npy.iplot_mpl(fig18, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3578\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x110cec910>"
}
],
"prompt_number": 48
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Drawing a simple example of [different lines for different plots](http://stackoverflow.com/questions/4805048/how-to-get-different-lines-for-different-plots-in-a-single-figure/4805456#4805456) looks like this..."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig19 = plt.figure()\n\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nx = np.arange(10)\n\nplt.plot(x, x)\nplt.plot(x, 2 * x)\nplt.plot(x, 3 * x)\nplt.plot(x, 4 * x)\n\npy.iplot_mpl(fig19, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3579\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x10fade810>"
}
],
"prompt_number": 49
},
{
"cell_type": "markdown",
"metadata": {},
"source": "...and can get more exciting like this."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig20 = plt.figure()\n\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nnum_plots = 10\n\n# Have a look at the colormaps here and decide which one you'd like:\n# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html\ncolormap = plt.cm.gist_ncar\nplt.gca().set_color_cycle([colormap(i) for i in np.linspace(0, 0.9, num_plots)])\n\n# Plot several different functions...\nx = np.arange(10)\nlabels = []\nfor i in range(1, num_plots + 1):\n plt.plot(x, i * x + 5 * i)\n labels.append(r'$y = %ix + %i$' % (i, 5*i))\n\npy.iplot_mpl(fig20, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3580\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x10f9f0110>"
}
],
"prompt_number": 50
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Plotly also lets you draw [variables as subscripts in math mode](http://stackoverflow.com/questions/23276918/writing-variables-as-subscripts-in-math-mode)."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig21 = plt.figure()\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport matplotlib.mlab as mlab\n\nmean = [10,12,16,22,25]\nvariance = [3,6,8,10,12]\n\nx = np.linspace(0,40,1000)\n\nfor i in range(4):\n sigma = np.sqrt(variance[i])\n y = mlab.normpdf(x,mean[i],sigma)\n plt.plot(x,y, label=r'$v_{}$'.format(i+1))\n\nplt.xlabel(\"X\")\nplt.ylabel(\"P(X)\") \n\npy.iplot_mpl(fig21, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3581\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x10f9f9d10>"
}
],
"prompt_number": 51
},
{
"cell_type": "code",
"collapsed": false,
"input": "# CSS styling within IPython notebook\nfrom IPython.core.display import HTML\nimport urllib2\ndef css_styling():\n url = 'https://raw.githubusercontent.com/plotly/python-user-guide/master/custom.css'\n styles = urllib2.urlopen(url).read()\n return HTML(styles)\n\ncss_styling()",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<style>\n /*body {\n background-color: #F5F5F5;\n }*/\n div.cell{\n width: 850px;\n margin-left: 10% !important;\n margin-right: auto;\n }\n h1 {\n font-family: 'Open sans',verdana,arial,sans-serif;\n }\n .text_cell_render h1 {\n font-weight: 200;\n font-size: 40pt;\n line-height: 100%;\n color:#447adb;\n margin-bottom: 0em;\n margin-top: 0em;\n display: block;\n white-space: nowrap;\n } \n h2 {\n font-family: 'Open sans',verdana,arial,sans-serif;\n text-indent:1em;\n }\n .text_cell_render h2 {\n font-weight: 200;\n font-size: 20pt;\n font-style: italic;\n line-height: 100%;\n color:#447adb;\n margin-bottom: 1.5em;\n margin-top: 0.5em;\n display: block;\n white-space: nowrap;\n } \n h3 {\n font-family: 'Open sans',verdana,arial,sans-serif;\n }\n .text_cell_render h3 {\n font-weight: 300;\n font-size: 18pt;\n line-height: 100%;\n color:#447adb;\n margin-bottom: 0.5em;\n margin-top: 2em;\n display: block;\n white-space: nowrap;\n }\n h4 {\n font-family: 'Open sans',verdana,arial,sans-serif;\n }\n .text_cell_render h4 {\n font-weight: 300;\n font-size: 16pt;\n color:#447adb;\n margin-bottom: 0.5em;\n margin-top: 0.5em;\n display: block;\n white-space: nowrap;\n }\n h5 {\n font-family: 'Open sans',verdana,arial,sans-serif;\n }\n .text_cell_render h5 {\n font-weight: 300;\n font-style: normal;\n color: #1d3b84;\n font-size: 16pt;\n margin-bottom: 0em;\n margin-top: 1.5em;\n display: block;\n white-space: nowrap;\n }\n div.text_cell_render{\n font-family: 'Open sans',verdana,arial,sans-serif;\n line-height: 135%;\n font-size: 125%;\n width:750px;\n margin-left:auto;\n margin-right:auto;\n text-align:justify;\n text-justify:inter-word;\n }\n div.output_subarea.output_text.output_pyout {\n overflow-x: auto;\n overflow-y: scroll;\n max-height: 300px;\n }\n div.output_subarea.output_stream.output_stdout.output_text {\n overflow-x: auto;\n overflow-y: scroll;\n max-height: 300px;\n }\n code{\n font-size: 78%;\n }\n .rendered_html code{\n background-color: transparent;\n }\n ul{\n /* color:#447adb; */ // colors text too\n margin: 2em;\n }\n ul li{\n padding-left: 0.5em; \n margin-bottom: 0.5em; \n margin-top: 0.5em; \n }\n ul li li{\n padding-left: 0.2em; \n margin-bottom: 0.2em; \n margin-top: 0.2em; \n }\n ol{\n /* color:#447adb; */ // colors text too\n margin: 2em;\n }\n ol li{\n padding-left: 0.5em; \n margin-bottom: 0.5em; \n margin-top: 0.5em; \n }\n /*.prompt{\n display: None;\n } */\n ul li{\n padding-left: 0.5em; \n margin-bottom: 0.5em; \n margin-top: 0.2em; \n }\n a:link{\n font-weight: bold;\n color:#447adb;\n }\n a:visited{\n font-weight: bold;\n color: #1d3b84;\n }\n a:hover{\n font-weight: bold;\n color: #1d3b84;\n }\n a:focus{\n font-weight: bold;\n color:#447adb;\n }\n a:active{\n font-weight: bold;\n color:#447adb;\n }\n .rendered_html :link {\n text-decoration: none; \n }\n .rendered_html :hover {\n text-decoration: none; \n }\n .rendered_html :visited {\n text-decoration: none;\n }\n .rendered_html :focus {\n text-decoration: none;\n }\n .rendered_html :active {\n text-decoration: none;\n }\n .warning{\n color: rgb( 240, 20, 20 )\n } \n hr {\n color: #f3f3f3;\n background-color: #f3f3f3;\n height: 1px;\n }\n blockquote{\n display:block;\n background: #f3f3f3;\n font-family: 'Open sans',verdana,arial,sans-serif;\n width:610px;\n padding: 15px 15px 15px 15px;\n text-align:justify;\n text-justify:inter-word;\n }\n blockquote p {\n margin-bottom: 0;\n line-height: 125%;\n font-size: 100%;\n }\n /* element.style {\n } */ \n</style>\n<script>\n MathJax.Hub.Config({\n TeX: {\n extensions: [\"AMSmath.js\"]\n },\n tex2jax: {\n inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n },\n displayAlign: 'center', // Change this to 'center' to center equations.\n \"HTML-CSS\": {\n styles: {'.MathJax_Display': {\"margin\": 4}}\n }\n });\n</script>\n",
"metadata": {},
"output_type": "pyout",
"prompt_number": 1,
"text": "<IPython.core.display.HTML at 0x102c04110>"
}
],
"prompt_number": 1
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment