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. "
},
{
"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": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": "import plotly\nplotly.__version__",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": "'0.5.9'"
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": "from matplotlylib import fig_to_plotly\nusername = \"IPython.Demo\"\napi_key = \"1fw3zw2o13\"",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "I. Plotly for Teaching: Software Carpentry Notebook"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can use Plotly, matplotlib, and IPython to interactive plots. These can be shared, forked, and easily edited as a learning process. These are drawn from the [SWC repo](http://nbviewer.ipython.org/github/swcarpentry/notebooks/blob/master/matplotlib.ipynb). We'll start off with a histogram. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig1 = plt.figure()\n\nx = np.array(range(20))\ny = 3 + 0.5 * x + np.random.randn(20)\nz = 2 + 0.9 * x + np.random.randn(20)\n\n#plot the data\nplt.plot(x, y, 'bo')\nplt.hold(True)\nplt.plot(x, z, 'r^')\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/3080/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": "<IPython.core.display.HTML at 0x10df10b90>"
}
],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We've left plot.show in so you can see both plots. For the rest, we won't show both. One special Plotly feature is that you'll get a URL for your call. Non-coders and coders can work together. You can also edit the data, fork it, and make new graphs. The data always lives with the code, so for that graph, the graph is here:\n\nand the data is here: \n\n. "
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Plotly also reads sup-plots. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig2 = plt.figure()\n\nplt.subplot(1, 2, 1)\nplt.plot(x, y, 'rs')\nplt.subplot(1, 2, 2)\nplt.hist(data, 10)\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/3081/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": "<IPython.core.display.HTML at 0x10e433950>"
}
],
"prompt_number": 14
},
{
"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\nYou can also use Plotly's [APIs](https://plot.ly/api) for Python, MATLAB, R, Perl, Julia, and REST to write to graphs. That means you and I could edit the same graph with any language or the GUI. Then it goes to a profile, like this: https://plot.ly/~IPython.Demo."
},
{
"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/3082/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 15,
"text": "<IPython.core.display.HTML at 0x10e4242d0>"
}
],
"prompt_number": 15
},
{
"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/3083/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 16,
"text": "<IPython.core.display.HTML at 0x10e5d6590>"
}
],
"prompt_number": 16
},
{
"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/3084/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 17,
"text": "<IPython.core.display.HTML at 0x10dca3c10>"
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": "A favorte from the gallery is [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/3085/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 18,
"text": "<IPython.core.display.HTML at 0x10f3b3810>"
}
],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {},
"source": "[damped oscillation](http://matplotlib.org/examples/pylab_examples/legend_demo2.html)"
},
{
"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/3086/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 19,
"text": "<IPython.core.display.HTML at 0x10f3dc050>"
}
],
"prompt_number": 19
},
{
"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/3087/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 20,
"text": "<IPython.core.display.HTML at 0x10fd3f0d0>"
}
],
"prompt_number": 20
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "III. Stack Overflow Answers"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "[histogram](http://stackoverflow.com/questions/5328556/histogram-matplotlib)"
},
{
"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/3088/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 21,
"text": "<IPython.core.display.HTML at 0x10feeb310>"
}
],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {},
"source": "[Density plot](http://stackoverflow.com/questions/4150171/how-to-create-a-density-plot-in-matplotlib/4152016#4152016)"
},
{
"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/3089/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 22,
"text": "<IPython.core.display.HTML at 0x10e43f110>"
}
],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {},
"source": "[different lines for different plots](http://stackoverflow.com/questions/4805048/how-to-get-different-lines-for-different-plots-in-a-single-figure/4805456#4805456)"
},
{
"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/3090/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 23,
"text": "<IPython.core.display.HTML at 0x10e496d10>"
}
],
"prompt_number": 23
},
{
"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/3091/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 24,
"text": "<IPython.core.display.HTML at 0x10ff04710>"
}
],
"prompt_number": 24
},
{
"cell_type": "markdown",
"metadata": {},
"source": "[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/3092/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 25,
"text": "<IPython.core.display.HTML at 0x10ff17e10>"
}
],
"prompt_number": 25
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "IV. Prettyplotlib graphs in Plotly"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Some lovely [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)"
},
{
"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/3093/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 26,
"text": "<IPython.core.display.HTML at 0x10e49f310>"
}
],
"prompt_number": 26
},
{
"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/3094/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 27,
"text": "<IPython.core.display.HTML at 0x110ab2b10>"
}
],
"prompt_number": 27
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": "V. Plotting with seaborn"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You may need to [import six](http://stackoverflow.com/questions/13967428/importerror-no-module-named-six), which you can do from pip."
},
{
"cell_type": "code",
"collapsed": false,
"input": "import seaborn as sns\nfrom matplotlylib import fig_to_plotly",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 28
},
{
"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": 29
},
{
"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/3095/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 30,
"text": "<IPython.core.display.HTML at 0x10f5736d0>"
}
],
"prompt_number": 30
},
{
"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/3096/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 31,
"text": "<IPython.core.display.HTML at 0x10f5765d0>"
}
],
"prompt_number": 31
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Finally, it\u2019s also possibly to plot each individual observation with a point, rather than joining them. This is more useful for the gestalt it presents than as a quantitative visualization but you may prefer it. [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": 32
},
{
"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": 33
},
{
"cell_type": "code",
"collapsed": false,
"input": "sines = np.array([sine_wave(31) for _ in range(20)])",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 34
},
{
"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/3097/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 35,
"text": "<IPython.core.display.HTML at 0x110e59bd0>"
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": "[plotting regressions](http://stanford.edu/~mwaskom/software/seaborn/tutorial/quantitative_linear_models.html#plotting-simple-regression-with-regplot)"
},
{
"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": 36
},
{
"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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\nZbwAAAAASUVORK5CYII=\n",
"text": "<matplotlib.figure.Figure at 0x110eada10>"
},
{
"output_type": "stream",
"stream": "stderr",
"text": "/Users/matthewsundquist/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlylib/renderer.py:448: UserWarning: Dang! That path collection is out of this world. I totally don't know what to do with it yet! Plotly can only import path collections linked to 'data' coordinates\n warnings.warn(\"Dang! That path collection is out of this \"\n"
},
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3098/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 37,
"text": "<IPython.core.display.HTML at 0x110ea6c90>"
}
],
"prompt_number": 37
},
{
"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": [
{
"output_type": "stream",
"stream": "stderr",
"text": "/Users/matthewsundquist/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/matplotlylib/renderer.py:363: UserWarning: Bummer! Plotly can currently only draw Line2D objects from matplotlib that are in 'data' coordinates!\n warnings.warn(\"Bummer! Plotly can currently only draw Line2D \"\n"
},
{
"html": "<iframe height=\"500\" id=\"igraph\" scrolling=\"no\" seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3099/600/450\" width=\"650\"></iframe>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 38,
"text": "<IPython.core.display.HTML at 0x111a90650>"
}
],
"prompt_number": 38
}
],
"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