{ "metadata": { "name": "", "signature": "sha256:62c9fb2a2551a3c634fb9597cfe3aaa55608c02bdb9235440621cd9098a64944" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "from IPython.core.display import HTML\n", "\n", "with open('creative_commons.txt', 'r') as f:\n", " html = f.read()\n", " \n", "name = '2014-01-13-tides_mpld3'\n", "\n", "html = \"\"\"\n", "\n", "
This post was written as an IPython notebook. It is available for\n", "download or as a static\n", "html.
\n", "\n", "%s \"\"\" % (name, name, html)\n", "\n", "%matplotlib inline\n", "from matplotlib import style\n", "style.use('ggplot')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "I usually use IPython notebook in my classes, they are a great tool for\n", "teaching code and science or even both at the same time.\n", "\n", "However, when I am using the notebook to teach, I miss interaction with\n", "matplotlib figures. One can drop the `%matplotlib inline` magic to force the\n", "figures to pop-up in the screen and use the interaction, but that's confusing, force\n", "students to deal with multiple windows, and breaks the linear flow of the\n", "notebook.\n", "\n", "I've looked at some alternative to create interactive figures in HTML documents like:\n", "\n", "- [Bokeh](http://bokeh.pydata.org/)\n", "- [d3po](http://d3po.org/)\n", "- [d3py](https://github.com/mikedewar/d3py)\n", "- [glue](http://www.glueviz.org/)\n", "- [plot.ly](https://plot.ly/)\n", "- [vispy](http://vispy.org/)\n", "\n", "Some of those, like Bokeh, even have some sort of [integration](http://bokeh.pydata.org/quickstart.html#example-ipython-notebooks)\n", "with the IPython notebook. The problem with them is that they all require you to learn a new tool!\n", "\n", "So [here](http://jakevdp.github.io/blog/2013/12/19/a-d3-viewer-for-matplotlib/) comes\n", "[Jake](http://jakevdp.github.io/) to the rescue! (Like he already did\n", "[before](http://jakevdp.github.io/blog/2013/12/05/static-interactive-widgets/),\n", "and [before](http://jakevdp.github.io/blog/2013/06/01/ipython-notebook-javascript-python-communication/),\n", "and [before](http://jakevdp.github.io/blog/2013/05/19/a-javascript-viewer-for-matplotlib-animations/)...)\n", "He is developing a [D3 Renderings of Matplotlib Graphics](https://github.com/jakevdp/mpld3).\n", "That means we can keep using the familiar matplotlib interface to make nice d3 interactive plots.\n", "\n", "As an example I will re-write my tidal harmonic analysis using his `mpld3` module so my student will be\n", "able to explore the plot, zooming-in and -out at any point.\n", "\n", "For that I will use sea level data from the\n", "[GLOSS Station 194](https://www.bodc.ac.uk/data/information_and_inventories/gloss_handbook/stations/194/). Here is the data format:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%bash\n", "sed -n 71,83p ./data/gloss_hourly.fmt" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " The data records are coded as:\r\n", "\r\n", " field bytes length comment\r\n", " ----------------- ------- ------ ------------------------------------\r\n", " station number 1-3 3 exactly 3 digits\r\n", " station version 4 1 letter from A to Z\r\n", " station name 6-9 4 Abbreviated if necessary\r\n", " year 12-15 4\r\n", " month 16-17 2 numerical value\r\n", " day 18-19 2\r\n", " day record count 20 1 either 1 or 2\r\n", " sea level data 21-80 60 12 sea level values,\r\n", " hours 00-11 (1); hours 12-23 (2)\r\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "To read that data let's define some handy functions and load the data directly from the zipfile into a pandas Series object." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import os\n", "import numpy as np\n", "import numpy.ma as ma\n", "\n", "from zipfile import ZipFile\n", "from datetime import datetime\n", "from pandas import Series, date_range\n", "\n", "def basename(fname):\n", " return os.path.splitext(os.path.basename(fname))[0]\n", "\n", "\n", "def make_date(data):\n", " date = str(int(data))[:-1]\n", " return datetime.strptime(date, '%Y%m%d')\n", "\n", "\n", "def load_gloss(fname):\n", " data = np.loadtxt(fname, skiprows=1, usecols=range(2, 15))\n", " elev = ma.masked_equal(data[:, 1:].ravel(), 9999)\n", " start = make_date(data[0, 0])\n", " dates = date_range(start, periods=len(elev), freq='H')\n", " return Series(elev, index=dates)\n", "\n", "series = Series()\n", "with ZipFile('./data/h281a.zip', 'r') as ziped:\n", " for fname in sorted(ziped.namelist()):\n", " if not fname.endswith('/'): # Skip directories.\n", " if False:\n", " with ziped.open(fname) as f:\n", " print(f.readline())\n", " name = basename(fname)\n", " series = series.append(load_gloss(ziped.open(fname)))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can convert the data from millimeters to meters, print a data description, and produce a quick plot to inspect the data." ] }, { "cell_type": "code", "collapsed": false, "input": [ "series /= 1e3\n", "print(series.describe())\n", "ax = series.plot(figsize=(10, 3))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "count 457699.000000\n", "mean 1.689822\n", "std 0.404013\n", "min 0.140000\n", "25% 1.400000\n", "50% 1.690000\n", "75% 1.980000\n", "max 4.880000\n", "dtype: float64\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\njVUAAAAASUVORK5CYII=\n", "text": [ "This post was written as an IPython notebook. It is available for\n", "download or as a static\n", "html.
\n", "\n", "