Skip to content

Instantly share code, notes, and snippets.

@msund
Last active June 6, 2016 12:08
Show Gist options
  • Save msund/11349097 to your computer and use it in GitHub Desktop.
Save msund/11349097 to your computer and use it in GitHub Desktop.
All of 'em
{
"metadata": {
"name": "Three new matplotlib plots"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "Sharing with Plotly: matplotlib gallery, prettyplotlib, seaborn, Software Carpentry, and Stack Overflow"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Plotly's matplotlib support lets you make matplotlib plots into interactive, online, and collaborative projects. It's free, online, you own your data, and you control the privacy. It's like a GitHub for data and graphs. You can use the public key below or [sign up](https://plot.ly). That means you can use your libraries and code, then use Plotly to make your graphs interactive, shareable, and drawn with D3. 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": 35
},
{
"cell_type": "code",
"collapsed": false,
"input": "import plotly\nplotly.__version__",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 36,
"text": "'0.5.9'"
}
],
"prompt_number": 36
},
{
"cell_type": "code",
"collapsed": false,
"input": "from matplotlylib import fig_to_plotly\nusername = \"IPython.Demo\"\napi_key = \"1fw3zw2o13\"",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 37
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "I. Plotly for Teaching: Software Carpentry Notebook"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "These first two are drawn from the excellent work the fine folks at Software Carpenty do. Check out [SWC repo](http://nbviewer.ipython.org/github/swcarpentry/notebooks/blob/master/matplotlib.ipynb) for more."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig1 = plt.figure()\n\n#generate some data\nx = np.array(range(20))\ny = 3 + 0.5 * x + np.random.randn(20)\n\n#plot the data\nplt.plot(x, y, 'bo')\n\nfig_to_plotly(fig1, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3123/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 48,
"text": "<IPython.core.display.HTML at 0x110c2f510>"
}
],
"prompt_number": 48
},
{
"cell_type": "code",
"collapsed": false,
"input": "x = np.array(range(20))\ny = 3 + 0.5 * x + np.random.randn(20)\nz = 2 + 0.9 * x + np.random.randn(20)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 46
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig2 = plt.figure()\n\n#plot the data\nplt.plot(x, y, 'bo')\nplt.hold(True)\nplt.plot(x, z, 'r^')\n\nfig_to_plotly(fig2, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3122/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 47,
"text": "<IPython.core.display.HTML at 0x1102d9b90>"
}
],
"prompt_number": 47
},
{
"cell_type": "markdown",
"metadata": {},
"source": "One special Plotly feature is that you'll get a URL for your call. The data always lives with the graph. To for that graph, the graph is here:\n\nhttps://plot.ly/~IPython.Demo/3080\n\nAnd I've gone in to make a copy of the graph, and shared the data here:\n\nhttps://plot.ly/~MattSundquist/1190"
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "II. matplotlib Gallery graphs"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "For matplotlib experts, you'll recognize these graphs from the [matplotlib gallery](matplotlib.org/gallery.html). Let us know if you find others you like or need translated. \n\nIn addition to matplotlib and Plotly's own Python API, You can also use Plotly's other [APIs](https://plot.ly/api) for MATLAB, R, Perl, Julia, and REST to write to graphs. \n\nThat 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 also 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": "First up, an example from [pylab](http://matplotlib.org/examples/pylab_examples/arctest.html)."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig3 = 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\nfig_to_plotly(fig3, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3124/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 51,
"text": "<IPython.core.display.HTML at 0x101ab1210>"
}
],
"prompt_number": 51
},
{
"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": "fig4 = 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\nfig_to_plotly(fig4, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3125/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 52,
"text": "<IPython.core.display.HTML at 0x110c70b10>"
}
],
"prompt_number": 52
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Another subplotting example. Note if you double-click, Plotly auto-sizes the plot. We initially draw it based on matplotlib defaults, but you can change the zoom and then save and share it how you'd like."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig5 = 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\nfig_to_plotly(fig5, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3126/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 53,
"text": "<IPython.core.display.HTML at 0x1117ad610>"
}
],
"prompt_number": 53
},
{
"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": "fig6 = 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\nfig_to_plotly(fig6, username, api_key, notebook= 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 height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3127/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 54,
"text": "<IPython.core.display.HTML at 0x1102cf910>"
}
],
"prompt_number": 54
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Plotly also reads the label types in this [damped oscillation](http://matplotlib.org/examples/pylab_examples/legend_demo2.html) graph."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig7 = 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.legend( (l2, l4), ('oscillatory', 'damped'), 'upper right', shadow=True)\nplt.xlabel('time')\nplt.ylabel('volts')\nplt.title('Damped oscillation')\n\nfig_to_plotly(fig7, username, api_key, notebook= True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3128/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 55,
"text": "<IPython.core.display.HTML at 0x10f55a490>"
}
],
"prompt_number": 55
},
{
"cell_type": "markdown",
"metadata": {},
"source": "[histogram](http://matplotlib.org/examples/statistics/histogram_demo_features.html)"
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig8 = 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')\nplt.title(r'Histogram of IQ: $\\mu=100$, $\\sigma=15$')\n\n# Tweak spacing to prevent clipping of ylabel\nplt.subplots_adjust(left=0.15)\n\nfig_to_plotly(fig8, username, api_key, notebook= True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3129/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 56,
"text": "<IPython.core.display.HTML at 0x112631b50>"
}
],
"prompt_number": 56
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "III. Stack Overflow Answers"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We love Stack Overflow, so wanted to show answers to 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": "fig9 = 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\nfig_to_plotly(fig9, username, api_key, notebook= True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3130/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 57,
"text": "<IPython.core.display.HTML at 0x112cef250>"
}
],
"prompt_number": 57
},
{
"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": "fig10 = 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\nfig_to_plotly(fig10, username, api_key, notebook= True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3131/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 58,
"text": "<IPython.core.display.HTML at 0x113046190>"
}
],
"prompt_number": 58
},
{
"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": "fig11 = 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\nfig_to_plotly(fig11, username, api_key, notebook= True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3132/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 59,
"text": "<IPython.core.display.HTML at 0x112d1aa50>"
}
],
"prompt_number": 59
},
{
"cell_type": "markdown",
"metadata": {},
"source": "...but can get more exciting like this."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig12 = plt.figure()\n\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nnum_plots = 20\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\nfig_to_plotly(fig12, username, api_key, notebook= True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3133/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 60,
"text": "<IPython.core.display.HTML at 0x112d72250>"
}
],
"prompt_number": 60
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Plotly also shows LaTeX if you want to 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": "fig13 = 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\nplt.legend()\n\nfig_to_plotly(fig13, username, api_key, notebook= True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3134/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 61,
"text": "<IPython.core.display.HTML at 0x113085210>"
}
],
"prompt_number": 61
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "IV. Prettyplotlib graphs in Plotly"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "The gallery of [examples](http://nbviewer.ipython.org/github/olgabot/prettyplotlib/blob/master/ipython_notebooks/Examples%20of%20everything%20pretty%20and%20plotted!.ipynb?create=1) we really like from [prettyplotlib](https://github.com/olgabot/prettyplotlib) can be a fun one to make interactive. Here's a scatter; let us know if you make others or have issues. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig14 = 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=1000)\n y = np.random.normal(loc=i, size=1000)\n ax = ppl.scatter(x, y, label=str(i))\n \nppl.legend(ax)\nax.set_title('prettyplotlib `scatter`')\n\nfig_to_plotly(fig14, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3135/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 62,
"text": "<IPython.core.display.HTML at 0x112d21950>"
}
],
"prompt_number": 62
},
{
"cell_type": "markdown",
"metadata": {},
"source": "prettyplotlib again improves on matplotlib's defaults, adding an appealing set of defaults. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig15 = 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 # For now, you need to specify both x and y :(\n # Still figuring out how to specify just one\n ppl.plot(x, y, label=str(i), linewidth=0.75)\n \nppl.legend()\n\nfig_to_plotly(fig15, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3136/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 63,
"text": "<IPython.core.display.HTML at 0x1136e4850>"
}
],
"prompt_number": 63
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "V. Plotting with seaborn"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Another library we really difg is [seaborn](http://stanford.edu/~mwaskom/software/seaborn/index.html), an awesome project by Michael Waskom. You may need to [import six](http://stackoverflow.com/questions/13967428/importerror-no-module-named-six), which you can do from pip. Let's try a few."
},
{
"cell_type": "code",
"collapsed": false,
"input": "import seaborn as sns\nfrom matplotlylib import fig_to_plotly",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 64
},
{
"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": 65
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig = plt.figure()\n\nsns.set_style(\"dark\")\nsinplot()\n\nfig_to_plotly(fig, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3137/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 66,
"text": "<IPython.core.display.HTML at 0x112d1b790>"
}
],
"prompt_number": 66
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can also run subplots like this."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig16 = plt.figure()\n\nwith sns.axes_style(\"darkgrid\"):\n plt.subplot(211)\n sinplot()\nplt.subplot(212)\nsinplot(-1)\n\nfig_to_plotly(fig16, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3138/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 67,
"text": "<IPython.core.display.HTML at 0x1137c7ed0>"
}
],
"prompt_number": 67
},
{
"cell_type": "markdown",
"metadata": {},
"source": "To plot data as point, rather than line, try [visualizing the data for each sampling unit](http://stanford.edu/~mwaskom/software/seaborn/tutorial/timeseries_plots.html#specifying-input-data-with-multidimensional-arrays)."
},
{
"cell_type": "code",
"collapsed": false,
"input": "import numpy as np\nnp.random.seed(9221999)\nimport pandas as pd\nfrom scipy import stats, optimize\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nsns.set(palette=\"Set2\")",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 68
},
{
"cell_type": "code",
"collapsed": false,
"input": "def sine_wave(n_x, obs_err_sd=1.5, tp_err_sd=.3):\n x = np.linspace(0, (n_x - 1) / 2, n_x)\n y = np.sin(x) + np.random.normal(0, obs_err_sd) + np.random.normal(0, tp_err_sd, n_x)\n return y",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 69
},
{
"cell_type": "code",
"collapsed": false,
"input": "sines = np.array([sine_wave(31) for _ in range(20)])",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 70
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig17 = plt.figure()\n\nsns.tsplot(sines, err_style=\"unit_points\", color=\"mediumpurple\");\n\nfig_to_plotly(fig17, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3139/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 71,
"text": "<IPython.core.display.HTML at 0x1137a8150>"
}
],
"prompt_number": 71
},
{
"cell_type": "markdown",
"metadata": {},
"source": "As you'll see, you can get part of the way [plotting regressions](http://stanford.edu/~mwaskom/software/seaborn/tutorial/quantitative_linear_models.html#plotting-simple-regression-with-regplot); it's a work in process still at Plotly. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "import numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib as mpl\nimport matplotlib.pyplot as plt",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 72
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Load some data."
},
{
"cell_type": "code",
"collapsed": false,
"input": "np.random.seed(sum(map(ord, \"linear_quantitative\")))",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 73
},
{
"cell_type": "code",
"collapsed": false,
"input": "tips = sns.load_dataset(\"tips\")",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 74
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig18 = plt.figure()\n\nx, y = np.random.multivariate_normal([1, 5], [(2, -.8), (-.8, 2)], 80).T\nax = sns.regplot(x, y, color=\"seagreen\")\nax.set(xlabel=\"x variable\", ylabel=\"y variable\");\nplt.show()\n\nfig_to_plotly(fig18, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": "<matplotlib.figure.Figure at 0x10dd9c510>"
},
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3140/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 75,
"text": "<IPython.core.display.HTML at 0x10fe5acd0>"
}
],
"prompt_number": 75
},
{
"cell_type": "markdown",
"metadata": {},
"source": "However, this one does work."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig19 = plt.figure()\n\nsns.residplot(x, y);\n\nfig_to_plotly(fig19, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3141/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 76,
"text": "<IPython.core.display.HTML at 0x1143242d0>"
}
],
"prompt_number": 76
},
{
"cell_type": "markdown",
"metadata": {},
"source": "And a final example, [graphing residuals](http://stanford.edu/~mwaskom/software/seaborn/tutorial/quantitative_linear_models.html#plotting-simple-regression-with-regplot)."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig20 = plt.figure()\n\ny = x + 1.5 * x ** 2 + np.random.randn(len(x))\nsns.residplot(x, y, color=\"indianred\");\n\nfig_to_plotly(fig20, username, api_key, notebook = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3142/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 77,
"text": "<IPython.core.display.HTML at 0x114324210>"
}
],
"prompt_number": 77
}
],
"metadata": {}
}
]
}
@cqcn1991
Copy link

cqcn1991 commented Jun 6, 2016

What about adding a sidebar it? So it would be easier to navigate through the notebook.
Mine is like this:
https://nbviewer.jupyter.org/github/cqcn1991/Wind-Speed-Analysis/blob/master/GMM.ipynb

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment