Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aflaxman/8780140 to your computer and use it in GitHub Desktop.
Save aflaxman/8780140 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"!date"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Sun Feb 2 23:33:08 PST 2014\r\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt, mpld3\n",
"mpld3.enable_notebook(\"//cdnjs.cloudflare.com/ajax/libs/d3/3.4.1/d3.min.js\")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from mpld3 import plugins"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fig, ax = plt.subplots()\n",
"points = ax.plot([3,1,4,1,5,9,2,6,5,3,5,8], 'o-', color='grey', ms=20, mew=5, linewidth=4)\n",
"ax.set_ylim(bottom=-1, top=10)\n",
"plugins.connect(fig, \n",
" plugins.ResetButton(),\n",
" plugins.ConfigurableZoomAndPan(\n",
" ax, zoom_y=False, xlim=(-1,15), ylim=(-1,10))\n",
" )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" <style>\n",
"\n",
"\n",
" div#figuredcc2064e83624ef9b3bfe3e156468365\n",
" .axesbg{\n",
" fill: #FFFFFF;\n",
" }\n",
"\n",
"\n",
"\n",
"div#figuredcc2064e83624ef9b3bfe3e156468365\n",
".axis line, .axis path {\n",
" shape-rendering: crispEdges;\n",
" stroke: black;\n",
" fill: none;\n",
"}\n",
"\n",
"div#figuredcc2064e83624ef9b3bfe3e156468365\n",
".axis text {\n",
" font-family: sans-serif;\n",
" font-size: 10.0px;\n",
" fill: black;\n",
" stroke: none;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figuredcc2064e83624ef9b3bfe3e156468365\n",
".axis line, .axis path {\n",
" shape-rendering: crispEdges;\n",
" stroke: black;\n",
" fill: none;\n",
"}\n",
"\n",
"div#figuredcc2064e83624ef9b3bfe3e156468365\n",
".axis text {\n",
" font-family: sans-serif;\n",
" font-size: 10.0px;\n",
" fill: black;\n",
" stroke: none;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figuredcc2064e83624ef9b3bfe3e156468365\n",
".axes1\n",
"path.line3 {\n",
" stroke: #808080;\n",
" stroke-width: 4;\n",
" stroke-dasharray: 10,0;\n",
" fill: none;\n",
" stroke-opacity: 1;\n",
"}\n",
"\n",
"div#figuredcc2064e83624ef9b3bfe3e156468365\n",
".axes1\n",
"path.points3 {\n",
" stroke-width: 5;\n",
" stroke: #000000;\n",
" fill: #808080;\n",
" fill-opacity: 1;\n",
" stroke-opacity: 1;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figuredcc2064e83624ef9b3bfe3e156468365\n",
"text.texte6dfd627242d4a7c9ea59c33e9c64372 {\n",
" font-size : 10.0px;\n",
" fill : #000000;\n",
" opacity : 1;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figuredcc2064e83624ef9b3bfe3e156468365\n",
"text.texte25cdec4e33c431797cfec9ce0ff9d00 {\n",
" font-size : 10.0px;\n",
" fill : #000000;\n",
" opacity : 1;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figuredcc2064e83624ef9b3bfe3e156468365\n",
"text.text513779199aae4d5181e5f9b0cfc0855b {\n",
" font-size : 12.0px;\n",
" fill : #000000;\n",
" opacity : 1;\n",
"}\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" </style>\n",
"\n",
"\n",
"\n",
" <div id='figuredcc2064e83624ef9b3bfe3e156468365'>\n",
" </div>\n",
" <script type=\"text/javascript\">\n",
" var create_figdcc2064e83624ef9b3bfe3e156468365 = function(d3, undefined){\n",
"\n",
"\n",
" function Figure(figid, width, height){\n",
" this.figid = figid;\n",
" this.root = d3.select(figid);\n",
" this.width = width;\n",
" this.height = height;\n",
" this.axes = [];\n",
" }\n",
"\n",
" Figure.prototype.draw = function(){\n",
" this.canvas = this.root.append('svg:svg')\n",
" .attr('class', 'figure')\n",
" .attr('width', this.width)\n",
" .attr('height', this.height);\n",
" for (var i=0; i<this.axes.length; i++){\n",
" this.axes[i].draw();\n",
" }\n",
" };\n",
"\n",
" Figure.prototype.reset = function(duration){\n",
" duration = (typeof duration !== 'undefined') ? duration : 750;\n",
" for (var i=0; i<this.axes.length; i++){\n",
" this.axes[i].prep_reset();\n",
" }\n",
"\n",
" var transition = function(t){\n",
" for (var i=0; i<this.axes.length; i++){\n",
" this.axes[i].xdom(this.axes[i].xdom.domain(this.axes[i].ix(t)));\n",
" this.axes[i].ydom(this.axes[i].ydom.domain(this.axes[i].iy(t)));\n",
"\n",
" // don't propagate: this will be done as part of the loop.\n",
" this.axes[i].zoomed(false);\n",
" }\n",
" }.bind(this)\n",
"\n",
" d3.transition().duration(duration)\n",
" .tween(\"zoom\", function(){return transition;});\n",
"\n",
" for (var i=0; i<this.axes.length; i++){\n",
" this.axes[i].finalize_reset();\n",
" }\n",
" };\n",
"\n",
"\n",
"\n",
" function Axes(fig, bbox,\n",
" xlim, ylim,\n",
" xscale, yscale,\n",
" xdomain, ydomain,\n",
" xgridOn, ygridOn,\n",
" axclass, clipid,\n",
" zoomable){\n",
" this.axnum = fig.axes.length;\n",
" fig.axes.push(this);\n",
"\n",
" this.fig = fig;\n",
" this.bbox = bbox;\n",
" this.xlim = xlim;\n",
" this.ylim = ylim;\n",
" this.xdomain = xdomain;\n",
" this.ydomain = ydomain;\n",
" this.xscale = xscale;\n",
" this.yscale = yscale;\n",
" this.xgridOn = xgridOn;\n",
" this.ygridOn = ygridOn;\n",
" this.axclass = (typeof axclass !== 'undefined') ? axclass : \"axes\";\n",
" this.clipid = (typeof clipid != 'undefined') ? clipid : \"clip\";\n",
" this.zoomable = zoomable;\n",
"\n",
" this.sharex = [];\n",
" this.sharey = [];\n",
" this.elements = [];\n",
"\n",
" this.position = [this.bbox[0] * this.fig.width,\n",
" (1 - this.bbox[1] - this.bbox[3]) * this.fig.height];\n",
" this.width = bbox[2] * this.fig.width;\n",
" this.height = bbox[3] * this.fig.height;\n",
"\n",
" if(this.xscale === 'log'){\n",
" this.xdom = d3.scale.log();\n",
" }else if(this.xscale === 'date'){\n",
" this.xdom = d3.time.scale();\n",
" }else{\n",
" this.xdom = d3.scale.linear();\n",
" }\n",
"\n",
" if(this.yscale === 'log'){\n",
" this.ydom = d3.scale.log();\n",
" }else if(this.yscale === 'date'){\n",
" this.ydom = d3.time.scale();\n",
" }else{\n",
" this.ydom = d3.scale.linear();\n",
" }\n",
"\n",
" this.xdom.domain(this.xdomain)\n",
" .range([0, this.width]);\n",
"\n",
" this.ydom.domain(this.ydomain)\n",
" .range([this.height, 0]);\n",
"\n",
" if(this.xscale === 'date'){\n",
" this.xmap = d3.time.scale()\n",
" .domain(this.xdomain)\n",
" .range(this.xlim);\n",
" this.x = function(x){return this.xdom(this.xmap.invert(x));}\n",
" }else if(this.xscale === 'log'){\n",
" this.xmap = this.xdom;\n",
" this.x = this.xdom;\n",
" }else{\n",
" this.xmap = this.xdom;\n",
" this.x = this.xdom;\n",
" }\n",
"\n",
" if(this.yscale === 'date'){\n",
" this.ymap = d3.time.scale()\n",
" .domain(this.ydomain)\n",
" .range(this.ylim);\n",
" this.y = function(y){return this.ydom(this.ymap.invert(y));}\n",
" }else if(this.xscale === 'log'){\n",
" this.ymap = this.ydom;\n",
" this.y = this.ydom;\n",
" }else{\n",
" this.ymap = this.ydom;\n",
" this.y = this.ydom;\n",
" }\n",
" }\n",
"\n",
" Axes.prototype.draw = function(){\n",
" this.zoom = d3.behavior.zoom()\n",
" .x(this.xdom)\n",
" .y(this.ydom)\n",
" .on(\"zoom\", this.zoomed.bind(this));\n",
" var canvas = this.fig.canvas;\n",
" canvas\n",
" .on(\"mousedown.cursor\", function () { canvas.attr(\"style\", \"cursor:move\"); })\n",
" .on(\"mouseup.cursor\", function () { canvas.attr(\"style\", \"cursor:auto\"); });\n",
"\n",
" this.baseaxes = this.fig.canvas.append(\"g\")\n",
" .attr('transform', 'translate('\n",
" + this.position[0] + ','\n",
" + this.position[1] + ')')\n",
" .attr('width', this.width)\n",
" .attr('height', this.height)\n",
" .attr('class', \"baseaxes\");\n",
"\n",
" if(this.zoomable){\n",
" this.baseaxes.call(this.zoom);\n",
" }\n",
"\n",
" this.axesbg = this.baseaxes.append(\"svg:rect\")\n",
" .attr(\"width\", this.width)\n",
" .attr(\"height\", this.height)\n",
" .attr(\"class\", \"axesbg\");\n",
"\n",
" this.clip = this.baseaxes.append(\"svg:clipPath\")\n",
" .attr(\"id\", this.clipid)\n",
" .append(\"svg:rect\")\n",
" .attr(\"x\", 0)\n",
" .attr(\"y\", 0)\n",
" .attr(\"width\", this.width)\n",
" .attr(\"height\", this.height)\n",
"\n",
" this.axes = this.baseaxes.append(\"g\")\n",
" .attr(\"class\", this.axclass)\n",
" .attr(\"clip-path\", \"url(#\" + this.clipid + \")\");\n",
"\n",
" for(var i=0; i<this.elements.length; i++){\n",
" this.elements[i].draw();\n",
" }\n",
" };\n",
"\n",
" Axes.prototype.zoomed = function(propagate){\n",
" // propagate is a boolean specifying whether to propagate movements\n",
" // to shared axes, specified by sharex and sharey. Default is true.\n",
" propagate = (typeof propagate == 'undefined') ? true : propagate;\n",
"\n",
" //console.log(this.zoom.translate());\n",
" //console.log(this.zoom.scale());\n",
" //console.log(this.zoom.x().domain());\n",
" //console.log(this.zoom.y().domain());\n",
"\n",
" for(var i=0; i<this.elements.length; i++){\n",
" this.elements[i].zoomed();\n",
" }\n",
"\n",
" if(propagate){\n",
" // update shared x axes\n",
" for(var i=0; i<this.sharex.length; i++){\n",
" this.sharex[i].zoom.x().domain(this.zoom.x().domain());\n",
" this.sharex[i].zoomed(false);\n",
" }\n",
" // update shared y axes\n",
" for(var i=0; i<this.sharey.length; i++){\n",
" this.sharey[i].zoom.y().domain(this.zoom.y().domain());\n",
" this.sharey[i].zoomed(false);\n",
" }\n",
" }\n",
" };\n",
"\n",
" Axes.prototype.add_element = function(element){\n",
" this.elements.push(element);\n",
" };\n",
"\n",
" Axes.prototype.prep_reset = function(){\n",
" // interpolate() does not work on dates, so we map dates to numbers,\n",
" // interpolate the numbers, and then invert the map.\n",
" // we use the same strategy for log, so the interpolation will be smooth.\n",
" // There probably is a cleaner approach...\n",
"\n",
" if (this.xscale === 'date'){\n",
" var start = this.xdom.domain();\n",
" var end = this.xdomain;\n",
" var interp = d3.interpolate(\n",
" [this.xmap(start[0]), this.xmap(start[1])],\n",
" [this.xmap(end[0]), this.xmap(end[1])]);\n",
" this.ix = function(t){\n",
" return [this.xmap.invert(interp(t)[0]),\n",
" this.xmap.invert(interp(t)[1])];\n",
" }\n",
" }else{\n",
" this.ix = d3.interpolate(this.xdom.domain(), this.xlim);\n",
" }\n",
"\n",
" if (this.yscale === 'date'){\n",
" var start = this.ydom.domain();\n",
" var end = this.ydomain;\n",
" var interp = d3.interpolate(\n",
" [this.ymap(start[0]), this.ymap(start[1])],\n",
" [this.ymap(end[0]), this.ymap(end[1])]);\n",
" this.iy = function(t){\n",
" return [this.ymap.invert(interp(t)[0]),\n",
" this.ymap.invert(interp(t)[1])];\n",
" }\n",
" }else{\n",
" this.iy = d3.interpolate(this.ydom.domain(), this.ylim);\n",
" }\n",
" }\n",
"\n",
" Axes.prototype.finalize_reset = function(){\n",
" this.zoom.scale(1).translate([0, 0]);\n",
" }\n",
"\n",
" Axes.prototype.reset = function(){\n",
" this.prep_reset();\n",
" d3.transition().duration(750).tween(\"zoom\", function() {\n",
" return function(t) {\n",
" this.zoom.x(this.xdom.domain(this.ix(t)))\n",
" .y(this.ydom.domain(this.iy(t)));\n",
" this.zoomed();\n",
" };\n",
" });\n",
" this.finalize_reset();\n",
" };\n",
"\n",
"\n",
"\n",
" function Axis(axes, position, nticks, tickvalues, tickformat){\n",
" this.axes = axes;\n",
" this.position = position;\n",
" this.nticks = nticks;\n",
" this.tickvalues = tickvalues;\n",
" this.tickformat = tickformat;\n",
" if (position == \"bottom\"){\n",
" this.transform = \"translate(0,\" + this.axes.height + \")\";\n",
" this.scale = this.axes.xdom;\n",
" this.class = \"x axis\";\n",
" }else if (position == \"top\"){\n",
" this.transform = \"translate(0,0)\"\n",
" this.scale = this.axes.xdom;\n",
" this.class = \"x axis\";\n",
" }else if (position == \"left\"){\n",
" this.transform = \"translate(0,0)\";\n",
" this.scale = this.axes.ydom;\n",
" this.class = \"y axis\";\n",
" }else{\n",
" this.transform = \"translate(\" + this.axes.width + \",0)\";\n",
" this.scale = this.axes.ydom;\n",
" this.class = \"y axis\";\n",
" }\n",
" }\n",
"\n",
" Axis.prototype.draw = function(){\n",
" this.axis = d3.svg.axis()\n",
" .scale(this.scale)\n",
" .orient(this.position)\n",
" .ticks(this.nticks)\n",
" .tickValues(this.tickvalues)\n",
" .tickFormat(this.tickformat);\n",
" this.elem = this.axes.baseaxes.append('g')\n",
" .attr(\"transform\", this.transform)\n",
" .attr(\"class\", this.class)\n",
" .call(this.axis);\n",
" };\n",
"\n",
" Axis.prototype.zoomed = function(){\n",
" this.elem.call(this.axis);\n",
" };\n",
"\n",
"\n",
"\n",
" function Grid(axes, xy){\n",
" this.axes = axes;\n",
" this.class = xy + \" grid\"\n",
" if(xy == \"x\"){\n",
" this.transform = \"translate(0,\" + this.axes.height + \")\";\n",
" this.position = \"bottom\";\n",
" this.scale = this.axes.xdom;\n",
" this.tickSize = -this.axes.height;\n",
" }else{\n",
" this.transform = \"translate(0,0)\";\n",
" this.position = \"left\";\n",
" this.scale = this.axes.ydom;\n",
" this.tickSize = -this.axes.width;\n",
" }\n",
" }\n",
"\n",
" Grid.prototype.draw = function(){\n",
" this.grid = d3.svg.axis()\n",
" .scale(this.scale)\n",
" .orient(this.position)\n",
" .tickSize(this.tickSize, 0, 0)\n",
" .tickFormat(\"\");\n",
" this.elem = this.axes.axes.append(\"g\")\n",
" .attr(\"class\", this.class)\n",
" .attr(\"transform\", this.transform)\n",
" .call(this.grid);\n",
" };\n",
"\n",
" Grid.prototype.zoomed = function(){\n",
" this.elem.call(this.grid);\n",
" };\n",
"\n",
"\n",
"\n",
" // This function constructs a mapped SVG path\n",
" // from an input data array\n",
" var construct_SVG_path = function(data, xmap, ymap){\n",
" var result = \"\";\n",
" for (var i=0;i<data.length;i++){\n",
" result += data[i][0];\n",
" if(data[i][0] == 'Z'){\n",
" continue;\n",
" }\n",
" for (var j=0;j<data[i][1].length;j++){\n",
" if(j % 2 == 0){\n",
" result += \" \" + xmap(data[i][1][j]);\n",
" }else{\n",
" result += \" \" + ymap(data[i][1][j]);\n",
" }\n",
" }\n",
" result += \" \";\n",
" }\n",
" return result;\n",
" };\n",
"\n",
"\n",
" var figwidth = 6.0 * 80;\n",
" var figheight = 4.0 * 80;\n",
" var fig = new Figure(\"div#figuredcc2064e83624ef9b3bfe3e156468365\",\n",
" figwidth, figheight);\n",
"\n",
"\n",
"\n",
" var ax1 = new Axes(fig, [0.125, 0.125, 0.77500000000000002, 0.77500000000000002], [0.0, 12.0], [-1.0, 10.0],\n",
" \"linear\", \"linear\",\n",
" [0.0, 12.0], [-1.0, 10.0],\n",
" false, false,\n",
" \"axes1\",\n",
" \"clipdcc2064e83624ef9b3bfe3e1564683651\", true);\n",
"\n",
"\n",
"\n",
"// Add an Axis element\n",
"ax1.add_element(new Axis(ax1, \"bottom\",\n",
" 7, null,\n",
" null));\n",
"\n",
"\n",
"\n",
"// Add an Axis element\n",
"ax1.add_element(new Axis(ax1, \"left\",\n",
" 7, null,\n",
" null));\n",
"\n",
"\n",
"\n",
"// Add a Line2D element\n",
"var linebc04b07d9fdd415ebf77c9f3e12e5784 = new function(){\n",
" this.data = [[0.0, 3.0], [1.0, 1.0], [2.0, 4.0], [3.0, 1.0], [4.0, 5.0], [5.0, 9.0], [6.0, 2.0], [7.0, 6.0], [8.0, 5.0], [9.0, 3.0], [10.0, 5.0], [11.0, 8.0]];\n",
" this.ax = ax1;\n",
"\n",
" this.translate = function(d)\n",
" { return \"translate(\" + this.ax.x(d[0]) + \",\"\n",
" + this.ax.y(d[1]) + \")\"; };\n",
"\n",
" this.draw = function(){\n",
"\n",
" this.line = d3.svg.line()\n",
" .x(function(d) {return this.ax.x(d[0]);})\n",
" .y(function(d) {return this.ax.y(d[1]);})\n",
" .interpolate(\"linear\")\n",
" .defined(function (d) {return !isNaN(d[0]) && !isNaN(d[1]); });\n",
"\n",
" this.lineobj = this.ax.axes.append(\"svg:path\")\n",
" .attr(\"d\", this.line(this.data))\n",
" .attr('class', 'line3');\n",
"\n",
"\n",
" this.pointsobj = this.ax.axes.append(\"svg:g\")\n",
" .selectAll(\"scatter-dots-3\")\n",
" .data(this.data.filter(\n",
" function(d){return !isNaN(d[0]) && !isNaN(d[1]); }))\n",
" .enter().append(\"svg:path\")\n",
" .attr('class', 'points3')\n",
" .attr(\"d\", d3.svg.symbol()\n",
" .type(\"circle\")\n",
" .size(400))\n",
" .attr(\"transform\", this.translate.bind(this));\n",
"\n",
" };\n",
"\n",
" this.zoomed = function(){\n",
"\n",
"\n",
" this.lineobj.attr(\"d\", this.line(this.data));\n",
"\n",
"\n",
" this.pointsobj.attr(\"transform\", this.translate.bind(this));\n",
"\n",
"\n",
" }\n",
"};\n",
"\n",
"ax1.add_element(linebc04b07d9fdd415ebf77c9f3e12e5784);\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" fig.draw();\n",
"\n",
"\n",
" fig.root.append(\"div\")\n",
" .append(\"button\")\n",
" .text(\"Reset\")\n",
" .on(\"click\", fig.reset.bind(fig));\n",
"\n",
" var _ = function() {\n",
" var a = ax1;\n",
"\n",
" var zoom_x = a.zoom,\n",
" zoom_y = d3.behavior.zoom()\n",
" .y(a.ydom),\n",
" position_y0 = null,\n",
" translate_y0 = null;\n",
"\n",
" // remove y scale from default controller\n",
" a.zoom\n",
" .y(d3.scale.linear())\n",
"\n",
" // add pan-without-zoom behavior for y-axis \n",
" a.baseaxes\n",
" .on(\"mousedown.zoom_y\", function() {\n",
" translate_y0 = zoom_y.translate()[1];\n",
" position_y0 = d3.event.pageY;\n",
" })\n",
" .on(\"mousemove.zoom_y\", function() {\n",
" if (position_y0 != null) {\n",
" zoom_y.translate([0, translate_y0 + d3.event.pageY - position_y0]);\n",
" }\n",
" })\n",
" .on(\"mouseup.zoom_y\", function() {\n",
" position_y0 = null;\n",
" });\n",
"\n",
"\n",
" var x_min_scale = (a.xdom.invert(a.width) - a.xdom.invert(0)) / (15.0 - -1.0),\n",
" y_min_scale = (a.ydom.invert(0) - a.ydom.invert(a.height)) / (10.0 - -1.0);\n",
"\n",
" a.zoom\n",
" .on(\"zoom\", function() { // replace zoom event with one that bounds pan\n",
"\n",
" // enforce zoom limits\n",
" var screen_x_lower = a.xdom(-1.0),\n",
" screen_x_upper = a.xdom(15.0),\n",
" screen_y_lower = a.ydom(-1.0),\n",
" screen_y_upper = a.ydom(10.0);\n",
"\n",
" if((screen_x_lower >= 0) && (screen_x_upper < a.width)) {\n",
" zoom_x.scale(x_min_scale);\n",
" }\n",
" if((screen_y_upper >= 0) && (screen_y_lower < a.height)) {\n",
" zoom_y.scale(y_min_scale);\n",
" }\n",
"\n",
" // enforce pan limits\n",
" screen_x_lower = a.xdom(-1.0);\n",
" screen_x_upper = a.xdom(15.0);\n",
" screen_y_lower = a.ydom(-1.0);\n",
" screen_y_upper = a.ydom(10.0);\n",
" var tx = zoom_x.translate()[0],\n",
" ty = zoom_y.translate()[1];\n",
"\n",
" if(screen_x_lower > 0) {\n",
" tx = tx - screen_x_lower;\n",
" }\n",
" else if(screen_x_upper < a.width) {\n",
" tx = tx + a.width - screen_x_upper;\n",
" }\n",
"\n",
" if(screen_y_upper > 0) {\n",
" ty = ty - screen_y_upper;\n",
" }\n",
" else if(screen_y_lower < a.height) {\n",
" ty = ty + a.height - screen_y_lower;\n",
" }\n",
"\n",
" zoom_x.translate([tx, ty]);\n",
" zoom_y.translate([tx,ty]);\n",
"\n",
" // redraw\n",
" a.zoomed.bind(a)();\n",
" });\n",
"\n",
" // change a.finalize_reset to reset zoom_x and zoom_y\n",
" a.finalize_reset = function() {\n",
" zoom_x.scale(1).translate([0,0]);\n",
" zoom_y.scale(1).translate([0,0]);\n",
" }\n",
" }() // function-level scope\n",
"\n",
" return fig\n",
" }\n",
"\n",
" // set a timeout of 0: this makes things work in the IPython notebook\n",
" setTimeout(function(){\n",
" // we need to call the function, making sure d3 is defined appropriately\n",
" if(typeof define === \"function\" && define.amd){\n",
" // If require.js is available, use it to load d3\n",
" require.config({paths: {d3: \"//cdnjs.cloudflare.com/ajax/libs/d3/3.4.1/d3.min\"}});\n",
" require([\"d3\"], create_figdcc2064e83624ef9b3bfe3e156468365);\n",
" }else if(typeof d3 === \"undefined\"){\n",
" // No require.js: dynamically load d3\n",
" var s = document.createElement('script');\n",
" s.src = \"//cdnjs.cloudflare.com/ajax/libs/d3/3.4.1/d3.min.js\";\n",
" s.async = true;\n",
" s.onreadystatechange = s.onload = s.onerror = function() {\n",
" if(typeof d3 === \"undefined\"){\n",
" document.getElementById(\"figuredcc2064e83624ef9b3bfe3e156468365\").innerHTML =\n",
" \"<p style='color:red;'>(d3 failed to load)</p>\";\n",
" }else{\n",
" create_figdcc2064e83624ef9b3bfe3e156468365(d3);\n",
" }\n",
" };\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
" }else{\n",
" // d3 is already globally loaded\n",
" create_figdcc2064e83624ef9b3bfe3e156468365(d3);\n",
" }\n",
" }, 0);\n",
"\n",
" </script>\n",
"\n",
"\n",
"\n"
],
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXEAAAEACAYAAABF+UbAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X1UVOe9L/Dv8DKDoIDIiyAjIKCAGJQoiCQp5hBNsHk7\nXevKqW3qa2/rcq2T29vkmNt7Wv3r2JzVm9ucRVd7NBp7T3xJ2prEYKuShjaRACpKREEYQNARERTB\ngDPDvNw/hpmwZ29gZs9+mz2/z1pZi/2E2fNsZ+bHM7/n2c8PIIQQQgghhBBCCCGEEEIIIYQQQggh\nhBBCCPHZQQD9AK5MaosDcBbAVwBOA4iVoV+EEEK88CSAFWAG8f8A8OrEz68C+LXUnSKEEOK9dDCD\neCeAeRM/xwMwSN0hQgghTiE8HpMA4N7Ez4MAEoXrDiGEEF/wCeKEEEIUIozHYwbgTKMMwjkqv8v1\nS5mZmY7Ozk4/ukYIIUGpE0CWt7/MZyR+CsD3Jn7+3sQxuxednXA4HKr97xe/+IXsfaDro2uj61Pf\nfwAyfQnIM43EjwL4Fpwj75sAfg7gFwCOA9gK4A6A/+bLExJCCBHOTEH8n6Zof0bojhBCCPEdTWzy\nVFZWJncXRKXm61PztQF0fcFGI+K5HRP5HUIIIV7SaDSAD7GZRuKEEBLAKIgTQkgAoyBOJGc2m3H4\n8GFs2rQJubm50Ol00Gg00Ol0yM3NxaZNm3D48GGYzWa5u0qI4lFOnEjGbDbjwIED2LdvH27dujXj\n76empmL37t3Yvn07dDqdBD0kRH6+5sQpiBNJGI1GbNiwAc3NzT4/tqCgANXV1ViwYIEIPSNEWSiI\nE8UxGAwoLy9HT08P73OkpaWhpqYGWVle341MSECiIE4UxWg0orS01K8A7pKWloa6ujqkpKQI0DNC\nlImCOFEMs9mM4uLiKVMoOTk5WLVqFZKTkxEREQGTyYS+vj6cP38ebW1tnI8pKChAQ0MD5ciJalEQ\nJ4pRVVWFXbt2sdojIyOxceNGpKWlTfnYnp4eHD9+HGNjY5zn3blzp6B9JUQpKIgTRTCbzcjKymKt\nQomMjMTWrVsRHx8/4zkGBwdx8OBBViDX6/UwGAzQarWC9pkQJaA7NokiHDt2jHMZ4caNG70K4AAQ\nHx+PjRs3stpv3ryJY8eO+d1HQtSAgjgRxZkzZ1htOTk506ZQuKSlpWHJkiWs9tOnT/PuGyFqQkGc\niKKpqYnVtmrVKl7nKioq8ur8hAQjCuJEFF1dXay25ORkXufielx3dzevcxGiNhTEiSgsFgurLSIi\ngte5uB7HdX5CghEFcSIKrpUjJpOJ17m4HkcrUwhxoiBORLFo0SJWW19fH69zcT0uIyOD17kIURsK\n4kQUhYWFrLbz58/zOldjY6NX5yckGFEQJ6JYt24dq62trc3nPVRu3LiB69evs9rXr1/Pu2+EqAnd\nsUlEIcQdmwMDAzh06BDdsUmCCt2xSRRBp9Nh9+7drPaxsTEcPHhwxhH5jRs3OAM4AOzevZsCOCET\naCRORDPTLoZLlixBUVERaxfDxsZGzhQKQLsYEvWjDbCIotB+4iSQmM1mHDt2DGfOnEFTUxO6urpg\nsVig1WqxaNEiFBYWYt26daisrBRtIEFBnCiOEJV90tPTcfbsWarsQ0ShpPqvFMSJIt2+fRvr1q3D\n1atXfX5sQUEBTp06RSNwIgql1X+liU2iSCkpKXjzzTdRUVGB6Ohorx6j1+tRVVWFhoYGCuBEFAaD\nAaWlpbwCOAA0NzejtLQUBoNB4J55j0biRBIOhwO//vWvMTw8DKvVipaWFlgsFnR1daG7uxsWiwUh\nISGYO3cukpOTsWvXLmzevJlWoRDRKHW+xteReJjfz0iIF4xGI4aHhwEAYWFhWLlyJV577TV3kN6/\nfz9u377t/v21a9dSACeiMZvN2LBhw5QB3Nf6rz09PaioqJBl5RSlU4gkWlpaGMeLFy9mBOn58+cz\n/j/ffVYI8caBAwc4UyiRkZHYsmULKisrkZmZicjISISEhCAyMhKZmZmorKzEli1bEBkZyXpsc3Mz\n3nnnHSm6z0BBnIjObrezJjTz8/MZx55fQymIE7GYzWbs27eP1e66m3im6lNpaWnYunUrZyDft2+f\n5Nsk+xPE9wJoB9AG4A8A2FdECIDe3l58/fXX7mOtVstaKuhZ+IGCOBGL2uq/8g3iWQC+DyAfQA4A\nG4B/EqpTRF08Uyk5OTkIDw9ntCUmJiIk5Ju34/DwMOct94T4S231X/kG8fsAxgFEwTk5GgnA/yle\nojo2mw3Xrl1jtHmmUgDnZGdiYiKjjUbjRAxqq//qTxD/FYBeALcBPABQI1SniHp0d3fj0aNH7uNZ\ns2ZxFowAaHKTSENt9V/5LjHMBPAqgHQAwwA+ALAJwHuTf2nPnj3un8vKylBWVsbz6Uig8kyl5Obm\nIjQ0lPN3k5OTcfnyZffxnTt3RO0bCU5Kq/9aW1uL2tpaXs8P8A/iRQDqANybOP4TgCcwTRAnwcdq\ntbLW1HKlUlw8RzWT140TIhStVssKtCaTiXO1yUyEqP/qOcDdu3evT4/nm04xAFgNYBacdxaVT7QR\n4mYwGGA2m93HUVFR004ezZ8/33W3GgBgaGiId3FlQqaitvqvfIP4eTiXFX4F5xJDHYAqoTpF1MEz\nlbJ06VLGChRP4eHhrCVelFIhQlNb/Vd/1onvAZANYAmASgA0ZCJuFosF7e3tjLbpUikulFIhYlNb\n/Ve6Y5OIor29HePj4+7jmJgYpKamzvg4zyBOI3EitMrKSs734vHjxzE4OOjVOQYGBvD++++z2vV6\nPSorK/3uoy8oiBNRcKVSJue7p0J3bhKxqa3+K+1iSARnMplY+yt7k0oB2GvFBwcH3eWxCBHK9u3b\nsX//ftYmWGNjYzh06BDv+q/btm2TovsMFMSJ4Nra2mCz2dzHcXFxrOA8FZ1Oh3nz5uHevXvutjt3\n7mDhwoWC95MEL51Oh+rq6in3E79+/fqUwZpLWloaTp06JUsBb0qnEMF5plLy8/O9SqW4UEqFSGHB\nggWoqanxec8UT+np6aipqZGt+hQFcSKo0dFR1m3N3qZSXCiIE6lkZWXhb3/7G+/b7gsKCnDu3DlZ\nC3hTECeCam1txeSyfImJiUhISPDpHBTEiZT6+/uxbdu2gK3/SjlxIiiuVIqvPIP4wMAAxsfHWdvX\nEuIvu92O+vp6hIWFoaioCIWFhbBYLLh16xaamprc9V+1Wi0yMjJQWFiI9evXo7KyUjGT7RTEiWBG\nRkZYk0RLly71+TwRERGYO3cuhoaGADiLLPf393u1zpwQX7S2trrfZ4BzwvP111/HnDlzZOyVbyid\nQgTjuW94SkoK4uLieJ2LUipEbA6HA3V1dYy2xx57LKACOEBBnAhIiFSKC+0tTsTW09PD2tahpKRE\npt7wR0GcCGJoaAhGo5HRxieV4kKFk4nYPEfhixcv9nkSXgkoiBNBeFazX7hwodcz/Vw8R+J3796F\n1WrlfT5CJrt79y46OjoYbaWlpTL1xj8UxIkghEylAM69xyf/EbDb7bh7965f5yTExXMUnpqaCr1e\nL1Nv/ENBnPhtYGAA/f397mONRoO8vDy/z0spFSKGkZERXLlyhdG2Zs0an+4qVhIK4sRvnqmUjIwM\nREVF+X1emtwkYqivr4fdbncfx8XFYcmSJTL2yD8UxIlfHA6H4KkUF9pbnAjNZDLh4sWLjLaSkpJp\nK04pXeD2nChCf38/Y8fBkJAQ5OTkCHJuriA+eXdEQnx18eJFRpHkyMhIFBQUyNgj/1EQJ37xHIVn\nZWVh1qxZgpx7zpw5mD17tvvYZrN5XXmFEE82mw0NDQ2MtuLi4oDfzoGCOOFNzFSKC925SYRy5coV\nPHz40H0cHh6OlStXytgjYVAQJ7wZjUYMDw+7j8PCwgSfIKLCyUQIXLfYr1ixApGRkTL1SDgUxAlv\nnqPwxYsXC76zG01uEiF0dHRgYGDAfazRaALyFnsuFMQJL3a7nbW0UOhUCsAdxCcvDyPEG56j8KVL\nlyI2Nlam3giLgjjhpbe3F19//bX7WKvVilLdJDo6mvGVd3x8nLEahpCZGI1G1hbJa9askak3wqMg\nTnjxTKXk5OSIMsuv0WgCanLTbDbj8OHD2LRpE3Jzc6HT6aDRaKDT6ZCbm4tNmzbh8OHDMJvNcnc1\naHiOwjMyMniXY1MiCuLEZzabjbV3uBipFJdACOJmsxlVVVXIysrC5s2bceTIEbS1tbnXJFssFrS1\nteHIkSPYvHkzsrKyUFVVRcFcZPfv30drayujTU2jcICCOOGhu7sbjx49ch/PmjULixYtEu35lB7E\njUYjiouLsWvXLty6dcurx9y6dQu7du1CcXExawtfIpwvv/ySUfM1KSkJmZmZMvZIeBTEic88Uym5\nubkIDQ0V7fm4gvjkD6acDAYDSktL0dzczOvxzc3NKC0thcFgELhnZHR0FJcvX2a0lZSUBOxGV1Oh\nIE58YrVa0dbWxmgTM5UCALGxsYiIiHAfWywW3L9/X9Tn9IbRaER5eTlr0sxXPT09KC8vpzXwAjt/\n/jxjD/ro6GjR36tyoELJxCcGg4GRx42KikJaWpqoz+ma3Ozu7na39fX1Yd68eaI+73TMZjM2bNgw\nZQDPycnBqlWrkJycjIiICJhMJvT19eH8+fOsP4KAM5BXVFSgoaEBOp1O7O6r3vj4OBobGxltq1ev\nFvUbo1xoJE584plKWbp0qSQ7wCltW9oDBw5wplAiIyOxZcsWVFZWIjMzE5GRkQgJCUFkZCQyMzNR\nWVmJLVu2cN4p2NzcjHfeeUeK7qvepUuXGPM2Op0OhYWFMvZIPP58+mIBfACgGUArAHXc/kSmZLFY\n0N7ezmiT6uupkiY3zWYz9u3bx2qPjIzE1q1bZ/xmkpaWhq1bt3IG8n379jF22SO+s9vtqK+vZ7St\nXLlStd9w/Ani+wH8CUABgKUArk7/6yTQtbe3Y3x83H0cExOD1NRUSZ6bq8qPXJObx44d41yFsnHj\nRsTHx3t1jvj4eGzcuJHVfvPmTRw7dszvPgaz1tZWDA0NuY9DQ0NRXFwsY4/ExTeIzwOwHMDRiWM7\ngBFBekQUiyuVItVMf1xcHGNfFpPJxNh8S0pnzpxhteXk5Pg8N5CWlsa5Ydjp06d59y3YcW10tWzZ\nMsyZM0emHomPbxDPBjAA4H0ALQB+D2D2tI8gAc1kMrGWwUk506/RaBSTF29qamK1rVq1ite5ioqK\nvDo/8U5PTw9rlY/abu7xxDeIhwBYBeDfAeQDuA/gX4XqFFGetrY2RlWduLg4VlAVm1K2pe3q6mK1\n8b2Nm+txk1fhEN94jsIXL16MhIQEmXojDb5LDG8CMAI4P3H8B3AE8T179rh/LisrQ1lZGc+nI3Lj\nKv4g9U0TStmWlmvicfI6dl9wPY4mNvm5e/cuOjo6GG2BMAqvra1FbW0t78f7E8QHASwG0A6gHM4V\nKgyTgzgJXKOjo6zRpxw3TXCNxB0Oh+R/TLRaLSvQmkwmXgUGTCYT5/mJ7zxH4ampqVi4cKFMvfGe\n5wB37969Pj3en9Up2wC8B+eqlCIAvj0zCRitra2MlSCJiYmyfEWNj49HWNg3446xsTFGuS2pcO0T\nwzc/z/W4jIwMXucKZiMjI7hy5Qqjbc2aNaq7xZ6LP0G8Gc68+FIAFQCGpv91EqjErqPprZCQEEVM\nbnLdNHL+/HmO35yZ512FU52fTK++vp5RLCQuLk7wUoFKRXdskmmNjIywbi1funSpTL1Rxk0/69at\nY7W1tbX5vIfKjRs3cP36dVb7+vXrefctGJlMJly8eJHRVlJSIsmdxEoQHFdJePPcNzwlJQVxcXEy\n9UYZQbyyspLzJqfjx49jcHDQq3MMDAzg/fffZ7XHx8fjH//xH/3uYzC5ePEiY44iMjISBQUFMvZI\nWhTEybSUkkpxUUIQ1+l02L17N6t9bGwMBw8enHFEfuPGDRw6dAhjY2Os/1dUVIRDhw7JvjdMoLDZ\nbGhoaGC0FRUViVJlSqkoiJMpDQ0NsQoWyJlKAYCEhATGTnQPHz5k1PqUyvbt2zlHe2NjYzh06BCO\nHj2Kzs5OjI2NwW63Y2xsDJ2dnTh69CjeffddzgCelJSEwsJC3L9/HwcOHGAVNCBsV65cYUxuh4eH\n877xKlDRVrQEZrMZx44dw5kzZ9DU1ISuri5YLBaEh4cjJiYGycnJyMzMxHPPPYfo6GhZ+xoaGoqk\npCTGjT59fX3Izs6WtB86nQ7V1dUoLS3lHHlfv36dM989lbi4OGzatMm9+sZut+PMmTPo7u7Giy++\niKioKM7HTfXaabVaLFq0CIWFhVi3bh0qKysDcgOoma5v9uzZSE1NRX5+PsLCwrBixQpeSz0DmZjr\nbxw0ilA2s9mMAwcOYN++fV6VFUtMTMTPf/5zbN++XdaAcPLkScat6WvXrsVTTz0lS18MBoPfhSHS\n09NRXV2Nzs5OzlvuZ8+ejZdffpmxtNHX1y41NRW7d++W/bXzlq/XFx0djSeeeALvvPOO5HcSC21i\nWaTXsZmCeJAyGo3YsGEDr7JiBQUFqK6uxoIFC0To2cwuXryITz75xH2ck5PDuSOgVG7fvo2Kigre\n/5anTp1y79J49epVnDx5krOAcmlpKdauXYs7d+4E7GvnjUB+bwrB1yBOOfEgFOh1IZUwuTlZSkoK\nGhoasGnTJq/TTXq9HlVVVWhoaGBss7t06VL86Ec/gl6vZz3m3Llz+OUvf4mSkpKAfe1mEujvTTnQ\nSDzIGI3GKfO4vkpLS0NdXR1rr2+xWa1W/Nu//Rvj5o7XXntN1lzo0NAQ3n77bVitVrS0tKCzsxNm\nsxk9PT3uHG5GRgYKCwuxfv16VFZWTnt7vd1uR21tLT7//HN328jICN555x1BtuCV67Wbjhrem0Kg\ndAqZktlsRnFx8ZSjHF/rQgLOr69y1IX87W9/i/7+fvfx9773PWRmZkrah8m++OILfPrpp+5jvV6P\nrVu3+n3eGzdu4E9/+hOGhoawf/9+xjVPFkivHRc1vTf9RekUMiU11YVUWkrl6lVmYSuh1tOnp6fj\nRz/6EYxGI2cAD8TXjoua3ptSoyAeJNRWF1Ip29ICwODgIOP5NRoN8vLyBDt/aGgozp49y2oP1NfO\nk9rem1KjIB4k1FYXUikFIgD2Xa3p6emYPVu4Qldqe+08qf36xEZBPEiorS7k/PnzGduMDg0Nce7N\nLTaHwyFaKsVFba+dJ7Vfn9goiAcJtdWFDA8PZ43S5Eip9Pf3Mza9CgkJQW5urqDPobbXzpvnV9P1\niY2CeJBQY11IJUxueqZSMjMzMWvWLEGfQ42v3WRqvz6xURAPEmqsCyl3EJcilQKo87Wb6fnVdH1i\noyAeJLhuLOGbQ1ZKXUi5g7jRaMSDBw/cx2FhYaJUk1HjazfT86vp+sRGQTxIqLEupOdGR4ODg5KO\nujxTKdnZ2aLcWKLG124ytV+f2CiIBwk11oXU6XSYN28eo02qyU273S5JKgVQ52s30/Or6frERkE8\nSKi1LqRcKZXe3l5GMQqtVivanuZqfe1c1H59YqMgHiTErAup1+tRWVnpdx/5kCuIe6ZSlixZIlpJ\nMLW+di5qvz6xURAPEmLWhdy9e7dsk0dyBHGbzYbW1lZGm5i1R9X62rmo/frERrsYBpGZdopbsmQJ\nioqKWDvFNTY2TllqTO6d4h49eoQ333zTfazRaPDGG2+IWijXYDDgvffecx9HRETgpz/9KaP2p9DU\n+NpNpvbr8wVtRSsCNdUxVOOezW+//TaGhobcx9u2beP8ei6Ujz76CJcvX3Yfr1ixAi+88IJoz+ei\nxtduMqPRiNWrV3tVjm0mSrw+b9FWtAIym82oqqpCVlYWNm/ejCNHjqCtrc29jM1isaCtrQ1HjhzB\n5s2bkZWVhaqqKs7SWkqxYMEC1NTU+Lwvhaf09HTU1NQo4kMiZUrFarVKmkqZTKjXLjY2Fv/1X/+l\niNdusqSkJGzfvh0xMTF+nUdJ700pUBCfgtFoRHFxMXbt2uX1yODWrVvYtWsXiouLYTQaRe4hf1lZ\nWairq8Njjz3G6/EFBQU4d+4csrKyBO4ZP57rxcUM4gaDgfFHOioqCunp6aI9nyfXa1dQUMDr8UlJ\nSdi6dSsuX76M8fFxgXvnn88++wyA85tUUlISr3Mo7b0pBQriHIKhzl9KSgr279+PiooKv+tCys2z\nL2IGcc+14Xl5eQgJkfZj5KrpWVVV5XXaKDk5GRUVFdixYweio6Nx79491NTUiNxT7/X29qKurg6A\ns3L9jh07sGPHDq+vT6nvTSmEyd0BpTEajSgvL/c779jT04Py8nJF5+Xa29tRVFSEwsJCtLS04OHD\nhzAajeju7uZVF1IuniPxu3fvwmq1IixM2Le3xWJhTaJJlUrxpNPpsHPnTmzbtg3Hjx/H6dOn0dTU\nNO1r5/odl8bGRixZsoTzjkkpmc1mnDhxgtEWFxeHn/3sZ9BoNF5fnxLfm1Kgic1JgqnO3+joKH71\nq19h8mu0c+dOJCQkyNgr/t566y2MjIy4j3/4wx/y3glvKi0tLfjjH//oPo6Ojsarr77K2NdcySwW\nC377298yJoGjo6Px4x//mPeGU0I4efIka7vY73//+7L/cZELTWz6IZjq/LW2tjICeGJiYsAGcECa\nSj+eqZSlS5cGTAAHnHeVvvTSS4y2kZER/PnPf5apR0BHRwcrgBcVFQVtAOeDgviEYKvz53nHoVxp\nAaGIvULFZDKho6OD0RaI/2YLFy7EmjVrGG1fffUVrl27JnlfxsbG8PHHHzPa5s2bh/Lycsn7Esj8\nDeKhAC4BOClAX2QVTHX+RkZGWDn/pUuXytQbYYhdOLmtrQ02m819PHfuXMHTNVJZu3YtEhMTGW2f\nfPIJYy8YsTkcDlRXVzOeU6PR4OWXXxb1Ri018jeI/zOAawACK/nNIZjq/HmOulJSUhAXFydTb4TB\nFcQnB11/ce1YGEiplMnCwsLw8ssvM1bVPHr0CCdPnoRU81gtLS2s9+GTTz6JBQsWSPL8auJPEE8F\nUAHgAMSdIJVEMNX5U1sqBQDmzJnDqDBvs9m83jxpJmNjY+js7GS0Bfq/2fz581FWVsZoa29vZ9yJ\nKpaRkRGcOnWK0ZacnIynnnpK9OdWI3+C+FsAXgNgF6gvsgqWOn9DQ0OsG5ECPZXiIlZe/Nq1a4wR\nakJCAisdEYhKS0tZ67D/8pe/MFavCM3hcODjjz9mVOAJDQ3FSy+9JOreM2rGdyHttwHchTMfXjbV\nL+3Zs8f9c1lZGesvv5IES50/z7TAwoULvb7ZR+mSk5MZk499fX1Yvny53+eVqviD1EJCQvDSSy/h\nd7/7nfvuTYvFgo8++gg/+MEPREkXXbhwgfWt5h/+4R9U8UeRr9raWtTW1vJ+PN8gvgbAC3CmUyIA\nRAP4PYBXJv/S5CCudFqtlhVoTSYT52qTmSi5zp8aUykuYozEHz58iBs3bjDa1PLNBXCuBnnmmWcY\n6Y2enh7U19ejpKRE0Oe6d+8ezp49y2hLS0vD6tWrBX2eQOM5wN27d69Pj+ebTvlfAPQAMgBUAvgr\nPAJ4oAmGOn8DAwPo7+93H2s0GuTl5cnYI2FxTW7a7f5l+zxH4cnJyayScIFu5cqVyMzMZLR9+umn\nuHv3rmDPYbfb8eGHHzL2a3GtWw/UCWKlEGqdeMCvTgmGOn+eASkjIwNRUVEy9UZ40dHRjG9O4+Pj\nuHfvnl/nVGsqZTKNRoMXXniBkQa02Ww4ceKEYCt8zp07x1rC++yzzyI2NlaQ8wczIYL43+BMrQQ0\ntdf5czgcrFSKmtICgDMYCZlSGRoaYgUetf2buURHR6OiooLRdufOHfz973/3+9x37txh5XwXL14s\nyHwFoTs23dRe56+/v58xKg0JCUFubq6MPRKHkEHccxSu1+v93utayfLz81l/pD7//HO/ijRYrVac\nOHGCkdaKjIzE888/T2kUgVAQn6D2On+eo/CsrCzMmjVLpt6IR8wgrsZUymQajQYVFRWM9fYOh4OV\ny/bFZ599xsqtb9iwgfEcxD8UxCfZvn0752b7Y2NjOHToEI4ePYrOzk6MjY3Bbre7bwI5evQo3n33\nXc4AXlBQgG3btknR/SkFQyrFhWtyk89diIODg4xb99U2CTyVyMhIVqk5vnuPT94j3OWxxx4Lin9H\nKdF+4pPodDpUV1dPWcfw+vXrUxZl5ZKWloZTp07Jvg2t0WjE8PCw+zgsLIxzawA1iI2NdW8TDDg3\nNrt//77PK0o8/+ilp6cHzegxOzsbhYWFfu09zrVHeHR0NJ577jlB+0pEHonrdDrk5uZi06ZNOHz4\nsKJrT7qosQalZ0BavHix7H9YxCLE5KbD4Qi6VIqn9evXY+7cuYy2jz76CMPDwzh8+DA2bdqE3Nxc\n6HQ6aDQa1me9uroaDx48YDz+xRdflHXfcrUSNYgHYiFhwJkv/uyzz3jfdq+kOn92u51zH2w187fm\nZn9/P2MyW62TwNPx3HvcarWipqYGmZmZXhUN37JlCxobG2G1WgHQHuFikjQnHiiFhAFnLnXbtm0+\n1aB0LdP66KOPFDECB5x5ycnbfWq1WmRnZ8vYI/H5OxL3/OaSmZmpykngmbj2Hh8ZGcH+/ftx6tQp\nr9fduza52r9/P0JDQ2mPcBHJkhN3FRKuqalRxGjVk81mQ319PcLCwtw1KK1WK3p7eznr/MXGxmL+\n/PnIz89HWFgYLl686Hc6RiieASknJ0f1+zVzFU52OBxeLWmjVAqTXq/Hu+++i/v37/N6fH9/P373\nu9+hsrJSkZ91NZBtYlPJhYSvXr3KqNcYERGBV199dcq7G9vb23H06FH3cUtLC55++mnZ70az2Wys\nPZvVnkoBnEV2J++FYzKZMDw87NXrYTQaGblcNU8Cz8RoNOLZZ5/lHcBdbt26pdjPuhqIGsRff/31\naQsJ9/T0oKKiQlGFhB0OB2tZ1PLly6e9PT07Oxvx8fHuPKrD4UB9fT2effZZUfs6k+7ubjx69Mh9\nHBERwdpQ7dFsAAAR4UlEQVQjQ400Gg3mz5+P3t5ed1tfX59XQdzzm0t2drZi3ptSMpvN2LBhw5T3\nR/haNFyJn3W1EDUnHoiFhLu6uhibRAGYcTc3jUbDqlvY1NTECKBy8AxIubm5QbNnM5/CyVyTwMGa\nSgmmouGBTrKJzUApJOw5Cs/Ly/OqdNmyZcsY64jHx8dx4cIFwfvnLavVyhoRBVNA4lNzMxgngbkE\nW9HwQCfp6hSlFxLu6+tjVfjxHGFPJSwsDMXFxYy2hoYG9xIrqRkMBsZSzqioKKSnp8vSFzlwjcRn\nunPT85vLkiVLVD8JzCWYioargeS33Su5kLDnKDwtLc2nwq0rV65k7JEyOjrK+ZVUCp4BKS8vj1EY\nV+3i4+MRFvbNlM/Y2BgePnw45e/bbDa0trYy2oLpm8tkwVQ0XA1k+VQrsZDwgwcPWPlQb0fhLhER\nEXj88ccZbV9++aVkFcRdLBYL2tvbGW3BFpBCQkJ8uumnu7ubsfdNsEwCcwmmouFqIEsQV2IhYc9g\nm5CQwCsfWlxczBjx3rt3z6f9VoTQ3t7O2HUuOjoaer1e0j4ogS83/Xj+AQ+mSWBPwVI0XC1kCeJK\nKyT86NEjXLp0idFWUlLCa7/jmJgY1qjXM00jNq4dC4Nx72Zvg7jVaqVUyiTBUjRcLWQJ4korJHz+\n/HnGyHXOnDlYtmwZ7/N5pmFu3ryJmzdv8j6fL0wmEwwGA6MtWAOSt0E82CeBPXF9Frk+s95Q2mdd\njWQJ4koqJGy1Wlk1MYuLixmTYr5KSkpi3WIs1Wi8ra2NURcxLi6O91fhQJeQkMBIiTx8+JCxhNDF\nM5USbJPAnoKhaLiayPJOVVIh4ebmZoyOjrqPtVota3KSD8/ReFtbm9dl3vxBqZRvhIaGIikpidHm\nGVQsFgtrziJYv7m4BEPRcDWRPIgrqZCw3W7Hl19+yWh7/PHHBdnzOD09nTUC9nwuoY2OjrImpYI9\nIM20QoUmgdnUXjRcbSQN4korJHz9+nVW8eDVq1cLcm6uW/Gbm5s5v84LpbW1lbHCJjExEYmJiaI9\nXyDg2tFwMq691oP1m4uL2ouGq41kQVyJhYQ989TLli3zeu9wb+Tl5TE2XbLZbGhoaBDs/J6CpY6m\nL6ab3DSZTOjo6GD8/2D/5gKov2i42ogaxJVcSLi3t5d1a/FMG135KiQkhHXOCxcuiLLEamRkhPXh\nooDk/DYyeZJyeHjY/T70nASeO3du0E4Ce1Jr0XA1EnUr2jfffHPa/y9nIWHPUXhWVhZrEkwIy5cv\nR21trXtHQ5PJhKamJsHSNi6e+4anpKR4tXGX2tlsNhgMBly6dAl9fX0YGhrCnj17oNVqER8fj3nz\n5iEzMxP5+fnIz88P+lSKi1qLhquRbOuoYmNjceDAAVk2iR8cHGS9AX29xd5bWq2WdctyfX09YwQo\nBEqlMJnNZlRVVSErKwu///3vceXKFQwODrr/3S0WC27fvo0rV67gww8/xNtvv43GxkbF13+VkhqL\nhquRLEE8KSkJW7duRXNzM+fXLrF5jsJTUlJEvbmjqKiIse58eHiYNXL2x9DQEKtmaTAHcaPRiOLi\nYuzatYtzNz4uIyMjeOONNwKi/quUsrKyUFdXx5la8YaSioarlaRBPCUlBRs2bMCOHTsQHR2Nr7/+\nGqdOnZKyC3j48CG++uorRtuaNWtE/RodFRXF+hDU1dUJtjGW5wqLhQsXIiYmRpBzBxqDwYDS0lLe\nu0e66r963vUazFJSUtDQ0ICqqirOVStc9Ho9qqqq0NDQQCNwkYkaxHU6HXJycvDd734Xhw8fRnd3\nN37yk58wRqVXr15lpQLE1NjYyEhlxMbGIjc3V/Tn9ZzgvHPnDudGQ3xQKsXJaDSivLzc5/XMnlz1\nX72pBhQsdDoddu7cCYPBgMOHD+O73/0ucnJyoNPpoNFoWJ91g8GAnTt3Ug5cAqJObHLtm/Ctb30L\nHR0djEor1dXVWLhwoaDL+7iYzWZWtZ2SkhJJbrGeN28ecnNzGRst1dXV+b3d6cDAAKOcnEajQV5e\nnl/nDERUE1IaOp0Or7zyCl555RW5u0ImSJ4TDw0Nxcsvv8zY08JkMuHjjz8Wfd/tpqYmxh+WWbNm\nYcWKFaI+52Sek6ddXV1elQ2bjmcqJSMjg1EmLlhQTUgSrGSZ2ExMTMTTTz/NaOvs7MTFixdFe06b\nzYb6+npG26pVqyQtv5WamoqFCxcy2vzZGMvhcFAqBVQTkgQ3vkFcD+DvAK4AuA7gdV9PsHr1ataH\n68yZM7h//z7PLk3v6tWrGBkZcR+HhYVxVh0RW2lpKeO4paUFDx484HWu/v5+1rYBUuT3lYZqQpJg\nxjeIWwDsBLAMwOMAtgPwaQ1SSEgIXnzxRcYtuOPj4zhx4gTsdjvPbnFzOBysEe/y5csRFRUl6PN4\nIzs7mxFYHA4H6xuCtzxH4VlZWZg1a5Zf/QtEVBOSBDO+QbwfgCuCfA3gKwA+ryOaO3cua0ezW7du\nCb73dldXF2PyDxD+FntvcW2M1dTU5L6j01uUSvkG1YQkwUyInHg6gFUAvuDz4BUrVmDx4sWMts8+\n+8zvCb/Jzp07xzjOy8uT9Zb0ZcuWMSYfx8fHWatmZmI0GjE8POw+DgsL4xxFBgOqCUmCmb9LDGcD\n+ADAPwN46Pk/9+zZ4/65rKwMZWVlrBNoNBo8//zz+M1vfuMejdrtdpw4cQI7duzwq8IO4Ny1zvND\nKNYt9t4KCwtDcXExPv30U3dbQ0MDSkpKvL5ez1H44sWLg3YpHNWEJIGstrYWtbW1vB/vT4QMB/BH\nAEcAfMj1C5OD+HRmz56Nb3/72/jggw/cbXfv3kVtbS3Ky8v96CJ79UdaWhoWLFjg1zmFsHLlSnz+\n+efuADE6Oorm5mavqgrZ7XbOfbCDlVarZQVak8nEudpkJlQTkkjNc4C7d+9enx7PN52iAfAOgGsA\n3uJ5Doa8vDw89thjjLZz586ht7eX9zkfPHjACnZyj8JdIiIiWAH7yy+/9GqtfG9vL6O4hFarRXZ2\ntuB9DBRUE5IEM75BvBTA9wCsBXBp4r9n/e3Mc889hzlz5jDaPvzwQ95fZz2DYkJCgqKCXXFxMeNu\n0Xv37nm1vadnKiUnJ0fS9e5KQzUhSTDjG8S/mHjscgArJv77i7+diYiIwIsvvshoGxoa4lxCNpOx\nsTFcunSJ0VZSUqKo/aJjYmJYhRtmWpljs9lYOyAGcyoFoJqQJLjJtp/4VDIzM1nLwy5evMgqozWT\nCxcuMArgzpkzB8uWLROkj0LyTO/cvHkTN2/enPL3u7u7GcsRIyIi/N5/JdBRTUgSzBQXxAHgmWee\nwbx58xhtH3/8sdd7j1utVtbX4uLiYr9XuoghKSmJtdfydKNxz1RKbm4uYx+aYEQ1IUkwU2QQDw8P\nx0svvcRIffiy93hzczNGR0fdx1qt1qtVH3LxHI23tbVxjiCtVitjF0SA6mi6UE1IEqzETBA7/N2V\n8K9//Ss+//xzRtt3vvMdZGdn49ixYzhz5gyamprQ1dUFi8UCrVaLRYsWISoqCnq9Hvn5+QgLC0NJ\nSQln3lQpHA4H9u/f714ZYbVa8fDhQwwMDDCuLzw8HDExMUhOTkZmZiaKi4vx+uuvS7KVbiAwGo1T\n1oT0VVpaGurq6qigAZHcxODV69is6CBus9lw4MAB992bVqsVV65cwYULF7wqoRUdHY0nn3wShw4d\nQkJCgl99EVtLSwuOHz+OpqYmfPHFF4zNuqYSHx+PPXv2YPv27UF7o48ng8Hgd2GI9PR0nD17lkqK\nEVmoKogDzpt+/vM//xNDQ0N47733WHugeKOgoADV1dWKuMlnKjdv3sTq1at5VZMJhOuT0u3bt1FR\nUcGrRFtBQQFOnTpFI3AiG1+DuJgcQnn//fcdMTExDgC8/0tLS3N0dHQI1ichdXR0ONLS0lR7fXIw\nmUyOqqoqR2pqqlf/fnq93lFVVeUwmUxyd50EuYn3pNcUPxJXe55T7dcnN7PZjOPHj+P06dNoampC\nd3e3e/4kIyMDhYWFWL9+PSorK2kVClEEVaVTzGYziouLp/xa7GvdRMD5dVkpdRPVfn2EEN+pKohX\nVVVh165drPbIyEhs3Lhx2k3/e3p6cPz4cc6lY1VVVdi5c6dffROC2q+PEOI71QRxs9mMrKwsVtkt\nV91Eb8puDQ4O4uDBg6xAp9frYTAYZP36rPbrI4Tw42sQV+wCY7XXTVT79RFCpKHYIK72uolqvz5C\niDQUG8TVXjdR7ddHCJGGYoO42usmqv36CCHSUGwQV3vdRLVfHyFEGooN4lwrK7jqH3pDiXUT1X59\nhBBpKDaIq71uotqvjxAiDcUGcbXXTVT79RFCpKHYIK72uolqvz5CiDRUfcfmwMAAZ9ktJdzRqPbr\nI4Two5o7NtVeN1Ht10cIkYZiR+LAzLv8LVmyBEVFRaxd/hobGzlTDICydvlT+/URQnynmg2wXNS+\n37bar48Q4hvVpFNcFixYgJqaGp/3FPGUnp6OmpoaxQU4tV8fIURcig/iAJCVlYW6ujoUFBTwenxB\nQQHOnTun2MK3ar8+Qoh4AiKIA0BKSgoaGhpQVVWF1NRUrx6j1+tRVVWFhoYGxY9Q1X59hBBxKD4n\nzkXtdRPVfn2EkKmpbmKTEEKCieomNgkhhEyNgjghhAQwf4L4swCuALgG4F+E6Q4hhBBf8M2J6wC0\nAXgCQD+ALwH8EMClSb9DOXFCCPGRVDnxYgBXARgBWAEcB7CB57kIIYTwxDeIpwK4Oen41kQbIYQQ\nCfEN4pQnIYQQBQjj+bhbAPSTjvVgjswBAHv27HH/XFZWhrKyMp5PRwgh6lRbW4va2lrej+c7sRkB\n58RmKYC7AOoA/HcATZN+hyY2CSHER75ObPIdiZsA/BjAaThTMv8PzABOCCFEAnTbPSGEKAjddk8I\nIUGEgjghhAQwCuKEEBLAKIgTQkgAoyBOCCEBjII4IYQEMArihBASwCiIE0JIAKMgTgghAYyCOCGE\nBDAK4oQQEsAoiBNCSACjIM6TP/v/BgI1X5+arw2g6ws2FMR5UvsbSc3Xp+ZrA+j6gg0FcUIICWAU\nxAkhJICJWRTiMoACEc9PCCFq1AxgudydIIQQQgghhBBCCCE+eRbAFQDXAPyLzH0Rmh7A3+G8vusA\nXpe3O6IIBXAJwEm5OyKCWAAfwJl3bAVQIm93BLcXQDuANgB/ABApb3f8dhBAP5yfN5c4AGcBfAXg\nNJyvaaDiur7/A2fsvAbgEwDzpO6UDkA3gAUAwgCcB7BC6k6IKAlA/sTPs+H8wKhtAvcnAN4D8LHc\nHRHBBwD+aeLnEADRMvZFaFkAugBoJ46PA9gmX3cE8SSc8WNykPsPAK9O/PwqgF9L3SkBcV3fWnyz\ncnAfgLek7tRTcP71cPkpgP8tdSck9AcAz8ndCQGlAqiB842ktpH4PAAdcndCRHFwfjucC+cA6iSA\ncll7JIx0MINcJ74ZncYDMEjdIYGlg3l9kz0P4P3pHizGOvFUADcnHd+aaFOjdACrAHwhcz+E9BaA\n1wDY5e6ICLIBDMD5oWgB8Hs4v02pxX0AvwLQC+A2gAdw/kFWmwQA9yZ+HgSQKGNfxPZDAB9N9wti\nBHGHCOdUotlwfjX/ZwAPZe6LUL4N4C6c+XAx7yGQSwicf3T/Hc6U2H0A/yprj4SVCWd6IR1ACpzv\n0U1ydoj45WcALHCmNqckRhC/Befkn4sezJG5GoQD+COAIwA+lLkvQloD4AU45zSOAngaztGqWtwE\nYIRzngZwpsLUdFNFEYA6OEepVgB/AvCErD0SxwCcaRTAOSq/K2NfxPIDABsg0x/hCAA34JzYDIfz\nA1MoR0dEooEzsEk+2SCxb0F9OXEAuABg8cTPewD8X/m6IrhVcKaJZsH5Pj0M4H/K2iNhpGPqic3/\nAeBtqTsksHQwr+9ZAFfxzR8qWTwH55vpGoA35OyICJ6AM198Gc60wyU4/9HV5ltQ5+qUAjgHFlcB\nnIJzElBN9sA5eXsdwDE4B1WB7Cic+X0LnN+ktoC5xPAMAnuJoef1bYXz9evBN/HlN7L1jhBCCCGE\nEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBDivf8Pj5L933FLjAUAAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x2659750>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Particularly useful when you have a long timeseries:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sympy.mpmath import mp\n",
"mp.dps = 1000 # number of digits\n",
"pi = str(mp.pi)\n",
"\n",
"fig, ax = plt.subplots()\n",
"points = ax.plot([int(d) for d in pi[2:]], 'o-', color='grey', ms=3, mew=1, linewidth=1)\n",
"ax.set_ylim(bottom=-1, top=10)\n",
"ax.set_xlim(left=-1, right=100)\n",
"plugins.connect(fig, \n",
" plugins.ResetButton(),\n",
" plugins.ConfigurableZoomAndPan(\n",
" ax, zoom_y=False, xlim=(-1,1001), ylim=(-1,10))\n",
" )"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" <style>\n",
"\n",
"\n",
" div#figuref7b40d4447994adf80ed318612535705\n",
" .axesbg{\n",
" fill: #FFFFFF;\n",
" }\n",
"\n",
"\n",
"\n",
"div#figuref7b40d4447994adf80ed318612535705\n",
".axis line, .axis path {\n",
" shape-rendering: crispEdges;\n",
" stroke: black;\n",
" fill: none;\n",
"}\n",
"\n",
"div#figuref7b40d4447994adf80ed318612535705\n",
".axis text {\n",
" font-family: sans-serif;\n",
" font-size: 10.0px;\n",
" fill: black;\n",
" stroke: none;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figuref7b40d4447994adf80ed318612535705\n",
".axis line, .axis path {\n",
" shape-rendering: crispEdges;\n",
" stroke: black;\n",
" fill: none;\n",
"}\n",
"\n",
"div#figuref7b40d4447994adf80ed318612535705\n",
".axis text {\n",
" font-family: sans-serif;\n",
" font-size: 10.0px;\n",
" fill: black;\n",
" stroke: none;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figuref7b40d4447994adf80ed318612535705\n",
".axes1\n",
"path.line3 {\n",
" stroke: #808080;\n",
" stroke-width: 1;\n",
" stroke-dasharray: 10,0;\n",
" fill: none;\n",
" stroke-opacity: 1;\n",
"}\n",
"\n",
"div#figuref7b40d4447994adf80ed318612535705\n",
".axes1\n",
"path.points3 {\n",
" stroke-width: 1;\n",
" stroke: #000000;\n",
" fill: #808080;\n",
" fill-opacity: 1;\n",
" stroke-opacity: 1;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figuref7b40d4447994adf80ed318612535705\n",
"text.text908ca80b946f4094bed82018241d0c71 {\n",
" font-size : 10.0px;\n",
" fill : #000000;\n",
" opacity : 1;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figuref7b40d4447994adf80ed318612535705\n",
"text.text21cb4bc8329d41a5b2cc69823bc33803 {\n",
" font-size : 10.0px;\n",
" fill : #000000;\n",
" opacity : 1;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figuref7b40d4447994adf80ed318612535705\n",
"text.text1bfda630af5c43648c2edf71057cfe06 {\n",
" font-size : 12.0px;\n",
" fill : #000000;\n",
" opacity : 1;\n",
"}\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" </style>\n",
"\n",
"\n",
"\n",
" <div id='figuref7b40d4447994adf80ed318612535705'>\n",
" </div>\n",
" <script type=\"text/javascript\">\n",
" var create_figf7b40d4447994adf80ed318612535705 = function(d3, undefined){\n",
"\n",
"\n",
" function Figure(figid, width, height){\n",
" this.figid = figid;\n",
" this.root = d3.select(figid);\n",
" this.width = width;\n",
" this.height = height;\n",
" this.axes = [];\n",
" }\n",
"\n",
" Figure.prototype.draw = function(){\n",
" this.canvas = this.root.append('svg:svg')\n",
" .attr('class', 'figure')\n",
" .attr('width', this.width)\n",
" .attr('height', this.height);\n",
" for (var i=0; i<this.axes.length; i++){\n",
" this.axes[i].draw();\n",
" }\n",
" };\n",
"\n",
" Figure.prototype.reset = function(duration){\n",
" duration = (typeof duration !== 'undefined') ? duration : 750;\n",
" for (var i=0; i<this.axes.length; i++){\n",
" this.axes[i].prep_reset();\n",
" }\n",
"\n",
" var transition = function(t){\n",
" for (var i=0; i<this.axes.length; i++){\n",
" this.axes[i].xdom(this.axes[i].xdom.domain(this.axes[i].ix(t)));\n",
" this.axes[i].ydom(this.axes[i].ydom.domain(this.axes[i].iy(t)));\n",
"\n",
" // don't propagate: this will be done as part of the loop.\n",
" this.axes[i].zoomed(false);\n",
" }\n",
" }.bind(this)\n",
"\n",
" d3.transition().duration(duration)\n",
" .tween(\"zoom\", function(){return transition;});\n",
"\n",
" for (var i=0; i<this.axes.length; i++){\n",
" this.axes[i].finalize_reset();\n",
" }\n",
" };\n",
"\n",
"\n",
"\n",
" function Axes(fig, bbox,\n",
" xlim, ylim,\n",
" xscale, yscale,\n",
" xdomain, ydomain,\n",
" xgridOn, ygridOn,\n",
" axclass, clipid,\n",
" zoomable){\n",
" this.axnum = fig.axes.length;\n",
" fig.axes.push(this);\n",
"\n",
" this.fig = fig;\n",
" this.bbox = bbox;\n",
" this.xlim = xlim;\n",
" this.ylim = ylim;\n",
" this.xdomain = xdomain;\n",
" this.ydomain = ydomain;\n",
" this.xscale = xscale;\n",
" this.yscale = yscale;\n",
" this.xgridOn = xgridOn;\n",
" this.ygridOn = ygridOn;\n",
" this.axclass = (typeof axclass !== 'undefined') ? axclass : \"axes\";\n",
" this.clipid = (typeof clipid != 'undefined') ? clipid : \"clip\";\n",
" this.zoomable = zoomable;\n",
"\n",
" this.sharex = [];\n",
" this.sharey = [];\n",
" this.elements = [];\n",
"\n",
" this.position = [this.bbox[0] * this.fig.width,\n",
" (1 - this.bbox[1] - this.bbox[3]) * this.fig.height];\n",
" this.width = bbox[2] * this.fig.width;\n",
" this.height = bbox[3] * this.fig.height;\n",
"\n",
" if(this.xscale === 'log'){\n",
" this.xdom = d3.scale.log();\n",
" }else if(this.xscale === 'date'){\n",
" this.xdom = d3.time.scale();\n",
" }else{\n",
" this.xdom = d3.scale.linear();\n",
" }\n",
"\n",
" if(this.yscale === 'log'){\n",
" this.ydom = d3.scale.log();\n",
" }else if(this.yscale === 'date'){\n",
" this.ydom = d3.time.scale();\n",
" }else{\n",
" this.ydom = d3.scale.linear();\n",
" }\n",
"\n",
" this.xdom.domain(this.xdomain)\n",
" .range([0, this.width]);\n",
"\n",
" this.ydom.domain(this.ydomain)\n",
" .range([this.height, 0]);\n",
"\n",
" if(this.xscale === 'date'){\n",
" this.xmap = d3.time.scale()\n",
" .domain(this.xdomain)\n",
" .range(this.xlim);\n",
" this.x = function(x){return this.xdom(this.xmap.invert(x));}\n",
" }else if(this.xscale === 'log'){\n",
" this.xmap = this.xdom;\n",
" this.x = this.xdom;\n",
" }else{\n",
" this.xmap = this.xdom;\n",
" this.x = this.xdom;\n",
" }\n",
"\n",
" if(this.yscale === 'date'){\n",
" this.ymap = d3.time.scale()\n",
" .domain(this.ydomain)\n",
" .range(this.ylim);\n",
" this.y = function(y){return this.ydom(this.ymap.invert(y));}\n",
" }else if(this.xscale === 'log'){\n",
" this.ymap = this.ydom;\n",
" this.y = this.ydom;\n",
" }else{\n",
" this.ymap = this.ydom;\n",
" this.y = this.ydom;\n",
" }\n",
" }\n",
"\n",
" Axes.prototype.draw = function(){\n",
" this.zoom = d3.behavior.zoom()\n",
" .x(this.xdom)\n",
" .y(this.ydom)\n",
" .on(\"zoom\", this.zoomed.bind(this));\n",
" var canvas = this.fig.canvas;\n",
" canvas\n",
" .on(\"mousedown.cursor\", function () { canvas.attr(\"style\", \"cursor:move\"); })\n",
" .on(\"mouseup.cursor\", function () { canvas.attr(\"style\", \"cursor:auto\"); });\n",
"\n",
" this.baseaxes = this.fig.canvas.append(\"g\")\n",
" .attr('transform', 'translate('\n",
" + this.position[0] + ','\n",
" + this.position[1] + ')')\n",
" .attr('width', this.width)\n",
" .attr('height', this.height)\n",
" .attr('class', \"baseaxes\");\n",
"\n",
" if(this.zoomable){\n",
" this.baseaxes.call(this.zoom);\n",
" }\n",
"\n",
" this.axesbg = this.baseaxes.append(\"svg:rect\")\n",
" .attr(\"width\", this.width)\n",
" .attr(\"height\", this.height)\n",
" .attr(\"class\", \"axesbg\");\n",
"\n",
" this.clip = this.baseaxes.append(\"svg:clipPath\")\n",
" .attr(\"id\", this.clipid)\n",
" .append(\"svg:rect\")\n",
" .attr(\"x\", 0)\n",
" .attr(\"y\", 0)\n",
" .attr(\"width\", this.width)\n",
" .attr(\"height\", this.height)\n",
"\n",
" this.axes = this.baseaxes.append(\"g\")\n",
" .attr(\"class\", this.axclass)\n",
" .attr(\"clip-path\", \"url(#\" + this.clipid + \")\");\n",
"\n",
" for(var i=0; i<this.elements.length; i++){\n",
" this.elements[i].draw();\n",
" }\n",
" };\n",
"\n",
" Axes.prototype.zoomed = function(propagate){\n",
" // propagate is a boolean specifying whether to propagate movements\n",
" // to shared axes, specified by sharex and sharey. Default is true.\n",
" propagate = (typeof propagate == 'undefined') ? true : propagate;\n",
"\n",
" //console.log(this.zoom.translate());\n",
" //console.log(this.zoom.scale());\n",
" //console.log(this.zoom.x().domain());\n",
" //console.log(this.zoom.y().domain());\n",
"\n",
" for(var i=0; i<this.elements.length; i++){\n",
" this.elements[i].zoomed();\n",
" }\n",
"\n",
" if(propagate){\n",
" // update shared x axes\n",
" for(var i=0; i<this.sharex.length; i++){\n",
" this.sharex[i].zoom.x().domain(this.zoom.x().domain());\n",
" this.sharex[i].zoomed(false);\n",
" }\n",
" // update shared y axes\n",
" for(var i=0; i<this.sharey.length; i++){\n",
" this.sharey[i].zoom.y().domain(this.zoom.y().domain());\n",
" this.sharey[i].zoomed(false);\n",
" }\n",
" }\n",
" };\n",
"\n",
" Axes.prototype.add_element = function(element){\n",
" this.elements.push(element);\n",
" };\n",
"\n",
" Axes.prototype.prep_reset = function(){\n",
" // interpolate() does not work on dates, so we map dates to numbers,\n",
" // interpolate the numbers, and then invert the map.\n",
" // we use the same strategy for log, so the interpolation will be smooth.\n",
" // There probably is a cleaner approach...\n",
"\n",
" if (this.xscale === 'date'){\n",
" var start = this.xdom.domain();\n",
" var end = this.xdomain;\n",
" var interp = d3.interpolate(\n",
" [this.xmap(start[0]), this.xmap(start[1])],\n",
" [this.xmap(end[0]), this.xmap(end[1])]);\n",
" this.ix = function(t){\n",
" return [this.xmap.invert(interp(t)[0]),\n",
" this.xmap.invert(interp(t)[1])];\n",
" }\n",
" }else{\n",
" this.ix = d3.interpolate(this.xdom.domain(), this.xlim);\n",
" }\n",
"\n",
" if (this.yscale === 'date'){\n",
" var start = this.ydom.domain();\n",
" var end = this.ydomain;\n",
" var interp = d3.interpolate(\n",
" [this.ymap(start[0]), this.ymap(start[1])],\n",
" [this.ymap(end[0]), this.ymap(end[1])]);\n",
" this.iy = function(t){\n",
" return [this.ymap.invert(interp(t)[0]),\n",
" this.ymap.invert(interp(t)[1])];\n",
" }\n",
" }else{\n",
" this.iy = d3.interpolate(this.ydom.domain(), this.ylim);\n",
" }\n",
" }\n",
"\n",
" Axes.prototype.finalize_reset = function(){\n",
" this.zoom.scale(1).translate([0, 0]);\n",
" }\n",
"\n",
" Axes.prototype.reset = function(){\n",
" this.prep_reset();\n",
" d3.transition().duration(750).tween(\"zoom\", function() {\n",
" return function(t) {\n",
" this.zoom.x(this.xdom.domain(this.ix(t)))\n",
" .y(this.ydom.domain(this.iy(t)));\n",
" this.zoomed();\n",
" };\n",
" });\n",
" this.finalize_reset();\n",
" };\n",
"\n",
"\n",
"\n",
" function Axis(axes, position, nticks, tickvalues, tickformat){\n",
" this.axes = axes;\n",
" this.position = position;\n",
" this.nticks = nticks;\n",
" this.tickvalues = tickvalues;\n",
" this.tickformat = tickformat;\n",
" if (position == \"bottom\"){\n",
" this.transform = \"translate(0,\" + this.axes.height + \")\";\n",
" this.scale = this.axes.xdom;\n",
" this.class = \"x axis\";\n",
" }else if (position == \"top\"){\n",
" this.transform = \"translate(0,0)\"\n",
" this.scale = this.axes.xdom;\n",
" this.class = \"x axis\";\n",
" }else if (position == \"left\"){\n",
" this.transform = \"translate(0,0)\";\n",
" this.scale = this.axes.ydom;\n",
" this.class = \"y axis\";\n",
" }else{\n",
" this.transform = \"translate(\" + this.axes.width + \",0)\";\n",
" this.scale = this.axes.ydom;\n",
" this.class = \"y axis\";\n",
" }\n",
" }\n",
"\n",
" Axis.prototype.draw = function(){\n",
" this.axis = d3.svg.axis()\n",
" .scale(this.scale)\n",
" .orient(this.position)\n",
" .ticks(this.nticks)\n",
" .tickValues(this.tickvalues)\n",
" .tickFormat(this.tickformat);\n",
" this.elem = this.axes.baseaxes.append('g')\n",
" .attr(\"transform\", this.transform)\n",
" .attr(\"class\", this.class)\n",
" .call(this.axis);\n",
" };\n",
"\n",
" Axis.prototype.zoomed = function(){\n",
" this.elem.call(this.axis);\n",
" };\n",
"\n",
"\n",
"\n",
" function Grid(axes, xy){\n",
" this.axes = axes;\n",
" this.class = xy + \" grid\"\n",
" if(xy == \"x\"){\n",
" this.transform = \"translate(0,\" + this.axes.height + \")\";\n",
" this.position = \"bottom\";\n",
" this.scale = this.axes.xdom;\n",
" this.tickSize = -this.axes.height;\n",
" }else{\n",
" this.transform = \"translate(0,0)\";\n",
" this.position = \"left\";\n",
" this.scale = this.axes.ydom;\n",
" this.tickSize = -this.axes.width;\n",
" }\n",
" }\n",
"\n",
" Grid.prototype.draw = function(){\n",
" this.grid = d3.svg.axis()\n",
" .scale(this.scale)\n",
" .orient(this.position)\n",
" .tickSize(this.tickSize, 0, 0)\n",
" .tickFormat(\"\");\n",
" this.elem = this.axes.axes.append(\"g\")\n",
" .attr(\"class\", this.class)\n",
" .attr(\"transform\", this.transform)\n",
" .call(this.grid);\n",
" };\n",
"\n",
" Grid.prototype.zoomed = function(){\n",
" this.elem.call(this.grid);\n",
" };\n",
"\n",
"\n",
"\n",
" // This function constructs a mapped SVG path\n",
" // from an input data array\n",
" var construct_SVG_path = function(data, xmap, ymap){\n",
" var result = \"\";\n",
" for (var i=0;i<data.length;i++){\n",
" result += data[i][0];\n",
" if(data[i][0] == 'Z'){\n",
" continue;\n",
" }\n",
" for (var j=0;j<data[i][1].length;j++){\n",
" if(j % 2 == 0){\n",
" result += \" \" + xmap(data[i][1][j]);\n",
" }else{\n",
" result += \" \" + ymap(data[i][1][j]);\n",
" }\n",
" }\n",
" result += \" \";\n",
" }\n",
" return result;\n",
" };\n",
"\n",
"\n",
" var figwidth = 6.0 * 80;\n",
" var figheight = 4.0 * 80;\n",
" var fig = new Figure(\"div#figuref7b40d4447994adf80ed318612535705\",\n",
" figwidth, figheight);\n",
"\n",
"\n",
"\n",
" var ax1 = new Axes(fig, [0.125, 0.125, 0.77500000000000002, 0.77500000000000002], [-1.0, 100.0], [-1.0, 10.0],\n",
" \"linear\", \"linear\",\n",
" [-1.0, 100.0], [-1.0, 10.0],\n",
" false, false,\n",
" \"axes1\",\n",
" \"clipf7b40d4447994adf80ed3186125357051\", true);\n",
"\n",
"\n",
"\n",
"// Add an Axis element\n",
"ax1.add_element(new Axis(ax1, \"bottom\",\n",
" 7, null,\n",
" null));\n",
"\n",
"\n",
"\n",
"// Add an Axis element\n",
"ax1.add_element(new Axis(ax1, \"left\",\n",
" 7, null,\n",
" null));\n",
"\n",
"\n",
"\n",
"// Add a Line2D element\n",
"var line531645844ac04808a2fd1db26f4c6d5b = new function(){\n",
" this.data = [[0.0, 1.0], [1.0, 4.0], [2.0, 1.0], [3.0, 5.0], [4.0, 9.0], [5.0, 2.0], [6.0, 6.0], [7.0, 5.0], [8.0, 3.0], [9.0, 5.0], [10.0, 8.0], [11.0, 9.0], [12.0, 7.0], [13.0, 9.0], [14.0, 3.0], [15.0, 2.0], [16.0, 3.0], [17.0, 8.0], [18.0, 4.0], [19.0, 6.0], [20.0, 2.0], [21.0, 6.0], [22.0, 4.0], [23.0, 3.0], [24.0, 3.0], [25.0, 8.0], [26.0, 3.0], [27.0, 2.0], [28.0, 7.0], [29.0, 9.0], [30.0, 5.0], [31.0, 0.0], [32.0, 2.0], [33.0, 8.0], [34.0, 8.0], [35.0, 4.0], [36.0, 1.0], [37.0, 9.0], [38.0, 7.0], [39.0, 1.0], [40.0, 6.0], [41.0, 9.0], [42.0, 3.0], [43.0, 9.0], [44.0, 9.0], [45.0, 3.0], [46.0, 7.0], [47.0, 5.0], [48.0, 1.0], [49.0, 0.0], [50.0, 5.0], [51.0, 8.0], [52.0, 2.0], [53.0, 0.0], [54.0, 9.0], [55.0, 7.0], [56.0, 4.0], [57.0, 9.0], [58.0, 4.0], [59.0, 4.0], [60.0, 5.0], [61.0, 9.0], [62.0, 2.0], [63.0, 3.0], [64.0, 0.0], [65.0, 7.0], [66.0, 8.0], [67.0, 1.0], [68.0, 6.0], [69.0, 4.0], [70.0, 0.0], [71.0, 6.0], [72.0, 2.0], [73.0, 8.0], [74.0, 6.0], [75.0, 2.0], [76.0, 0.0], [77.0, 8.0], [78.0, 9.0], [79.0, 9.0], [80.0, 8.0], [81.0, 6.0], [82.0, 2.0], [83.0, 8.0], [84.0, 0.0], [85.0, 3.0], [86.0, 4.0], [87.0, 8.0], [88.0, 2.0], [89.0, 5.0], [90.0, 3.0], [91.0, 4.0], [92.0, 2.0], [93.0, 1.0], [94.0, 1.0], [95.0, 7.0], [96.0, 0.0], [97.0, 6.0], [98.0, 7.0], [99.0, 9.0], [100.0, 8.0], [101.0, 2.0], [102.0, 1.0], [103.0, 4.0], [104.0, 8.0], [105.0, 0.0], [106.0, 8.0], [107.0, 6.0], [108.0, 5.0], [109.0, 1.0], [110.0, 3.0], [111.0, 2.0], [112.0, 8.0], [113.0, 2.0], [114.0, 3.0], [115.0, 0.0], [116.0, 6.0], [117.0, 6.0], [118.0, 4.0], [119.0, 7.0], [120.0, 0.0], [121.0, 9.0], [122.0, 3.0], [123.0, 8.0], [124.0, 4.0], [125.0, 4.0], [126.0, 6.0], [127.0, 0.0], [128.0, 9.0], [129.0, 5.0], [130.0, 5.0], [131.0, 0.0], [132.0, 5.0], [133.0, 8.0], [134.0, 2.0], [135.0, 2.0], [136.0, 3.0], [137.0, 1.0], [138.0, 7.0], [139.0, 2.0], [140.0, 5.0], [141.0, 3.0], [142.0, 5.0], [143.0, 9.0], [144.0, 4.0], [145.0, 0.0], [146.0, 8.0], [147.0, 1.0], [148.0, 2.0], [149.0, 8.0], [150.0, 4.0], [151.0, 8.0], [152.0, 1.0], [153.0, 1.0], [154.0, 1.0], [155.0, 7.0], [156.0, 4.0], [157.0, 5.0], [158.0, 0.0], [159.0, 2.0], [160.0, 8.0], [161.0, 4.0], [162.0, 1.0], [163.0, 0.0], [164.0, 2.0], [165.0, 7.0], [166.0, 0.0], [167.0, 1.0], [168.0, 9.0], [169.0, 3.0], [170.0, 8.0], [171.0, 5.0], [172.0, 2.0], [173.0, 1.0], [174.0, 1.0], [175.0, 0.0], [176.0, 5.0], [177.0, 5.0], [178.0, 5.0], [179.0, 9.0], [180.0, 6.0], [181.0, 4.0], [182.0, 4.0], [183.0, 6.0], [184.0, 2.0], [185.0, 2.0], [186.0, 9.0], [187.0, 4.0], [188.0, 8.0], [189.0, 9.0], [190.0, 5.0], [191.0, 4.0], [192.0, 9.0], [193.0, 3.0], [194.0, 0.0], [195.0, 3.0], [196.0, 8.0], [197.0, 1.0], [198.0, 9.0], [199.0, 6.0], [200.0, 4.0], [201.0, 4.0], [202.0, 2.0], [203.0, 8.0], [204.0, 8.0], [205.0, 1.0], [206.0, 0.0], [207.0, 9.0], [208.0, 7.0], [209.0, 5.0], [210.0, 6.0], [211.0, 6.0], [212.0, 5.0], [213.0, 9.0], [214.0, 3.0], [215.0, 3.0], [216.0, 4.0], [217.0, 4.0], [218.0, 6.0], [219.0, 1.0], [220.0, 2.0], [221.0, 8.0], [222.0, 4.0], [223.0, 7.0], [224.0, 5.0], [225.0, 6.0], [226.0, 4.0], [227.0, 8.0], [228.0, 2.0], [229.0, 3.0], [230.0, 3.0], [231.0, 7.0], [232.0, 8.0], [233.0, 6.0], [234.0, 7.0], [235.0, 8.0], [236.0, 3.0], [237.0, 1.0], [238.0, 6.0], [239.0, 5.0], [240.0, 2.0], [241.0, 7.0], [242.0, 1.0], [243.0, 2.0], [244.0, 0.0], [245.0, 1.0], [246.0, 9.0], [247.0, 0.0], [248.0, 9.0], [249.0, 1.0], [250.0, 4.0], [251.0, 5.0], [252.0, 6.0], [253.0, 4.0], [254.0, 8.0], [255.0, 5.0], [256.0, 6.0], [257.0, 6.0], [258.0, 9.0], [259.0, 2.0], [260.0, 3.0], [261.0, 4.0], [262.0, 6.0], [263.0, 0.0], [264.0, 3.0], [265.0, 4.0], [266.0, 8.0], [267.0, 6.0], [268.0, 1.0], [269.0, 0.0], [270.0, 4.0], [271.0, 5.0], [272.0, 4.0], [273.0, 3.0], [274.0, 2.0], [275.0, 6.0], [276.0, 6.0], [277.0, 4.0], [278.0, 8.0], [279.0, 2.0], [280.0, 1.0], [281.0, 3.0], [282.0, 3.0], [283.0, 9.0], [284.0, 3.0], [285.0, 6.0], [286.0, 0.0], [287.0, 7.0], [288.0, 2.0], [289.0, 6.0], [290.0, 0.0], [291.0, 2.0], [292.0, 4.0], [293.0, 9.0], [294.0, 1.0], [295.0, 4.0], [296.0, 1.0], [297.0, 2.0], [298.0, 7.0], [299.0, 3.0], [300.0, 7.0], [301.0, 2.0], [302.0, 4.0], [303.0, 5.0], [304.0, 8.0], [305.0, 7.0], [306.0, 0.0], [307.0, 0.0], [308.0, 6.0], [309.0, 6.0], [310.0, 0.0], [311.0, 6.0], [312.0, 3.0], [313.0, 1.0], [314.0, 5.0], [315.0, 5.0], [316.0, 8.0], [317.0, 8.0], [318.0, 1.0], [319.0, 7.0], [320.0, 4.0], [321.0, 8.0], [322.0, 8.0], [323.0, 1.0], [324.0, 5.0], [325.0, 2.0], [326.0, 0.0], [327.0, 9.0], [328.0, 2.0], [329.0, 0.0], [330.0, 9.0], [331.0, 6.0], [332.0, 2.0], [333.0, 8.0], [334.0, 2.0], [335.0, 9.0], [336.0, 2.0], [337.0, 5.0], [338.0, 4.0], [339.0, 0.0], [340.0, 9.0], [341.0, 1.0], [342.0, 7.0], [343.0, 1.0], [344.0, 5.0], [345.0, 3.0], [346.0, 6.0], [347.0, 4.0], [348.0, 3.0], [349.0, 6.0], [350.0, 7.0], [351.0, 8.0], [352.0, 9.0], [353.0, 2.0], [354.0, 5.0], [355.0, 9.0], [356.0, 0.0], [357.0, 3.0], [358.0, 6.0], [359.0, 0.0], [360.0, 0.0], [361.0, 1.0], [362.0, 1.0], [363.0, 3.0], [364.0, 3.0], [365.0, 0.0], [366.0, 5.0], [367.0, 3.0], [368.0, 0.0], [369.0, 5.0], [370.0, 4.0], [371.0, 8.0], [372.0, 8.0], [373.0, 2.0], [374.0, 0.0], [375.0, 4.0], [376.0, 6.0], [377.0, 6.0], [378.0, 5.0], [379.0, 2.0], [380.0, 1.0], [381.0, 3.0], [382.0, 8.0], [383.0, 4.0], [384.0, 1.0], [385.0, 4.0], [386.0, 6.0], [387.0, 9.0], [388.0, 5.0], [389.0, 1.0], [390.0, 9.0], [391.0, 4.0], [392.0, 1.0], [393.0, 5.0], [394.0, 1.0], [395.0, 1.0], [396.0, 6.0], [397.0, 0.0], [398.0, 9.0], [399.0, 4.0], [400.0, 3.0], [401.0, 3.0], [402.0, 0.0], [403.0, 5.0], [404.0, 7.0], [405.0, 2.0], [406.0, 7.0], [407.0, 0.0], [408.0, 3.0], [409.0, 6.0], [410.0, 5.0], [411.0, 7.0], [412.0, 5.0], [413.0, 9.0], [414.0, 5.0], [415.0, 9.0], [416.0, 1.0], [417.0, 9.0], [418.0, 5.0], [419.0, 3.0], [420.0, 0.0], [421.0, 9.0], [422.0, 2.0], [423.0, 1.0], [424.0, 8.0], [425.0, 6.0], [426.0, 1.0], [427.0, 1.0], [428.0, 7.0], [429.0, 3.0], [430.0, 8.0], [431.0, 1.0], [432.0, 9.0], [433.0, 3.0], [434.0, 2.0], [435.0, 6.0], [436.0, 1.0], [437.0, 1.0], [438.0, 7.0], [439.0, 9.0], [440.0, 3.0], [441.0, 1.0], [442.0, 0.0], [443.0, 5.0], [444.0, 1.0], [445.0, 1.0], [446.0, 8.0], [447.0, 5.0], [448.0, 4.0], [449.0, 8.0], [450.0, 0.0], [451.0, 7.0], [452.0, 4.0], [453.0, 4.0], [454.0, 6.0], [455.0, 2.0], [456.0, 3.0], [457.0, 7.0], [458.0, 9.0], [459.0, 9.0], [460.0, 6.0], [461.0, 2.0], [462.0, 7.0], [463.0, 4.0], [464.0, 9.0], [465.0, 5.0], [466.0, 6.0], [467.0, 7.0], [468.0, 3.0], [469.0, 5.0], [470.0, 1.0], [471.0, 8.0], [472.0, 8.0], [473.0, 5.0], [474.0, 7.0], [475.0, 5.0], [476.0, 2.0], [477.0, 7.0], [478.0, 2.0], [479.0, 4.0], [480.0, 8.0], [481.0, 9.0], [482.0, 1.0], [483.0, 2.0], [484.0, 2.0], [485.0, 7.0], [486.0, 9.0], [487.0, 3.0], [488.0, 8.0], [489.0, 1.0], [490.0, 8.0], [491.0, 3.0], [492.0, 0.0], [493.0, 1.0], [494.0, 1.0], [495.0, 9.0], [496.0, 4.0], [497.0, 9.0], [498.0, 1.0], [499.0, 2.0], [500.0, 9.0], [501.0, 8.0], [502.0, 3.0], [503.0, 3.0], [504.0, 6.0], [505.0, 7.0], [506.0, 3.0], [507.0, 3.0], [508.0, 6.0], [509.0, 2.0], [510.0, 4.0], [511.0, 4.0], [512.0, 0.0], [513.0, 6.0], [514.0, 5.0], [515.0, 6.0], [516.0, 6.0], [517.0, 4.0], [518.0, 3.0], [519.0, 0.0], [520.0, 8.0], [521.0, 6.0], [522.0, 0.0], [523.0, 2.0], [524.0, 1.0], [525.0, 3.0], [526.0, 9.0], [527.0, 4.0], [528.0, 9.0], [529.0, 4.0], [530.0, 6.0], [531.0, 3.0], [532.0, 9.0], [533.0, 5.0], [534.0, 2.0], [535.0, 2.0], [536.0, 4.0], [537.0, 7.0], [538.0, 3.0], [539.0, 7.0], [540.0, 1.0], [541.0, 9.0], [542.0, 0.0], [543.0, 7.0], [544.0, 0.0], [545.0, 2.0], [546.0, 1.0], [547.0, 7.0], [548.0, 9.0], [549.0, 8.0], [550.0, 6.0], [551.0, 0.0], [552.0, 9.0], [553.0, 4.0], [554.0, 3.0], [555.0, 7.0], [556.0, 0.0], [557.0, 2.0], [558.0, 7.0], [559.0, 7.0], [560.0, 0.0], [561.0, 5.0], [562.0, 3.0], [563.0, 9.0], [564.0, 2.0], [565.0, 1.0], [566.0, 7.0], [567.0, 1.0], [568.0, 7.0], [569.0, 6.0], [570.0, 2.0], [571.0, 9.0], [572.0, 3.0], [573.0, 1.0], [574.0, 7.0], [575.0, 6.0], [576.0, 7.0], [577.0, 5.0], [578.0, 2.0], [579.0, 3.0], [580.0, 8.0], [581.0, 4.0], [582.0, 6.0], [583.0, 7.0], [584.0, 4.0], [585.0, 8.0], [586.0, 1.0], [587.0, 8.0], [588.0, 4.0], [589.0, 6.0], [590.0, 7.0], [591.0, 6.0], [592.0, 6.0], [593.0, 9.0], [594.0, 4.0], [595.0, 0.0], [596.0, 5.0], [597.0, 1.0], [598.0, 3.0], [599.0, 2.0], [600.0, 0.0], [601.0, 0.0], [602.0, 0.0], [603.0, 5.0], [604.0, 6.0], [605.0, 8.0], [606.0, 1.0], [607.0, 2.0], [608.0, 7.0], [609.0, 1.0], [610.0, 4.0], [611.0, 5.0], [612.0, 2.0], [613.0, 6.0], [614.0, 3.0], [615.0, 5.0], [616.0, 6.0], [617.0, 0.0], [618.0, 8.0], [619.0, 2.0], [620.0, 7.0], [621.0, 7.0], [622.0, 8.0], [623.0, 5.0], [624.0, 7.0], [625.0, 7.0], [626.0, 1.0], [627.0, 3.0], [628.0, 4.0], [629.0, 2.0], [630.0, 7.0], [631.0, 5.0], [632.0, 7.0], [633.0, 7.0], [634.0, 8.0], [635.0, 9.0], [636.0, 6.0], [637.0, 0.0], [638.0, 9.0], [639.0, 1.0], [640.0, 7.0], [641.0, 3.0], [642.0, 6.0], [643.0, 3.0], [644.0, 7.0], [645.0, 1.0], [646.0, 7.0], [647.0, 8.0], [648.0, 7.0], [649.0, 2.0], [650.0, 1.0], [651.0, 4.0], [652.0, 6.0], [653.0, 8.0], [654.0, 4.0], [655.0, 4.0], [656.0, 0.0], [657.0, 9.0], [658.0, 0.0], [659.0, 1.0], [660.0, 2.0], [661.0, 2.0], [662.0, 4.0], [663.0, 9.0], [664.0, 5.0], [665.0, 3.0], [666.0, 4.0], [667.0, 3.0], [668.0, 0.0], [669.0, 1.0], [670.0, 4.0], [671.0, 6.0], [672.0, 5.0], [673.0, 4.0], [674.0, 9.0], [675.0, 5.0], [676.0, 8.0], [677.0, 5.0], [678.0, 3.0], [679.0, 7.0], [680.0, 1.0], [681.0, 0.0], [682.0, 5.0], [683.0, 0.0], [684.0, 7.0], [685.0, 9.0], [686.0, 2.0], [687.0, 2.0], [688.0, 7.0], [689.0, 9.0], [690.0, 6.0], [691.0, 8.0], [692.0, 9.0], [693.0, 2.0], [694.0, 5.0], [695.0, 8.0], [696.0, 9.0], [697.0, 2.0], [698.0, 3.0], [699.0, 5.0], [700.0, 4.0], [701.0, 2.0], [702.0, 0.0], [703.0, 1.0], [704.0, 9.0], [705.0, 9.0], [706.0, 5.0], [707.0, 6.0], [708.0, 1.0], [709.0, 1.0], [710.0, 2.0], [711.0, 1.0], [712.0, 2.0], [713.0, 9.0], [714.0, 0.0], [715.0, 2.0], [716.0, 1.0], [717.0, 9.0], [718.0, 6.0], [719.0, 0.0], [720.0, 8.0], [721.0, 6.0], [722.0, 4.0], [723.0, 0.0], [724.0, 3.0], [725.0, 4.0], [726.0, 4.0], [727.0, 1.0], [728.0, 8.0], [729.0, 1.0], [730.0, 5.0], [731.0, 9.0], [732.0, 8.0], [733.0, 1.0], [734.0, 3.0], [735.0, 6.0], [736.0, 2.0], [737.0, 9.0], [738.0, 7.0], [739.0, 7.0], [740.0, 4.0], [741.0, 7.0], [742.0, 7.0], [743.0, 1.0], [744.0, 3.0], [745.0, 0.0], [746.0, 9.0], [747.0, 9.0], [748.0, 6.0], [749.0, 0.0], [750.0, 5.0], [751.0, 1.0], [752.0, 8.0], [753.0, 7.0], [754.0, 0.0], [755.0, 7.0], [756.0, 2.0], [757.0, 1.0], [758.0, 1.0], [759.0, 3.0], [760.0, 4.0], [761.0, 9.0], [762.0, 9.0], [763.0, 9.0], [764.0, 9.0], [765.0, 9.0], [766.0, 9.0], [767.0, 8.0], [768.0, 3.0], [769.0, 7.0], [770.0, 2.0], [771.0, 9.0], [772.0, 7.0], [773.0, 8.0], [774.0, 0.0], [775.0, 4.0], [776.0, 9.0], [777.0, 9.0], [778.0, 5.0], [779.0, 1.0], [780.0, 0.0], [781.0, 5.0], [782.0, 9.0], [783.0, 7.0], [784.0, 3.0], [785.0, 1.0], [786.0, 7.0], [787.0, 3.0], [788.0, 2.0], [789.0, 8.0], [790.0, 1.0], [791.0, 6.0], [792.0, 0.0], [793.0, 9.0], [794.0, 6.0], [795.0, 3.0], [796.0, 1.0], [797.0, 8.0], [798.0, 5.0], [799.0, 9.0], [800.0, 5.0], [801.0, 0.0], [802.0, 2.0], [803.0, 4.0], [804.0, 4.0], [805.0, 5.0], [806.0, 9.0], [807.0, 4.0], [808.0, 5.0], [809.0, 5.0], [810.0, 3.0], [811.0, 4.0], [812.0, 6.0], [813.0, 9.0], [814.0, 0.0], [815.0, 8.0], [816.0, 3.0], [817.0, 0.0], [818.0, 2.0], [819.0, 6.0], [820.0, 4.0], [821.0, 2.0], [822.0, 5.0], [823.0, 2.0], [824.0, 2.0], [825.0, 3.0], [826.0, 0.0], [827.0, 8.0], [828.0, 2.0], [829.0, 5.0], [830.0, 3.0], [831.0, 3.0], [832.0, 4.0], [833.0, 4.0], [834.0, 6.0], [835.0, 8.0], [836.0, 5.0], [837.0, 0.0], [838.0, 3.0], [839.0, 5.0], [840.0, 2.0], [841.0, 6.0], [842.0, 1.0], [843.0, 9.0], [844.0, 3.0], [845.0, 1.0], [846.0, 1.0], [847.0, 8.0], [848.0, 8.0], [849.0, 1.0], [850.0, 7.0], [851.0, 1.0], [852.0, 0.0], [853.0, 1.0], [854.0, 0.0], [855.0, 0.0], [856.0, 0.0], [857.0, 3.0], [858.0, 1.0], [859.0, 3.0], [860.0, 7.0], [861.0, 8.0], [862.0, 3.0], [863.0, 8.0], [864.0, 7.0], [865.0, 5.0], [866.0, 2.0], [867.0, 8.0], [868.0, 8.0], [869.0, 6.0], [870.0, 5.0], [871.0, 8.0], [872.0, 7.0], [873.0, 5.0], [874.0, 3.0], [875.0, 3.0], [876.0, 2.0], [877.0, 0.0], [878.0, 8.0], [879.0, 3.0], [880.0, 8.0], [881.0, 1.0], [882.0, 4.0], [883.0, 2.0], [884.0, 0.0], [885.0, 6.0], [886.0, 1.0], [887.0, 7.0], [888.0, 1.0], [889.0, 7.0], [890.0, 7.0], [891.0, 6.0], [892.0, 6.0], [893.0, 9.0], [894.0, 1.0], [895.0, 4.0], [896.0, 7.0], [897.0, 3.0], [898.0, 0.0], [899.0, 3.0], [900.0, 5.0], [901.0, 9.0], [902.0, 8.0], [903.0, 2.0], [904.0, 5.0], [905.0, 3.0], [906.0, 4.0], [907.0, 9.0], [908.0, 0.0], [909.0, 4.0], [910.0, 2.0], [911.0, 8.0], [912.0, 7.0], [913.0, 5.0], [914.0, 5.0], [915.0, 4.0], [916.0, 6.0], [917.0, 8.0], [918.0, 7.0], [919.0, 3.0], [920.0, 1.0], [921.0, 1.0], [922.0, 5.0], [923.0, 9.0], [924.0, 5.0], [925.0, 6.0], [926.0, 2.0], [927.0, 8.0], [928.0, 6.0], [929.0, 3.0], [930.0, 8.0], [931.0, 8.0], [932.0, 2.0], [933.0, 3.0], [934.0, 5.0], [935.0, 3.0], [936.0, 7.0], [937.0, 8.0], [938.0, 7.0], [939.0, 5.0], [940.0, 9.0], [941.0, 3.0], [942.0, 7.0], [943.0, 5.0], [944.0, 1.0], [945.0, 9.0], [946.0, 5.0], [947.0, 7.0], [948.0, 7.0], [949.0, 8.0], [950.0, 1.0], [951.0, 8.0], [952.0, 5.0], [953.0, 7.0], [954.0, 7.0], [955.0, 8.0], [956.0, 0.0], [957.0, 5.0], [958.0, 3.0], [959.0, 2.0], [960.0, 1.0], [961.0, 7.0], [962.0, 1.0], [963.0, 2.0], [964.0, 2.0], [965.0, 6.0], [966.0, 8.0], [967.0, 0.0], [968.0, 6.0], [969.0, 6.0], [970.0, 1.0], [971.0, 3.0], [972.0, 0.0], [973.0, 0.0], [974.0, 1.0], [975.0, 9.0], [976.0, 2.0], [977.0, 7.0], [978.0, 8.0], [979.0, 7.0], [980.0, 6.0], [981.0, 6.0], [982.0, 1.0], [983.0, 1.0], [984.0, 1.0], [985.0, 9.0], [986.0, 5.0], [987.0, 9.0], [988.0, 0.0], [989.0, 9.0], [990.0, 2.0], [991.0, 1.0], [992.0, 6.0], [993.0, 4.0], [994.0, 2.0], [995.0, 0.0], [996.0, 1.0], [997.0, 9.0], [998.0, 8.0]];\n",
" this.ax = ax1;\n",
"\n",
" this.translate = function(d)\n",
" { return \"translate(\" + this.ax.x(d[0]) + \",\"\n",
" + this.ax.y(d[1]) + \")\"; };\n",
"\n",
" this.draw = function(){\n",
"\n",
" this.line = d3.svg.line()\n",
" .x(function(d) {return this.ax.x(d[0]);})\n",
" .y(function(d) {return this.ax.y(d[1]);})\n",
" .interpolate(\"linear\")\n",
" .defined(function (d) {return !isNaN(d[0]) && !isNaN(d[1]); });\n",
"\n",
" this.lineobj = this.ax.axes.append(\"svg:path\")\n",
" .attr(\"d\", this.line(this.data))\n",
" .attr('class', 'line3');\n",
"\n",
"\n",
" this.pointsobj = this.ax.axes.append(\"svg:g\")\n",
" .selectAll(\"scatter-dots-3\")\n",
" .data(this.data.filter(\n",
" function(d){return !isNaN(d[0]) && !isNaN(d[1]); }))\n",
" .enter().append(\"svg:path\")\n",
" .attr('class', 'points3')\n",
" .attr(\"d\", d3.svg.symbol()\n",
" .type(\"circle\")\n",
" .size(9))\n",
" .attr(\"transform\", this.translate.bind(this));\n",
"\n",
" };\n",
"\n",
" this.zoomed = function(){\n",
"\n",
"\n",
" this.lineobj.attr(\"d\", this.line(this.data));\n",
"\n",
"\n",
" this.pointsobj.attr(\"transform\", this.translate.bind(this));\n",
"\n",
"\n",
" }\n",
"};\n",
"\n",
"ax1.add_element(line531645844ac04808a2fd1db26f4c6d5b);\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" fig.draw();\n",
"\n",
"\n",
" fig.root.append(\"div\")\n",
" .append(\"button\")\n",
" .text(\"Reset\")\n",
" .on(\"click\", fig.reset.bind(fig));\n",
"\n",
" var _ = function() {\n",
" var a = ax1;\n",
"\n",
" var zoom_x = a.zoom,\n",
" zoom_y = d3.behavior.zoom()\n",
" .y(a.ydom),\n",
" position_y0 = null,\n",
" translate_y0 = null;\n",
"\n",
" // remove y scale from default controller\n",
" a.zoom\n",
" .y(d3.scale.linear())\n",
"\n",
" // add pan-without-zoom behavior for y-axis \n",
" a.baseaxes\n",
" .on(\"mousedown.zoom_y\", function() {\n",
" translate_y0 = zoom_y.translate()[1];\n",
" position_y0 = d3.event.pageY;\n",
" })\n",
" .on(\"mousemove.zoom_y\", function() {\n",
" if (position_y0 != null) {\n",
" zoom_y.translate([0, translate_y0 + d3.event.pageY - position_y0]);\n",
" }\n",
" })\n",
" .on(\"mouseup.zoom_y\", function() {\n",
" position_y0 = null;\n",
" });\n",
"\n",
"\n",
" var x_min_scale = (a.xdom.invert(a.width) - a.xdom.invert(0)) / (1001.0 - -1.0),\n",
" y_min_scale = (a.ydom.invert(0) - a.ydom.invert(a.height)) / (10.0 - -1.0);\n",
"\n",
" a.zoom\n",
" .on(\"zoom\", function() { // replace zoom event with one that bounds pan\n",
"\n",
" // enforce zoom limits\n",
" var screen_x_lower = a.xdom(-1.0),\n",
" screen_x_upper = a.xdom(1001.0),\n",
" screen_y_lower = a.ydom(-1.0),\n",
" screen_y_upper = a.ydom(10.0);\n",
"\n",
" if((screen_x_lower >= 0) && (screen_x_upper < a.width)) {\n",
" zoom_x.scale(x_min_scale);\n",
" }\n",
" if((screen_y_upper >= 0) && (screen_y_lower < a.height)) {\n",
" zoom_y.scale(y_min_scale);\n",
" }\n",
"\n",
" // enforce pan limits\n",
" screen_x_lower = a.xdom(-1.0);\n",
" screen_x_upper = a.xdom(1001.0);\n",
" screen_y_lower = a.ydom(-1.0);\n",
" screen_y_upper = a.ydom(10.0);\n",
" var tx = zoom_x.translate()[0],\n",
" ty = zoom_y.translate()[1];\n",
"\n",
" if(screen_x_lower > 0) {\n",
" tx = tx - screen_x_lower;\n",
" }\n",
" else if(screen_x_upper < a.width) {\n",
" tx = tx + a.width - screen_x_upper;\n",
" }\n",
"\n",
" if(screen_y_upper > 0) {\n",
" ty = ty - screen_y_upper;\n",
" }\n",
" else if(screen_y_lower < a.height) {\n",
" ty = ty + a.height - screen_y_lower;\n",
" }\n",
"\n",
" zoom_x.translate([tx, ty]);\n",
" zoom_y.translate([tx,ty]);\n",
"\n",
" // redraw\n",
" a.zoomed.bind(a)();\n",
" });\n",
"\n",
" // change a.finalize_reset to reset zoom_x and zoom_y\n",
" a.finalize_reset = function() {\n",
" zoom_x.scale(1).translate([0,0]);\n",
" zoom_y.scale(1).translate([0,0]);\n",
" }\n",
" }() // function-level scope\n",
"\n",
" return fig\n",
" }\n",
"\n",
" // set a timeout of 0: this makes things work in the IPython notebook\n",
" setTimeout(function(){\n",
" // we need to call the function, making sure d3 is defined appropriately\n",
" if(typeof define === \"function\" && define.amd){\n",
" // If require.js is available, use it to load d3\n",
" require.config({paths: {d3: \"//cdnjs.cloudflare.com/ajax/libs/d3/3.4.1/d3.min\"}});\n",
" require([\"d3\"], create_figf7b40d4447994adf80ed318612535705);\n",
" }else if(typeof d3 === \"undefined\"){\n",
" // No require.js: dynamically load d3\n",
" var s = document.createElement('script');\n",
" s.src = \"//cdnjs.cloudflare.com/ajax/libs/d3/3.4.1/d3.min.js\";\n",
" s.async = true;\n",
" s.onreadystatechange = s.onload = s.onerror = function() {\n",
" if(typeof d3 === \"undefined\"){\n",
" document.getElementById(\"figuref7b40d4447994adf80ed318612535705\").innerHTML =\n",
" \"<p style='color:red;'>(d3 failed to load)</p>\";\n",
" }else{\n",
" create_figf7b40d4447994adf80ed318612535705(d3);\n",
" }\n",
" };\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
" }else{\n",
" // d3 is already globally loaded\n",
" create_figf7b40d4447994adf80ed318612535705(d3);\n",
" }\n",
" }, 0);\n",
"\n",
" </script>\n",
"\n",
"\n",
"\n"
],
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x37190d0>"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment