Skip to content

Instantly share code, notes, and snippets.

@msund
Last active October 10, 2019 23:10
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save msund/61cdbd5b22c103fffb84 to your computer and use it in GitHub Desktop.
Save msund/61cdbd5b22c103fffb84 to your computer and use it in GitHub Desktop.
Data Science Demo
{
"metadata": {
"name": "Reproducible figures"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "IPython and Plotly: A Rosetta Stone for MATLAB,<br>R, Python, and Excel plotting "
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Collaboration, data analysis, and data visualization sometimes feels like this:"
},
{
"cell_type": "code",
"collapsed": false,
"input": "from IPython.display import Image\nImage(url = 'https://i.imgur.com/4DrMgLI.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"https://i.imgur.com/4DrMgLI.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 1,
"text": "<IPython.core.display.Image at 0x7f54a8e199d0>"
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Graphing and data analysis need a Rosetta Stone to solve the fragmentation and collaboration problem. \nPlotly is about bridging the divide and serving as an interoperable platform for analysis and plotting. You can import, edit, and plot data using scripts and data from Python, MATLAB, R, Julia, Perl, REST, Arduino, Raspberry Pi, or Excel. So can your team. \n\n*All in the same online plot*.\n\nRead on to learn more, or run `$ pip install plotly` and copy and paste the code below. Plotly is online, meaning no downloads or installations necessary. "
},
{
"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": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can use our key, or [sign-up](https://plot.ly/ssi) to get started. It's free for any public sharing and you own your data, so you can make and share as many plots as you want."
},
{
"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": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": "import plotly\nplotly.__version__",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": "'1.0.12'"
}
],
"prompt_number": 4
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "I. shareable matplotlib figures"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Let's start out with a matplotlib example. We also have [a Notebook](http://nbviewer.ipython.org/github/plotly/python-user-guide/blob/master/s6_matplotlylib/s6_matplotlylib.ipynb) on the subject."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig1 = 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)\") ",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 5,
"text": "<matplotlib.text.Text at 0x7f549f2ea050>"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nAABJRU5ErkJggg==\n",
"text": "<matplotlib.figure.Figure at 0x7f549f5b1b10>"
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": "To re-create the graph in Plotly and use Plotly's defaults, call `iplot` and add `strip_style`."
},
{
"cell_type": "code",
"collapsed": false,
"input": "py.iplot_mpl(fig1, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3819\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x7f54a80ff550>"
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": "It's shareable at a URL, contains the data as part of the plot, and can be edited collaboratively from any API or our web app. Head over to [Plotly's API](plot.ly/api) to see more, and check out our [User Guide](http://nbviewer.ipython.org/github/plotly/python-user-guide/blob/master/s00_homepage/s00_homepage.ipynb#Installation-guidelines) to see how it all works. \n\nPlotly also jointly preserves the data in a graph, the graph, and the graph description (in this case JSON). That's valuable. [One study](http://www.smithsonianmag.com/science-nature/the-vast-majority-of-raw-data-from-old-scientific-studies-may-now-be-missing-180948067/?no-ist) in *current biology* found that over 90 percent of data from papers published over the past 20 years was not available. So sharing data is good for science and reproducibility, useful for your projects, and great for collaboration."
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "II. ggplot2 plots in Plotly"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Let's take a real-world look storing data and graphs together. Suppose you see a graph on the [World Bank website](http://blogs.worldbank.org/opendata/accessing-world-bank-data-apis-python-r-ruby-stata). The graph uses [ggplot2](http://ggplot2.org), a remarkable plotting library for R. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "from IPython.display import Image\nImage(url = 'http://i.imgur.com/PkRRmHq.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"http://i.imgur.com/PkRRmHq.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": "<IPython.core.display.Image at 0x7f54a819b390>"
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You would like to re-make the graph and analyze and share the data. Getting the data using Plotly is easy. You can run the ggplot2 script in RStudio. Here we're running it using the new [R kernel](https://github.com/takluyver/IRkernel) for IPython). The Notebook with the replicable code and installation is [here](http://nbviewer.ipython.org/gist/msund/403910de45e282d658fa). "
},
{
"cell_type": "code",
"collapsed": true,
"input": [
"library(WDI)\n",
"library(ggplot2)\n",
" \n",
"#Grab GNI per capita data for Chile, Hungary and Uruguay\n",
" \n",
"dat = WDI(indicator='NY.GNP.PCAP.CD', country=c('CL','HU','UY'), start=1960, end=2012)\n",
" \n",
"#a quick plot with legend, title and label\n",
" \n",
"wb <- ggplot(dat, aes(year, NY.GNP.PCAP.CD, color=country)) + geom_line() \n",
"+ xlab('Year') + ylab('GDI per capita (Atlas Method USD)') \n",
"+ labs(title <- \"GNI Per Capita ($USD Atlas Method)\")\n",
"\n",
"py$ggplotly(wb)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We can add `py$ggplotly` to the call, which will draw the figure with Plotly's [R API](plot.ly/r). Then we can call it in a Notebook. You can similarly call any Plotly graph with the username and graph id pair."
},
{
"cell_type": "code",
"collapsed": false,
"input": "tls.embed('RgraphingAPI', '1457')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~RgraphingAPI/1457\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x7f54a819b2d0>"
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Note: the data is called from a WDI database; if you make it with Plotly, the data is stored with the plot. I forked the data and shared it: [plot.ly/~MattSundquist/1343](https://plot.ly/~MattSundquist/1343). "
},
{
"cell_type": "markdown",
"metadata": {},
"source": "If you want to use Plotly's default graph look, you can edit the graph with Python."
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig = py.get_figure('RgraphingAPI', '1457')\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/3820\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x7f54a80a9850>"
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Often we come to a visualization with data rather than coming to data with a visualization. In that case, Plotly is useful for quick exploration, with matplotlib or Plotly's API."
},
{
"cell_type": "code",
"collapsed": false,
"input": "my_data = py.get_figure('PythonAPI', '455').get_data()",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number":11
},
{
"cell_type": "code",
"collapsed": false,
"input": "%matplotlib inline\nimport matplotlib.pyplot as plt",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": "fig1 = plt.figure()\n\nplt.subplot(311)\nplt.plot(my_data[0]['x'], my_data[0]['y'])\nplt.subplot(312)\nplt.plot(my_data[1]['x'], my_data[1]['y'])\nplt.subplot(313)\nplt.plot(my_data[2]['x'], my_data[2]['y'])\n\npy.iplot_mpl(fig1, strip_style = True)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3821\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x7f54a3a63290>"
}
],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can also draw the graph [with subplots](http://plot.ly/python/subplots/) in Plotly."
},
{
"cell_type": "code",
"collapsed": false,
"input": "my_data[1]['yaxis'] = 'y2'\nmy_data[2]['yaxis'] = 'y3'\n\nlayout = Layout(\n yaxis=YAxis(\n domain=[0, 0.33]\n ),\n legend=Legend(\n traceorder='reversed'\n ),\n yaxis2=YAxis(\n domain=[0.33, 0.66]\n ),\n yaxis3=YAxis(\n domain=[0.66, 1]\n )\n)\n\nfig = Figure(data=my_data, layout=layout)\n\npy.iplot(fig)",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~IPython.Demo/3822\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x7f54a8154d90>"
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Then maybe I want to edit it quickly with a GUI, without coding. I click through to the graph in the \"data and graph\" link, fork my own copy, and can switch between graph types, styling options, and more."
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url = 'http://i.imgur.com/rHP53Oz.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"http://i.imgur.com/rHP53Oz.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 15,
"text": "<IPython.core.display.Image at 0x7f54a80d1e90>"
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Now, having re-styled it, we can call the graph back into the NB, and if we want, get the figure information for the new, updated graph. The graphs below are meant to show the flexibility available to you in styling from the GUI."
},
{
"cell_type": "code",
"collapsed": false,
"input": "tls.embed('MattSundquist', '1404')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~MattSundquist/1404\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x7f54a803c5d0>"
}
],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": "tls.embed('MattSundquist', '1339')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~MattSundquist/1339\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x7f54a803c110>"
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We can also get the data in a grid, and run stats, fits, functions, add error bars, and more. Plotly keeps data and graphs together. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url = 'http://i.imgur.com/JJkNPJg.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"http://i.imgur.com/JJkNPJg.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 18,
"text": "<IPython.core.display.Image at 0x7f54a80d18d0>"
}
],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {},
"source": "And there we have it. A reproducible figure, drawn with D3 that includes the plot, data, and plot structure. And you can easily call that figure or data as well. Check to see what URL it is by hoving on \"data and graph\" and then call that figure."
},
{
"cell_type": "code",
"collapsed": false,
"input": "ggplot = py.get_figure('MattSundquist', '1339') ",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": "ggplot #print it",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 20,
"text": "{'data': [{'line': {'color': 'rgb(31, 119, 180)', 'width': 4},\n 'mode': 'lines',\n 'name': 'Chile',\n 'type': 'scatter',\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n 600,\n 640,\n 660,\n 650,\n 740,\n 760,\n 770,\n 800,\n 860,\n 1020,\n 1110,\n 1320,\n 1620,\n 1120,\n 980,\n 1070,\n 1320,\n 1740,\n 2240,\n 2640,\n 2190,\n 1780,\n 1600,\n 1410,\n 1410,\n 1560,\n 1820,\n 2090,\n 2240,\n 2490,\n 3020,\n 3330,\n 3610,\n 4320,\n 4930,\n 5380,\n 5250,\n 4910,\n 4920,\n 4760,\n 4550,\n 4570,\n 5230,\n 6250,\n 7260,\n 8630,\n 10020,\n 9930,\n 10720,\n 12270,\n 14310]},\n {'line': {'color': 'rgb(255, 127, 14)', 'width': 4},\n 'mode': 'lines',\n 'name': 'Hungary',\n 'type': 'scatter',\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n 540,\n 590,\n 670,\n 830,\n 1000,\n 1150,\n 1200,\n 1330,\n 1520,\n 1770,\n 2070,\n 2200,\n 2170,\n 2010,\n 1930,\n 1860,\n 2040,\n 2400,\n 2710,\n 2770,\n 2880,\n 2740,\n 3140,\n 3630,\n 4000,\n 4220,\n 4320,\n 4370,\n 4380,\n 4460,\n 4580,\n 4720,\n 5210,\n 6550,\n 8540,\n 10220,\n 11040,\n 11510,\n 12890,\n 12980,\n 12930,\n 12900,\n 12410]},\n {'line': {'color': 'rgb(44, 160, 44)', 'width': 4},\n 'mode': 'lines',\n 'name': 'Uruguay',\n 'type': 'scatter',\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n 580,\n 610,\n 660,\n 680,\n 720,\n 640,\n 610,\n 670,\n 820,\n 850,\n 870,\n 1060,\n 1370,\n 1620,\n 1490,\n 1420,\n 1630,\n 2150,\n 2870,\n 3650,\n 3290,\n 2190,\n 1740,\n 1510,\n 1780,\n 2210,\n 2600,\n 2730,\n 2840,\n 3180,\n 3830,\n 4350,\n 5040,\n 5530,\n 6160,\n 6970,\n 7240,\n 7260,\n 7050,\n 6500,\n 5140,\n 4240,\n 4130,\n 4720,\n 5380,\n 6380,\n 7690,\n 8520,\n 10110,\n 11700,\n 13580]}],\n 'layout': {'annotations': [{'align': 'center',\n 'arrowcolor': '',\n 'arrowhead': 1,\n 'arrowsize': 1,\n 'arrowwidth': 0,\n 'ax': -10,\n 'ay': -28.335936546325684,\n 'bgcolor': 'rgba(0,0,0,0)',\n 'bordercolor': '',\n 'borderpad': 1,\n 'borderwidth': 1,\n 'font': {'color': '', 'family': '', 'size': 0},\n 'opacity': 1,\n 'showarrow': False,\n 'tag': '',\n 'text': 'Source: <a href=\"http://blogs.worldbank.org/opendata/accessing-world-bank-data-apis-python-r-ruby-stata\">World Bank</a>',\n 'x': 0.9880317848410782,\n 'xanchor': 'auto',\n 'xref': 'paper',\n 'y': 0.02994334820619583,\n 'yanchor': 'auto',\n 'yref': 'paper'}],\n 'autosize': True,\n 'bargap': 0.2,\n 'bargroupgap': 0,\n 'barmode': 'group',\n 'boxgap': 0.3,\n 'boxgroupgap': 0.3,\n 'boxmode': 'overlay',\n 'dragmode': 'zoom',\n 'font': {'color': 'rgb(67, 67, 67)',\n 'family': \"'Open sans', verdana, arial, sans-serif\",\n 'size': 12},\n 'height': 547,\n 'hidesources': False,\n 'hovermode': 'x',\n 'legend': {'bgcolor': '#fff',\n 'bordercolor': '#444',\n 'borderwidth': 0,\n 'font': {'color': '', 'family': '', 'size': 0},\n 'traceorder': 'normal',\n 'x': 1.02,\n 'xanchor': 'left',\n 'y': 0.5,\n 'yanchor': 'auto'},\n 'margin': {'autoexpand': True,\n 'b': 80,\n 'l': 80,\n 'pad': 0,\n 'r': 80,\n 't': 100},\n 'paper_bgcolor': '#fff',\n 'plot_bgcolor': 'rgba(245, 247, 247, 0.7)',\n 'separators': '.,',\n 'showlegend': True,\n 'title': 'GNI Per Capita ($USD Atlas Method)',\n 'titlefont': {'color': '', 'family': '', 'size': 0},\n 'width': 1304,\n 'xaxis': {'anchor': 'y',\n 'autorange': True,\n 'autotick': True,\n 'domain': [0, 1],\n 'dtick': 10,\n 'exponentformat': 'B',\n 'gridcolor': 'rgb(255, 255, 255)',\n 'gridwidth': 1,\n 'linecolor': '#444',\n 'linewidth': 1,\n 'mirror': False,\n 'nticks': 0,\n 'overlaying': False,\n 'position': 0,\n 'range': [1960, 2012],\n 'rangemode': 'normal',\n 'showexponent': 'all',\n 'showgrid': True,\n 'showline': False,\n 'showticklabels': True,\n 'tick0': 0,\n 'tickangle': 'auto',\n 'tickcolor': '#444',\n 'tickfont': {'color': '', 'family': '', 'size': 0},\n 'ticklen': 5,\n 'ticks': '',\n 'tickwidth': 1,\n 'title': 'year',\n 'titlefont': {'color': '', 'family': '', 'size': 0},\n 'type': 'linear',\n 'zeroline': False,\n 'zerolinecolor': '#444',\n 'zerolinewidth': 1},\n 'yaxis': {'anchor': 'x',\n 'autorange': True,\n 'autotick': True,\n 'domain': [0, 1],\n 'dtick': 'D1',\n 'exponentformat': 'B',\n 'gridcolor': 'rgb(255, 255, 255)',\n 'gridwidth': 1,\n 'linecolor': '#444',\n 'linewidth': 1,\n 'mirror': False,\n 'nticks': 0,\n 'overlaying': False,\n 'position': 0,\n 'range': [2.6533245446042573, 4.234708848978488],\n 'rangemode': 'normal',\n 'showexponent': 'all',\n 'showgrid': True,\n 'showline': False,\n 'showticklabels': True,\n 'tick0': 0,\n 'tickangle': 'auto',\n 'tickcolor': '#444',\n 'tickfont': {'color': '', 'family': '', 'size': 0},\n 'ticklen': 5,\n 'ticks': '',\n 'tickwidth': 1,\n 'title': 'NY.GNP.PCAP.CD',\n 'titlefont': {'color': '', 'family': '', 'size': 0},\n 'type': 'log',\n 'zeroline': False,\n 'zerolinecolor': '#444',\n 'zerolinewidth': 1}}}"
}
],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Want to analyze the data or use it for another figure?"
},
{
"cell_type": "code",
"collapsed": false,
"input": "ggplot_data = ggplot.get_data()",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": "ggplot_data",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 22,
"text": "{'data': [{'name': 'Chile',\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n 600,\n 640,\n 660,\n 650,\n 740,\n 760,\n 770,\n 800,\n 860,\n 1020,\n 1110,\n 1320,\n 1620,\n 1120,\n 980,\n 1070,\n 1320,\n 1740,\n 2240,\n 2640,\n 2190,\n 1780,\n 1600,\n 1410,\n 1410,\n 1560,\n 1820,\n 2090,\n 2240,\n 2490,\n 3020,\n 3330,\n 3610,\n 4320,\n 4930,\n 5380,\n 5250,\n 4910,\n 4920,\n 4760,\n 4550,\n 4570,\n 5230,\n 6250,\n 7260,\n 8630,\n 10020,\n 9930,\n 10720,\n 12270,\n 14310]},\n {'name': 'Hungary',\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n 540,\n 590,\n 670,\n 830,\n 1000,\n 1150,\n 1200,\n 1330,\n 1520,\n 1770,\n 2070,\n 2200,\n 2170,\n 2010,\n 1930,\n 1860,\n 2040,\n 2400,\n 2710,\n 2770,\n 2880,\n 2740,\n 3140,\n 3630,\n 4000,\n 4220,\n 4320,\n 4370,\n 4380,\n 4460,\n 4580,\n 4720,\n 5210,\n 6550,\n 8540,\n 10220,\n 11040,\n 11510,\n 12890,\n 12980,\n 12930,\n 12900,\n 12410]},\n {'name': 'Uruguay',\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n 580,\n 610,\n 660,\n 680,\n 720,\n 640,\n 610,\n 670,\n 820,\n 850,\n 870,\n 1060,\n 1370,\n 1620,\n 1490,\n 1420,\n 1630,\n 2150,\n 2870,\n 3650,\n 3290,\n 2190,\n 1740,\n 1510,\n 1780,\n 2210,\n 2600,\n 2730,\n 2840,\n 3180,\n 3830,\n 4350,\n 5040,\n 5530,\n 6160,\n 6970,\n 7240,\n 7260,\n 7050,\n 6500,\n 5140,\n 4240,\n 4130,\n 4720,\n 5380,\n 6380,\n 7690,\n 8520,\n 10110,\n 11700,\n 13580]}],\n 'layout': [{}]}"
}
],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Want to use Python to analyze your data? You can read that data into a pandas DataFrame. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "import pandas as pd",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 23
},
{
"cell_type": "code",
"collapsed": false,
"input": "my_data = py.get_figure('MattSundquist', '1339').get_data()\nframes = {data['name']: {'x': data['x'], 'y': data['y']} for data in my_data['data']}\ndf = pd.DataFrame(frames)\ndf",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Chile</th>\n <th>Hungary</th>\n <th>Uruguay</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>x</th>\n <td> [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196...</td>\n <td> [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196...</td>\n <td> [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196...</td>\n </tr>\n <tr>\n <th>y</th>\n <td> [None, None, 600, 640, 660, 650, 740, 760, 770...</td>\n <td> [None, None, None, None, None, None, None, Non...</td>\n <td> [None, None, 580, 610, 660, 680, 720, 640, 610...</td>\n </tr>\n </tbody>\n</table>\n<p>2 rows \u00d7 3 columns</p>\n</div>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 24,
"text": " Chile \\\nx [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196... \ny [None, None, 600, 640, 660, 650, 740, 760, 770... \n\n Hungary \\\nx [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196... \ny [None, None, None, None, None, None, None, Non... \n\n Uruguay \nx [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196... \ny [None, None, 580, 610, 660, 680, 720, 640, 610... \n\n[2 rows x 3 columns]"
}
],
"prompt_number": 24
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Plotly has interactive support that lets you call help on graph objects. Try `layout` or `data` too. For example."
},
{
"cell_type": "code",
"collapsed": false,
"input": "from plotly.graph_objs import Data, Layout, Figure",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": "help(Figure)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "Help on class Figure in module plotly.graph_objs.graph_objs:\n\nclass Figure(PlotlyDict)\n | A dictionary-like object representing a figure to be rendered in plotly.\n | \n | This is the container for all things to be rendered in a figure.\n | \n | For help with setting up subplots, run:\n | `help(plotly.tools.get_subplots)`\n | \n | \n | Quick method reference:\n | \n | Figure.update(changes)\n | Figure.strip_style()\n | Figure.get_data()\n | Figure.to_graph_objs()\n | Figure.validate()\n | Figure.to_string()\n | Figure.force_clean()\n | \n | Valid keys:\n | \n | data [required=False] (value=Data object | dictionary-like):\n | A list-like array of the data that is to be visualized.\n | \n | For more, run `help(plotly.graph_objs.Data)`\n | \n | layout [required=False] (value=Layout object | dictionary-like):\n | The layout dictionary-like object contains axes information, gobal\n | settings, and layout information related to the rendering of the\n | figure.\n | \n | For more, run `help(plotly.graph_objs.Layout)`\n | \n | Method resolution order:\n | Figure\n | PlotlyDict\n | __builtin__.dict\n | __builtin__.object\n | \n | Methods defined here:\n | \n | __init__(self, *args, **kwargs)\n | \n | ----------------------------------------------------------------------\n | Methods inherited from PlotlyDict:\n | \n | force_clean(self)\n | Attempts to convert to graph_objs and call force_clean() on values.\n | \n | Calling force_clean() on a PlotlyDict will ensure that the object is\n | valid and may be sent to plotly. This process will also remove any\n | entries that end up with a length == 0.\n | \n | Careful! This will delete any invalid entries *silently*.\n | \n | get_data(self)\n | Returns the JSON for the plot with non-data elements stripped.\n | \n | strip_style(self)\n | Strip style from the current representation.\n | \n | All PlotlyDicts and PlotlyLists are guaranteed to survive the\n | stripping process, though they made be left empty. This is allowable.\n | \n | Keys that will be stripped in this process are tagged with\n | `'type': 'style'` in the INFO dictionary listed in graph_objs_meta.py.\n | \n | This process first attempts to convert nested collections from dicts\n | or lists to subclasses of PlotlyList/PlotlyDict. This process forces\n | a validation, which may throw exceptions.\n | \n | Then, each of these objects call `strip_style` on themselves and so\n | on, recursively until the entire structure has been validated and\n | stripped.\n | \n | to_graph_objs(self)\n | Walk obj, convert dicts and lists to plotly graph objs.\n | \n | For each key in the object, if it corresponds to a special key that\n | should be associated with a graph object, the ordinary dict or list\n | will be reinitialized as a special PlotlyDict or PlotlyList of the\n | appropriate `kind`.\n | \n | to_string(self, level=0, indent=4, eol='\\n', pretty=True, max_chars=80)\n | Returns a formatted string showing graph_obj constructors.\n | \n | Example:\n | \n | print obj.to_string()\n | \n | Keyword arguments:\n | level (default = 0) -- set number of indentations to start with\n | indent (default = 4) -- set indentation amount\n | eol (default = '\n | ') -- set end of line character(s)\n | pretty (default = True) -- curtail long list output with a '...'\n | max_chars (default = 80) -- set max characters per line\n | \n | update(self, dict1=None, **dict2)\n | Update current dict with dict1 and then dict2.\n | \n | This recursively updates the structure of the original dictionary-like\n | object with the new entries in the second and third objects. This\n | allows users to update with large, nested structures.\n | \n | Note, because the dict2 packs up all the keyword arguments, you can\n | specify the changes as a list of keyword agruments.\n | \n | Examples:\n | # update with dict\n | obj = Layout(title='my title', xaxis=XAxis(range=[0,1], domain=[0,1]))\n | update_dict = dict(title='new title', xaxis=dict(domain=[0,.8]))\n | obj.update(update_dict)\n | obj\n | {'title': 'new title', 'xaxis': {'range': [0,1], 'domain': [0,.8]}}\n | \n | # update with list of keyword arguments\n | obj = Layout(title='my title', xaxis=XAxis(range=[0,1], domain=[0,1]))\n | obj.update(title='new title', xaxis=dict(domain=[0,.8]))\n | obj\n | {'title': 'new title', 'xaxis': {'range': [0,1], 'domain': [0,.8]}}\n | \n | This 'fully' supports duck-typing in that the call signature is\n | identical, however this differs slightly from the normal update\n | method provided by Python's dictionaries.\n | \n | validate(self)\n | Recursively check the validity of the keys in a PlotlyDict.\n | \n | The valid keys constitute the entries in each object\n | dictionary in INFO stored in graph_objs_meta.py.\n | \n | The validation process first requires that all nested collections be\n | converted to the appropriate subclass of PlotlyDict/PlotlyList. Then,\n | each of these objects call `validate` and so on, recursively,\n | until the entire object has been validated.\n | \n | ----------------------------------------------------------------------\n | Data descriptors inherited from PlotlyDict:\n | \n | __dict__\n | dictionary for instance variables (if defined)\n | \n | __weakref__\n | list of weak references to the object (if defined)\n | \n | ----------------------------------------------------------------------\n | Data and other attributes inherited from PlotlyDict:\n | \n | __metaclass__ = <class 'plotly.graph_objs.graph_objs.DictMeta'>\n | A meta class for PlotlyDict class creation.\n | \n | The sole purpose of this meta class is to properly create the __doc__\n | attribute so that running help(Obj), where Obj is a subclass of PlotlyDict,\n | will return information about key-value pairs for that object.\n | \n | ----------------------------------------------------------------------\n | Methods inherited from __builtin__.dict:\n | \n | __cmp__(...)\n | x.__cmp__(y) <==> cmp(x,y)\n | \n | __contains__(...)\n | D.__contains__(k) -> True if D has a key k, else False\n | \n | __delitem__(...)\n | x.__delitem__(y) <==> del x[y]\n | \n | __eq__(...)\n | x.__eq__(y) <==> x==y\n | \n | __ge__(...)\n | x.__ge__(y) <==> x>=y\n | \n | __getattribute__(...)\n | x.__getattribute__('name') <==> x.name\n | \n | __getitem__(...)\n | x.__getitem__(y) <==> x[y]\n | \n | __gt__(...)\n | x.__gt__(y) <==> x>y\n | \n | __iter__(...)\n | x.__iter__() <==> iter(x)\n | \n | __le__(...)\n | x.__le__(y) <==> x<=y\n | \n | __len__(...)\n | x.__len__() <==> len(x)\n | \n | __lt__(...)\n | x.__lt__(y) <==> x<y\n | \n | __ne__(...)\n | x.__ne__(y) <==> x!=y\n | \n | __repr__(...)\n | x.__repr__() <==> repr(x)\n | \n | __setitem__(...)\n | x.__setitem__(i, y) <==> x[i]=y\n | \n | __sizeof__(...)\n | D.__sizeof__() -> size of D in memory, in bytes\n | \n | clear(...)\n | D.clear() -> None. Remove all items from D.\n | \n | copy(...)\n | D.copy() -> a shallow copy of D\n | \n | fromkeys(...)\n | dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n | v defaults to None.\n | \n | get(...)\n | D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.\n | \n | has_key(...)\n | D.has_key(k) -> True if D has a key k, else False\n | \n | items(...)\n | D.items() -> list of D's (key, value) pairs, as 2-tuples\n | \n | iteritems(...)\n | D.iteritems() -> an iterator over the (key, value) items of D\n | \n | iterkeys(...)\n | D.iterkeys() -> an iterator over the keys of D\n | \n | itervalues(...)\n | D.itervalues() -> an iterator over the values of D\n | \n | keys(...)\n | D.keys() -> list of D's keys\n | \n | pop(...)\n | D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n | If key is not found, d is returned if given, otherwise KeyError is raised\n | \n | popitem(...)\n | D.popitem() -> (k, v), remove and return some (key, value) pair as a\n | 2-tuple; but raise KeyError if D is empty.\n | \n | setdefault(...)\n | D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D\n | \n | values(...)\n | D.values() -> list of D's values\n | \n | viewitems(...)\n | D.viewitems() -> a set-like object providing a view on D's items\n | \n | viewkeys(...)\n | D.viewkeys() -> a set-like object providing a view on D's keys\n | \n | viewvalues(...)\n | D.viewvalues() -> an object providing a view on D's values\n | \n | ----------------------------------------------------------------------\n | Data and other attributes inherited from __builtin__.dict:\n | \n | __hash__ = None\n | \n | __new__ = <built-in method __new__ of type object>\n | T.__new__(S, ...) -> a new object with type S, a subtype of T\n\n"
}
],
"prompt_number": 26
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "III. MATLAB, Julia, and Perl plotting with Plotly"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We just made a plot with R using `ggplot2`, edited it in an IPython Notebook with Python, edited with our web app, shared it, and read the data into a pandas DataFrame. We have [another Notebook](nbviewer.ipython.org/gist/msund/11349097) that shows how to use Plotly with [seaborn](stanford.edu/~mwaskom/software/seaborn/tutorial.html), [prettyplotlib](https://github.com/olgabot/prettyplotlib), and [ggplot for Python](http://ggplot.yhathq.com/) Your whole team can now collaborate, regardless of technical capability or language of choice. This linguistic flexibility and technical interoperability powers collaboration, and it's what Plotly is all about. Let's jump into a few more examples."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Let's say you see some code and data for a [MATLAB gallery](http://www.mathworks.com/matlabcentral/fileexchange/35265-matlab-plot-gallery-log-log-plot/content/html/Loglog_Plot.html) plot you love and want to share."
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url = 'http://i.imgur.com/bGj8EzI.png?1')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"http://i.imgur.com/bGj8EzI.png?1\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 27,
"text": "<IPython.core.display.Image at 0x7f54c5f14c50>"
}
],
"prompt_number": 27
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can use Plotly's [MATLAB API](plot.ly/MATLAB) to make a shareable plots, with LaTeX included. You run the MATLAB code in your MATLAB environrment or the [MATLAB kernel](https://github.com/ipython/ipython/wiki/Extensions-Index#matlab) in IPython and add `fig2plotly` to the call. Check out [this Notebook](http://nbviewer.ipython.org/github/plotly/IPython-plotly/blob/master/See%20more/MATLAB_Wrapper_Examples.ipynb) to see the installation and setup."
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%matlab\n",
"\n",
"close all\n",
"\n",
"% Create a set of values for the damping factor\n",
"zeta = [0.01 .02 0.05 0.1 .2 .5 1 ];\n",
"\n",
"% Define a color for each damping factor\n",
"colors = ['r' 'g' 'b' 'c' 'm' 'y' 'k'];\n",
"\n",
"% Create a range of frequency values equally spaced logarithmically\n",
"w = logspace(-1, 1, 1000);\n",
"\n",
"% Plot the gain vs. frequency for each of the seven damping factors\n",
"figure;\n",
"for i = 1:7\n",
" a = w.^2 - 1;\n",
" b = 2*w*zeta(i);\n",
" gain = sqrt(1./(a.^2 + b.^2));\n",
" loglog(w, gain, 'color', colors(i), 'linewidth', 2);\n",
" hold on;\n",
"end\n",
"\n",
"% Set the axis limits\n",
"axis([0.1 10 0.01 100]);\n",
"\n",
"% Add a title and axis labels\n",
"title('Gain vs Frequency');\n",
"xlabel('Frequency');\n",
"ylabel('Gain');\n",
"\n",
"% Turn the grid on\n",
"grid on;\n",
"\n",
"% ----------------------------------------\n",
"% Let's convert the figure to plotly structures, and set stripping to false\n",
"[data, layout] = convertFigure(get(gcf), false);\n",
"\n",
"% But, before we publish, let's modify and add some features:\n",
"% Naming the traces\n",
"for i=1:numel(data)\n",
" data{i}.name = ['$\\\\zeta = ' num2str(zeta(i)) '$']; %LATEX FORMATTING\n",
" data{i}.showlegend = true;\n",
"end\n",
"% Adding a nice the legend\n",
"legendstyle = struct( ...\n",
" 'x' , 0.15, ...\n",
" 'y' , 0.9, ...\n",
" 'bgcolor' , '#E2E2E2', ...\n",
" 'bordercolor' , '#FFFFFF', ...\n",
" 'borderwidth' , 2, ...\n",
" 'traceorder' , 'normal' ...\n",
" );\n",
"layout.legend = legendstyle;\n",
"layout.showlegend = true;\n",
"\n",
"% Setting the hover mode\n",
"layout.hovermode = 'closest';\n",
"\n",
"% Giving the plot a custom name\n",
"plot_name = 'My_improved_plot';\n",
"\n",
"% Sending to Plotly\n",
"response = plotly(data, struct('layout', layout, ...\n",
" 'filename',plot_name, ...\n",
"\t'fileopt', 'overwrite'));\n",
"\n",
"display(response.url)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"https://plot.ly/~MATLAB-demos/4\r\n"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n"
}
],
"prompt_number": 28
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Which produces:"
},
{
"cell_type": "code",
"collapsed": false,
"input": "tls.embed('MATLAB-Demos', '4')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~MATLAB-Demos/4\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x7f549f5b1e10>"
}
],
"prompt_number": 29
},
{
"cell_type": "markdown",
"metadata": {},
"source": "And you can similary collaborate across all Plotly APIs, working on plots from [IJulia](http://nbviewer.ipython.org/github/plotly/IPython-plotly/blob/master/See%20more/IJulia%20-%20Multiple%20Axes%2C%20Subplots%20and%20Insets.ipynb), Perl, Arduino, Raspberry Pi, or Ruby. You could also append data to any figure from any API, or from the GUI. Want to make your own wrapper? Check out our [REST API](http://plot.ly/rest/). "
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "IV. WebPlotDigitizer and Plotly"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Let's suppose next that you wanted to plot data from a graph you loved in a [Facebook Data Science post](https://www.facebook.com/notes/facebook-data-science/mothers-day-2014/10152235539518859). "
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url = 'https://i.imgur.com/sAHsjk3.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"https://i.imgur.com/sAHsjk3.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 30,
"text": "<IPython.core.display.Image at 0x7f549f5b1c10>"
}
],
"prompt_number": 30
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can take a screenshot, and drag and drop the image into [WebPlotDigitizer](http://arohatgi.info/WebPlotDigitizer/app/). Here's [a tutorial](http://blog.plot.ly/post/70293893434/automatically-grab-data-from-an-image-with) on using the helpful tool, which includes the handy [\"Graph in Plotly\"](https://plot.ly/export/) button. You can put it on your website so your users can easily access, graph, and share your data. And it links to your source."
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image (url = 'https://i.imgur.com/y4t5hdj.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"https://i.imgur.com/y4t5hdj.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 31,
"text": "<IPython.core.display.Image at 0x7f549f5b1910>"
}
],
"prompt_number": 31
},
{
"cell_type": "markdown",
"metadata": {},
"source": "I can then make and share the graph in Plotly. You could do this to access data in any images you find online, then add fits or data from the grid or APIs. Check out [our post with five fits](http://blog.plot.ly/post/84309369787/best-fit-lines-in-plotly) to see more."
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image (url = 'http://i.imgur.com/BUOe85E.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"http://i.imgur.com/BUOe85E.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 32,
"text": "<IPython.core.display.Image at 0x7f54a3a399d0>"
}
],
"prompt_number": 32
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We'll add a fit then style it a bit."
},
{
"cell_type": "code",
"collapsed": false,
"input": "tls.embed('MattSundquist', '1337')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~MattSundquist/1337\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x7f549f5b1cd0>"
}
],
"prompt_number": 33
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "V. Revisions, embedding, and sharing"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We can share it to edit collaboratively, privately or publicly. I can share straight [into a folder](http://plot.ly/python/file-sharing) from the API. My collaborators and I can always [add, append, or extend data](http://plot.ly/python/add-append-extend) to that same plot with Python, R, or the GUI. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url = 'http://i.imgur.com/YRyTCQy.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"http://i.imgur.com/YRyTCQy.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 34,
"text": "<IPython.core.display.Image at 0x7f549f5b1a50>"
}
],
"prompt_number": 34
},
{
"cell_type": "markdown",
"metadata": {},
"source": "We can also save revisions and versions. "
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image (url = 'http://i.imgur.com/ATn7vE4.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"http://i.imgur.com/ATn7vE4.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 35,
"text": "<IPython.core.display.Image at 0x7f549f5b1d50>"
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can also export your plot for presentations, emails, infographics, or publications, but link back to the online version so others can access your figure and data."
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url = 'http://i.imgur.com/QaIw9p4.png?1')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"http://i.imgur.com/QaIw9p4.png?1\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 36,
"text": "<IPython.core.display.Image at 0x7f549f5b1bd0>"
}
],
"prompt_number": 36
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can also stop emailing files around. Have your discussion in context in Plotly. The graph being discussed is [here](https://plot.ly/~etpinard/25/average-daily-surface-air-temperature-anomalies-in-deg-c-from-2013-12-01-to-2014/)."
},
{
"cell_type": "code",
"collapsed": false,
"input": "Image(url = 'http://i.imgur.com/OqXKs0r.png')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<img src=\"http://i.imgur.com/OqXKs0r.png\"/>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 37,
"text": "<IPython.core.display.Image at 0x7f549f5b1a90>"
}
],
"prompt_number": 37
},
{
"cell_type": "markdown",
"metadata": {},
"source": "And displaying in your browser in an iframe is easy. You can copy and paste the snippet below and put it in a blog or website and get a live, interactive graph that lets your readers zoom, toggle, and get text on the hover."
},
{
"cell_type": "code",
"collapsed": false,
"input": "from IPython.display import HTML",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 38
},
{
"cell_type": "code",
"collapsed": false,
"input": "i = \"\"\"<pre style=\"background:#f1f1f1;color:#000\">&lt;iframe src=<span style=\"color:#c03030\">\"https://plot.ly/~MattSundquist/1334/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>\n</span></pre>\"\"\"",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 39
},
{
"cell_type": "code",
"collapsed": false,
"input": "h = HTML(i); h",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<pre style=\"background:#f1f1f1;color:#000\">&lt;iframe src=<span style=\"color:#c03030\">\"https://plot.ly/~MattSundquist/1334/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>\n</span></pre>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 40,
"text": "<IPython.core.display.HTML at 0x7f549f5b1c50>"
}
],
"prompt_number": 40
},
{
"cell_type": "markdown",
"metadata": {},
"source": "It's also interactive, even when embedded."
},
{
"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": 41,
"text": "<IPython.core.display.HTML at 0x7f549f5b1c90>"
}
],
"prompt_number": 41
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Your profile keeps all your graphs and data together 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": 42,
"text": "<IPython.core.display.Image at 0x7f549f5b1d10>"
}
],
"prompt_number": 42
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Plotly also does content. Check out our's posts on [boxplots](https://plotly/boxplots) or [histograms](https://plot.ly/histograms)."
},
{
"cell_type": "code",
"collapsed": false,
"input": "HTML('<center><iframe class=\"vine-embed\" src=\"https://vine.co/v/M6JBhdiqPqA/embed/simple\" width=\"600\" height=\"600\" frameborder=\"0\"></iframe><script async src=\"//platform.vine.co/static/scripts/embed.js\" charset=\"utf-8\"></script></center>')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<center><iframe class=\"vine-embed\" src=\"https://vine.co/v/M6JBhdiqPqA/embed/simple\" width=\"600\" height=\"600\" frameborder=\"0\"></iframe><script async src=\"//platform.vine.co/static/scripts/embed.js\" charset=\"utf-8\"></script></center>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 43,
"text": "<IPython.core.display.HTML at 0x7f549f5b1cd0>"
}
],
"prompt_number": 43
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": "VI. Streaming Graphs"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can stream data into Plotly. That means you could publish your results to anyone in the world by streaming it through Plotly. You could also send data from multiple sources and languages, and keep your data around to analyze and publish it."
},
{
"cell_type": "code",
"collapsed": false,
"input": "tls.embed('flann321', '9')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~flann321/9\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x7f549f332fd0>"
}
],
"prompt_number": 44
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Or you can even stream in real-time. Check out a [Notebook here](http://nbviewer.ipython.org/github/plotly/python-user-guide/blob/master/s7_streaming/s7_streaming.ipynb) or see our [Raspberry Pi Instructable](http://www.instructables.com/id/Plotly-Atlas-Scientific-Graph-Real-Time-Dissolved-/) showing real-time dissolved oxygen."
},
{
"cell_type": "code",
"collapsed": false,
"input": "tls.embed('streaming-demos','4')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~streaming-demos/4\" height=\"525\" width=\"100%\"></iframe>",
"metadata": {},
"output_type": "display_data",
"text": "<IPython.core.display.HTML at 0x7f549f332910>"
}
],
"prompt_number": 45
},
{
"cell_type": "markdown",
"metadata": {},
"source": "You can stream from basically anywhere."
},
{
"cell_type": "code",
"collapsed": false,
"input": "HTML('<center><iframe src=\"//instagram.com/p/nJkMMQRyvS/embed/\" width=\"612\" height=\"710\" frameborder=\"0\" scrolling=\"no\" allowtransparency=\"true\"></iframe></center>')",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<center><iframe src=\"//instagram.com/p/nJkMMQRyvS/embed/\" width=\"612\" height=\"710\" frameborder=\"0\" scrolling=\"no\" allowtransparency=\"true\"></iframe></center>",
"metadata": {},
"output_type": "pyout",
"prompt_number": 46,
"text": "<IPython.core.display.HTML at 0x7f549f5b1ed0>"
}
],
"prompt_number": 46
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Suggestions or comments? Email feedback@plot.ly or find us at [@plotlygraphs](twitter.com/plotlygraphs). Happy plotting!"
},
{
"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": 47,
"text": "<IPython.core.display.HTML at 0x7f549f332d10>"
}
],
"prompt_number": 47
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment