Skip to content

Instantly share code, notes, and snippets.

@aflaxman
Created January 28, 2014 15:42
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/8669954 to your computer and use it in GitHub Desktop.
Save aflaxman/8669954 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": [
"Tue Jan 28 07:39:35 PST 2014\r\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Demonstrate the new HTML tooltips in mpld3"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt, pandas as pd, numpy as np\n",
"\n",
"import mpld3, mpld3.plugins\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": [
"# define style\n",
"\n",
"css = \"\"\"\n",
"table\n",
"{\n",
"border-collapse: collapse;\n",
"}\n",
"th\n",
"{\n",
"color: #ffffff;\n",
"background-color: #000000;\n",
"}\n",
"td\n",
"{\n",
"background-color: #cccccc;\n",
"}\n",
"table, th, td\n",
"{\n",
"font-family:Arial, Helvetica, sans-serif;\n",
"border: 1px solid black;\n",
"text-align: right;\n",
"}\n",
"\"\"\""
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# generate data\n",
"\n",
"N = 50\n",
"df = pd.DataFrame(index=range(N))\n",
"df['x'] = np.random.randn(N)\n",
"df['y'] = np.random.randn(N)\n",
"df['z'] = np.random.randn(N)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# create label html\n",
"\n",
"labels = []\n",
"for i in range(N):\n",
" label = df.ix[[i], :].T\n",
" label.columns = ['Row {0}'.format(i)]\n",
" labels.append(str(np.round(label, 3).to_html())) # .to_html() is unicode, so make leading 'u' go away with str()\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fig, ax = plt.subplots()\n",
"points = ax.plot(df.x, df.y, 'o', color='k', mec='w', ms=15, mew=1, alpha=.9)\n",
"\n",
"tooltip = mpld3.plugins.PointHTMLTooltip(points[0], labels, voffset=10, hoffset=10, css=css)\n",
"mpld3.plugins.connect(fig, tooltip)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" <style>\n",
"\n",
"\n",
" div#figureec6796314118412bb7f92d286eada4f1\n",
" .axesbg{\n",
" fill: #FFFFFF;\n",
" }\n",
"\n",
"\n",
"\n",
"div#figureec6796314118412bb7f92d286eada4f1\n",
".axis line, .axis path {\n",
" shape-rendering: crispEdges;\n",
" stroke: black;\n",
" fill: none;\n",
"}\n",
"\n",
"div#figureec6796314118412bb7f92d286eada4f1\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#figureec6796314118412bb7f92d286eada4f1\n",
".axis line, .axis path {\n",
" shape-rendering: crispEdges;\n",
" stroke: black;\n",
" fill: none;\n",
"}\n",
"\n",
"div#figureec6796314118412bb7f92d286eada4f1\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#figureec6796314118412bb7f92d286eada4f1\n",
".axes1\n",
"path.line3 {\n",
" stroke: #000000;\n",
" stroke-width: 1.0;\n",
" stroke-dasharray: none;\n",
" fill: none;\n",
" stroke-opacity: 0.9;\n",
"}\n",
"\n",
"div#figureec6796314118412bb7f92d286eada4f1\n",
".axes1\n",
"path.points3 {\n",
" stroke-width: 1;\n",
" stroke: #FFFFFF;\n",
" fill: #000000;\n",
" fill-opacity: 0.9;\n",
" stroke-opacity: 0.9;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figureec6796314118412bb7f92d286eada4f1\n",
"text.textbbd31b55cc8f4810ac3601760d51269e {\n",
" font-size : 10.0px;\n",
" fill : #000000;\n",
" opacity : 1;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figureec6796314118412bb7f92d286eada4f1\n",
"text.text51304b01b72f4b2c96ff4057005b7ad8 {\n",
" font-size : 10.0px;\n",
" fill : #000000;\n",
" opacity : 1;\n",
"}\n",
"\n",
"\n",
"\n",
"div#figureec6796314118412bb7f92d286eada4f1\n",
"text.text6bbb9adf1b7f43198611c85438019d79 {\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='figureec6796314118412bb7f92d286eada4f1'>\n",
" </div>\n",
" <script type=\"text/javascript\">\n",
" var create_figec6796314118412bb7f92d286eada4f1 = 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",
"\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#figureec6796314118412bb7f92d286eada4f1\",\n",
" figwidth, figheight);\n",
"\n",
"\n",
"\n",
" var ax1 = new Axes(fig, [0.125, 0.125, 0.77500000000000002, 0.77500000000000002], [-2.5, 2.0], [-2.0, 2.5],\n",
" \"linear\", \"linear\",\n",
" [-2.5, 2.0], [-2.0, 2.5],\n",
" false, false,\n",
" \"axes1\",\n",
" \"clipec6796314118412bb7f92d286eada4f11\", true);\n",
"\n",
"\n",
"\n",
"// Add an Axis element\n",
"ax1.add_element(new Axis(ax1, \"bottom\",\n",
" 10, null,\n",
" null));\n",
"\n",
"\n",
"\n",
"// Add an Axis element\n",
"ax1.add_element(new Axis(ax1, \"left\",\n",
" 10, null,\n",
" null));\n",
"\n",
"\n",
"\n",
"// Add a Line2D element\n",
"var linee0ad654237a547a2b1dad6f17ed766e5 = new function(){\n",
" this.data = [[1.6174780155740383, -0.75145996476354], [1.0083058375715195, -1.7329084309409764], [0.022727125031096664, 0.8014051185879124], [1.0132549853256096, 1.3606994534987564], [0.2589556718459063, 0.0032442832119691004], [1.5865399802959228, -1.312704458681948], [1.6309157285156697, -0.4509348249693047], [0.6265609946993833, 0.02381050103485809], [0.010199180325225859, 1.1494313944310546], [-1.1452795231665727, -0.8019520858345837], [0.39884273286508803, -0.4137144568435035], [0.15454404096464502, 0.22995736214537657], [-0.2453256706604159, 1.1492065298427647], [-0.08006205534384515, -0.5356559032825614], [-0.13163546276227522, 0.8965565371700773], [0.9903057788640666, -0.5101421001722986], [-0.11104996952544623, 1.4419387140108901], [1.2244974030353621, -0.8954761703486438], [-0.38740714998294534, 1.9552021251413465], [0.16164945655900634, 0.21494362605489273], [-0.8651033855647448, -0.4559612155149184], [0.5286636611055386, -1.5459877263711799], [-1.3437868289864514, -1.4487872370225794], [-1.4695512122979546, 1.437871468180753], [0.10966879987351318, 0.27360129333608374], [-0.24667644159927132, 0.8436426131902695], [0.0683477070958303, -1.1041771164313872], [-0.004187567258183807, 0.4938562777266469], [0.8243898804494791, -0.5689705960484734], [0.9629636595735408, 1.2873999258455322], [-2.009951565188865, -0.24823467368819077], [-0.9405764890655715, 1.2852530045129036], [0.05889365439556071, 0.2713752884439942], [1.5020570174822683, 1.0123505421400953], [1.6803478747739198, 2.2151440284687065], [-0.6239958428491427, -1.2214516670225213], [1.74944736475504, 0.18910840773051654], [-0.8591233793406573, 1.1765210727514872], [-0.3617498666084552, -0.7400316689338617], [-0.7665096286322677, -0.3672732914018285], [0.8667784778748014, 1.684520046570325], [0.1291429316351125, 0.8091022054279252], [-1.058056366753102, 0.4037388006135282], [-0.8227169709045573, -0.44497302244943115], [1.3364565868101714, 1.0745180401753833], [0.4363223499624859, 0.4792141879944047], [-0.16082683623788485, -1.3209693185258715], [-0.0031061501989658956, 2.08700768866658], [1.0329133465912734, -0.27534055318399775], [1.0091920440811706, 0.9053867184284892]];\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",
"\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(225))\n",
" .attr(\"transform\", this.translate.bind(this));\n",
"\n",
" };\n",
"\n",
" this.zoomed = function(){\n",
"\n",
"\n",
"\n",
" this.pointsobj.attr(\"transform\", this.translate.bind(this));\n",
"\n",
"\n",
" }\n",
"};\n",
"\n",
"ax1.add_element(linee0ad654237a547a2b1dad6f17ed766e5);\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",
" var tooltip = d3.select(\"body\").append(\"div\")\n",
" .attr(\"class\", \"mpld3-tooltip\")\n",
" .style(\"position\", \"absolute\")\n",
" .style(\"z-index\", \"10\")\n",
" .style(\"visibility\", \"hidden\");\n",
"\n",
" var labels = ['<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 0</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.617</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.751</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.623</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 1</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.008</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-1.733</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.070</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 2</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.023</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.801</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 1.461</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 3</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.013</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.361</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.429</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 4</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.259</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.003</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.061</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 5</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.587</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-1.313</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.219</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 6</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.631</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.451</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.468</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 7</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.627</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.024</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.338</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 8</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.010</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.149</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.556</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 9</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-1.145</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.802</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.221</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 10</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.399</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.414</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 3.609</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 11</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.155</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.230</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-1.258</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 12</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.245</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.149</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.182</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 13</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.080</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.536</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.284</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 14</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.132</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.897</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.614</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 15</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.990</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.510</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-1.141</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 16</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.111</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.442</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.682</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 17</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.224</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.895</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.266</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 18</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.387</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.955</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.662</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 19</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.162</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.215</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-1.696</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 20</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.865</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.456</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.117</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 21</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.529</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-1.546</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.530</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 22</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-1.344</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-1.449</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-1.091</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 23</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-1.470</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.438</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.756</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 24</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.110</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.274</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-1.102</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 25</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.247</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.844</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 1.645</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 26</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.068</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-1.104</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 2.353</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 27</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.004</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.494</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.682</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 28</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.824</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.569</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-1.575</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 29</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.963</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.287</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.347</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 30</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-2.010</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.248</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.453</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 31</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.941</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.285</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-1.408</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 32</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.059</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.271</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 1.431</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 33</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.502</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.012</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.229</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 34</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.680</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 2.215</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.211</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 35</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.624</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-1.221</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.509</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 36</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.749</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.189</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 1.387</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 37</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.859</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.177</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 2.339</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 38</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.362</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.740</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.723</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 39</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.767</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.367</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.550</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 40</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.867</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.685</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.841</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 41</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.129</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.809</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.384</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 42</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-1.058</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.404</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.810</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 43</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.823</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.445</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.884</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 44</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.336</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 1.075</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-1.147</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 45</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 0.436</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.479</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 1.524</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 46</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.161</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-1.321</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-0.877</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 47</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td>-0.003</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 2.087</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.759</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 48</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.033</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td>-0.275</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td> 0.859</td>\\n </tr>\\n </tbody>\\n</table>', '<table border=\"1\" class=\"dataframe\">\\n <thead>\\n <tr style=\"text-align: right;\">\\n <th></th>\\n <th>Row 49</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <th>x</th>\\n <td> 1.009</td>\\n </tr>\\n <tr>\\n <th>y</th>\\n <td> 0.905</td>\\n </tr>\\n <tr>\\n <th>z</th>\\n <td>-1.028</td>\\n </tr>\\n </tbody>\\n</table>'];\n",
"\n",
"\n",
" ax1.axes.selectAll(\".points3\")\n",
" .on(\"mouseover\", function(d, i){\n",
" tooltip\n",
" .html(labels[i])\n",
" .style(\"visibility\", \"visible\");})\n",
" .on(\"mousemove\", function(d, i){\n",
" tooltip\n",
" .style(\"top\", (event.pageY+10)+\"px\")\n",
" .style(\"left\",(event.pageX+10)+\"px\");})\n",
" .on(\"mouseout\", function(d, i){\n",
" tooltip\n",
" .style(\"visibility\", \"hidden\");});\n",
"\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_figec6796314118412bb7f92d286eada4f1);\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(\"figureec6796314118412bb7f92d286eada4f1\").innerHTML =\n",
" \"<p style='color:red;'>(d3 failed to load)</p>\";\n",
" }else{\n",
" create_figec6796314118412bb7f92d286eada4f1(d3);\n",
" }\n",
" };\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
" }else{\n",
" // d3 is already globally loaded\n",
" create_figec6796314118412bb7f92d286eada4f1(d3);\n",
" }\n",
" }, 0);\n",
"\n",
" </script>\n",
"\n",
" <style>\n",
"\n",
"table\n",
"{\n",
"border-collapse: collapse;\n",
"}\n",
"th\n",
"{\n",
"color: #ffffff;\n",
"background-color: #000000;\n",
"}\n",
"td\n",
"{\n",
"background-color: #cccccc;\n",
"}\n",
"table, th, td\n",
"{\n",
"font-family:Arial, Helvetica, sans-serif;\n",
"border: 1px solid black;\n",
"text-align: right;\n",
"}\n",
"\n",
" </style>\n",
"\n",
"\n",
"\n"
],
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEACAYAAAC08h1NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X900+d96PG3JBwbBxv/wI7iH4zc9tAQTFpK0i40pWoT\nDHWKT9sx9ZCbm3TrLVl7miW33DoFssa93kp6OMlW6Jp1q5sR1nCark0wHQ4YEo1t4famDiU4pdm9\nWeOBXDA4DsIEg7B9//hKQpb1+/vr+Uqf1zk+SPJX0mNJfPR8n+fzfB4QQgghhBBCCCGEEEIIIYQQ\nQgghhBBCCCGEEA7WDBwCjgFvAB1JjvEB54AjkZ9HrGqcEEII410HtEQuzwH+HXh/wjE+oMfCNgkh\nhEjDrfP+p4GByOUx4DWgIclxLp3PI4QQQkELgEGgIuH2jwFn0YaDDjLzjEAIIYQDzQFeAT6d4ndl\nkcutwG+tapQQQoiZjBiCKQF+DrwA/GUWx7+BdhZwKv7G97znPVNvvvmmAc0RQoii8ibw3lzuoHeM\n3wV0A78mddCfF3d5GXAtMJx40JtvvsnU1JRSP48++qjtbZA2FVa7pE3SJqN/gPfkGrhn5XqHBB8B\n7kGb1D0SuW0TMD9y+fvAOmB95Ppl4G5gUufzCiGEyJPewP+vZD5r2B75EUIIoQC9Qz0Fzefz2d2E\nGaRN2VOxXdKm7EibzKVSfv1UZLxKCCFEllwuF+QYy6XHL4QQRUbvGL8QQogEoVCIiYkJSkpKYreF\nw2E8Hg+VlZU2tkwjgV8IIQwSDocZGhpiy5Yt9Pf3EwwGY79rbGxk2bJlbNy4kYaGhmlfClaTMX4h\nhDBAOBxmZGSENWvWTAv4iRobG9mzZw+1tbWGBH8Z4xdCCJsMDQ1lDPoAwWCQtrY2BgYGGB8ft6h1\n00ngF0IInUKhEFu2bMkY9KNOnTrFunXrGB6eUcTAEhL4hRBCp4mJCfr7+3O6TygU4oknnuD8+fMm\ntSo1mdwVwkSqZ3cIY5SUlGTd24936NAhrly5YkKL0pPAL4QJnJLdIew1PDzMrFnWh2EJ/EIYLJrd\nsXbt2qS9wGAwSDAYpL+/39DsDuE89fX1tvT4ZYxfCIM5KbtDGCMcDtPY2Jjz/VasWGFLj18CvxAG\nclp2hzCGx+Nh2bJlOd2nsrKSDRs2UFGRuFut+STwC2Egp2V3CGNUVlaycePGrHv9Xq+XXbt2UVdX\nZ3LLkpPAL4SBnJbdIYzT0NDAnj178Hq9aY/zer3s3buXlpYWysrK0h5rFr2Bvxk4BBxD20u3I8Vx\n24DXgVeBpTqfU4i8hUIhRkdHGRsbi/2Mjo4SCoVsbZdd2R3COCUlJdTW1tLd3Z0yVbeyspLu7m7b\nJ/T1ftIuA18GBoA5aIF9H3A07pg/QNuKcTFa0H8K+IDO5xUiJ6qnV9qV3SGMVVJSwqJFi+jr6+Px\nxx/n0KFDDA8PU19fz4oVK9iwYQN1dXW2Z3HpDfynIz8AY2h77zYwPfC3ATsjl49EnrMJOKnzuYXI\nipXpldHsjlyHe+zK7hDGKysro7m5ma6uLq5cucKsWbNi/9oxkZuMkWP8C4Bb0fbhjdcEnIi7fjJy\nmxCWsDK90mnZHcI8FRUVVFdXT/tXFUZ1MeYAPwEeBJKlJiSWDE1af7mzszN22efzFdQel8Ie+aZX\n7t+/n/nz5+f8fNHsjsThpFS8Xi/d3d22ZXcI5wkEAgQCAV2PYUQ9/hLg58ALwF8m+X030Av8Y+T6\nALAKSPxfIfX4heFGR0dpbW3NeejF7/fT1dWVVy8tOrTU1tbGqVOnUh4Xze6we6JPOJsd9fhdaIH9\n1yQP+gB7gf8aufxBYIKZQV8IU9iRXumk7A5RnPQG/o8A9wAfR5u4PQJ8Erg/8gPwU7RA/zrwA+CP\ndD6nEKbTm14Zn93h9/vxer243W68Xi9+v5++vj4WLVokQV/YQrZeFAVtbGyMhQsX5nw/r9fLwYMH\nqa6u1t2G8+fPK5vdIZwvn6EeyR8TBU2F9EoJ8kI1UrJBFDRJrxRiJgn8oqA5rXiWEFaQMX5R8CS9\nUhSyfMb4JfCLohAOhxkYGGDdunVJC7JVVlaya9cuWlpaJOgbTPYdNpcEfiHSGB8f58yZM2mLZ9lV\nJrcQqV4Yr1BI4BciC5Jeab7o8FqmGkmNjY2y77BOEviFEEoYHBxMWQ01UbRe0aJFi+SMKw92lGwQ\nQohpZN9h9UngF0IYSvYdVp8EfiGEoWTfYfVJ4BdCKEH2HbaOBH4hhBJk32HrSOAXQhgqWhgvV7Lv\nsHUk8AshDCWF8dQngV8IYSgpjKc+IxZw/RC4CxgGliT5vQ/YDfxH5PpPgT9Pcpws4MpAap6oR96T\n5KQwnnXsWrn7UWAMeJrUgf+rQHuGx5HAn4LUPFGPvCeZSWE8a9hZsmEBsIfUgX8DsCbDY0jgT0Jq\nnqhH3pPsSWE886ka+D+GNrzzO7ThoK8CR5McJ4E/Cal5oh55T3InhfHMo+qeu/1AEzAOtALPAzck\nO7CzszN22efz4fP5zG+dwvKtebJ//37mz59vcuuKk7wn+ck2yMucSWaBQIBAIKDrMazo8Sd6A+0s\nIHHGR3r8CUZHR2ltbc15+bvf76erq0t6VCaQ98QcMmeSP1V7/POAs5HLy4Br0YZ8RAZS80Q98p4Y\nLzpnkmr4LBgMEgwG6e/vL/o5E6MYkce/C3gZeB9wAvhj4P7ID8A64Fjk52+Bu4FJA55XpCA1T9Qj\n70lqQ0NDGSfKQfsCaGtrY2BggPHxcYtaV5iM+CSuy/D77ZEfYRG7ap7I+GxqUocmubNnzxIOh+np\n6Zl225EjR9i9ezeHDx+edrzMmRhDVu4qzCk1T8LhMIODg3R0dNDa2srChQtjP62trXR0dDA4OEg4\nHLasTWZxynuiuuhnZvPmzaxatYqmpqbYz5o1a+jt7WXz5s34/f4Z95Xa/frJJ1Fh0ZonuYwpW13z\npNjGZ53wnqgu/jNz8uTJGTtvnThxghMnTnD48GH27t3L7Nmz2bFjx7RjZM5EH+nxK8wJNU+KbXzW\nCe+J6rL9zJw4cYJVq1Zxxx138MADD0z7ncyZ6COBX3ENDQ3s2bMHr9eb9rhozZOWlhbLFgoV696q\nKr8nqsv1MzM0NITf72f16tUsWXI1W1zmTPSRwK+4kpISamtr6e7uTjlBWllZSXd3t+XDKNnsrbp8\n+XIee+wx9u3bR39/Py+99BLl5eWMjIwkrd/iBCq/J6pL9pnxeDxp73Pu3Dm2bdvG3XffHbtN5kz0\nkcDvACUlJSxatIi+vj78fj9erxe3243X68Xv99PX18eiRYssDzCZctr9fj+bNm2it7eXNWvWxCbv\nrr/+elatWuXoSV9V3xPVJfvMZPMaHThwgFtuuQWQORMjGLVy1wiycjcLKtU8GRsbY+HChUl/5/f7\nWb9+PW1tbZw4cWLG7+vr63G5XMoWMsslNTXTeyJprlcl+8xMTEwwOjrKxMREyvu53W7eeust1qxZ\nI7WPEqi6clcYyAm9nOXLl3PvvfemDPpu99UTzeikryr/mfMpHZDqPZEyBNnxeDzU1NQwMjLC5GTy\ntZ1er5dQKCS1+w0igV/kLZrTnnjq3t7eztatW5MGfYDS0tJp11VZlGNkamqxpblmK9Vnxu12U1VV\nxejoKMnO/FeuXEl5eXnRvE5mkzF+kbdUe6suXbp0xorLKJfLxbXXXhs9PY1RYVGOkampxZbmmq10\n+/HOmjWL2tpaZs+eHTsrjM6bPProo3i9Xt1BPxQKMTo6ytjYWOxndHTUsYkG+ZIxfqFLstr0/f39\nNDU1zTg22qubNWvWjMAP2un8wYMHqa6uNrXNyYRCITo6OqaVDsiksrIy6VmKkY9ViDLtZxAfB6L7\nGdx00026hgELedgtnzF+6fELXbLNaXe73bHT9GRBH+xdlJNNamqiVGcpRj5WIcr0mXG5XLhcLq6/\n/np6e3tZsmSJ7qAfHXbr6emZ8YUTDAbp6elh7dq1jIyMODLLLFcS+IUu2eS0u1wuqqqqpk3qJmPn\nohwjyy1L6eb0rF4HoWfYrVCHhiTwC90Sc9pHR0dpbm7G7XYze/Zsamtrs+rJO3FRjpFnKcVUhsCq\ndRB6Vpf/7ne/K9jCgzLGLwx1/vx5Ll26xObNm2Nj3KmGduJVVlbS19dHc3Oz2U1MKt2ahHSSzUsY\n+VjFwMy1KfnumLZ27Vpuv/12HnrooZTHqLIGRcb4he0qKiqYN28emzZtoqmpKaugr0IhMyPLLUvp\n5txUVFRQXV097V+j5DPsNjExQU9PD4sXL057nJMzsowI/D8ETqPtsJXKNuB14FVgqQHPKRTntEJm\n6dIMU0lVOsDIxxLWmpqaYmxsjGAwSFVVVcbjnVp40IjA/xSwOs3v/wCYDywGvhA5XhQ4pxUyM7Lc\nspRudrZwOIzX6+Wdd97J6ngnZmQZEfj/BRhN8/s2YGfk8hG01cIzk7xFwXFaIbNczlIOHDjADTfc\nwMWLF5NmfETHf51yxqMKo7No8hl2m5iY4M477+SXv/xl1vdxWkaWFQOKTWibsEedjNx20oLnFjYr\nKyujubmZrq4uZYrLpRJ/lrJu3bqkwaayspKf/OQnnD9/PuNioPr6+oyPpcoZj93MWmCVz45pc+fO\n5cEHH+Thhx/O+j5Oy8iyqqWJM3xJ03c6Oztjl30+Hz6fz7wWCUupFuRTiT9Lefzxxzl06BDDw8PU\n19ezYsUKNm7cyOTkJO3t7VnV4Hnf+96X8rE2bNhAXV2dBH0T6xpFh90Sv0xS8Xq9bN26ld7eXo4d\nSzdtOZ2Va1ACgQCBQEDXYxiVzrkA2AMsSfK7bqAX+MfI9QFgFZD4Lkg6p1BGKBQiHA5zzTXXxG4L\nh8NcunSJzs5O9uzZk/ExouUGFi1aRDgcVv6Mxy6ZSjjEi39Nsx0ai36xtLW1cerUqbSP/fOf/5yn\nn36abdu2Zd1+0MqQd3V12fKeqlqWeS9wD1rg/yAwwcygL4QS0g05NDQ0cNNNN/HQQw8xe/Zsnn32\n2bSPlUvV0WKt2Z/vAqtc6hplO4TX3d1NRUUFb731Vi5/giMzsozo8e8CPgbMQ0vrfBSIfnq/H/n3\nu8DHgUvAf0dL60wkPX5hq2jPMNXy/qmpKUZGRmhoaGDv3r3s3LmTHTt2ZHxcv9/Pn/3Zn+F2u5MG\n9tHR0YIsHpaNfBdY5dPDHh8f58yZM2mH3crKykw/AzFaPj1+WbkrREQ2VSOj+doNDQ089dRTvPLK\nK2zfvj3t49bV1fHcc8/xuc99btpjr1+/nnvuuQe/3592CEKVFaJmsGOVc6aVwrkMDamwMYys3BUi\nT7kOOQwNDeH3+1m9ejVLliSb2tJMTk7yxhtvUFpaOu2xly9fTnt7O3feeScDAwMpd54CZ68QNYue\nLJpMK4WdtgYlHxL4hSC/Usrnzp1j27Zt3H333Skf8+2336aurm7GYqD4XcomJiZi5YBTnfU6dYWo\nWczOonHaGpRcSeAXguxrung8nmnXDxw4wC233DLjuOjS/1SLgRJ3KZucnGR0dDRtz9+JK0QzUbmu\nUfwalIMHD3L8+HEOHjxIV1cXzc3Njl5wJ4FfiBwk9vBOnTqVsqZLOByOLQZ65plnpv1u3rx5M/Yk\nnpqa4sKFCyl7/eC8FaKZOKGukZlF5OwigV+ILLlcLubMmTOt15+upst1113Hs88+m9NioEuXLqX9\nvdNWiGYidY3sIYFfCLIfcvB4PNTU1MR2E0tV08Xr9bJv3z4OHjyYMesnXrqhHrB3lzKzOK2SayGQ\nwC8EuQ05RDeNr6qqSjqME834SJfnf/bs2aSbzmTanrIQa/YXQxaNaiTwC0HuQw5NTU3s37+fwcFB\nzpw5MyPj44YbbuDAgQMp73/kyBFuu+22GbeXlpambaPTVohmq9CzaFQjC7iEiMhn4c74+HjSxUCh\nUIiOjo7Y9pOJbrvtNjZv3sxnP/vZ2CSvy+WitrZ2RuZQ9DntXiFqFTO3YixEsnJXCJ3C4TADAwNp\na7rs2rWLlpaWjL3PTCuB/X4/69evZ9WqVbHsoFmzZs3YrlKVFaJCTRL4hTBAtjVdMsnmDOK+++5j\n5cqV/Mmf/AljY2Mzfp/LF40oThL4hTCQEUMO2ZxBvPDCC7jdbp544gldXzSiOEngF0JB2Z5ByNi2\nyIcEfiEUE19nP/r5vnz5MlNTU5SXl1NeXm5zC4XTqboRixBFx6w9ZPNRrJu8iNSM6PGvBrYCHmAH\n8O2E338+8vvo5urbgR8meRzp8YuCkGlDlyiz6+yr9OUjzGPHUE8p8BvgdrTdtw4D64EjccfcBywD\n/jTDY0ngFwVBhR2cVPnyEeazYyOWDwOvo+2hewX4MXBXYrtybZQQTpXvHrJG19kfGhrKGPRBNnkp\nVnoDfxMQX1v2ZOS2eFPAZ9G+IHqA39P5nMIGoVCI0dFRxsbGYj+jo6NJUxSLWT4buhhdZ1+VLx+h\nLr2BP5uxmWiwXwzsBn6k8zmFhcLhMIODg3R0dNDa2srChQtjP62trXR0dDA4OEg4HLa7qUrIdkOX\nREbW2Vfhy0eoTW9Wz0kgvsRgM9PPAABG4y53A3+V6sE6Oztjl30+Hz6fT2fzhB7RceJU49XBYJBg\nMEh/f7+ME+tkZJ19Fb58hHkCgQCBQEDXY+gdey9Dm9z9CDAMvAzcD7wad0wdcCZyeQ3wTeCDSR5L\nJncVo8IkpdOMjY2xcOHCnO/n9Xo5ePAg1dXVtrXB7XZz/PhxWTTmMHZM7o4DXwL2AUeBn6EF/W+i\nBXmADcBraGP8DwP/TedzCgvIOHF+VN5DNpNC3ORFJGdEPf5eoAW4CdgSue1RYE/k8teBm9HG+G9H\n+wIQipNx4vyosIesk798hDXkXRZJyThxfqIbuiQumIpavnw57e3tLF26lHnz5uFyuZg9ezZXrlxh\nZGSE8vJyJiYmdK2sjX755PL+FfImL2Im2YFLGKrQNgPPR6o9ZP1+P5s2baK3t5c1a9Ywf/58PvCB\nD7BgwQI+9KEP8ZWvfIXjx4/zyCOP6MqYkg3MRSYqLaySyV2FqDBJ6WSJ5Zijm660tbVx4sQJXC4X\n1dXVXLp0iQsXLsTu19zczN69e9m5cyd///d/T2NjIz09PVRUVOTUG89nNzHJyHImOyZ3RYGScWJ9\n4veQ3bRpE5///Odpa2sjGAwye/ZsamtruXz58rSgD/Cf//mftLa2cscdd/DAAw9w8uRJ2traeOON\nNzhz5kzWw2iygblIRwK/SEqFSUqnKysro7m5mXXr1vHkk09y6dIl5s2bx5w5c7h48eKMHbempqZw\nuVwEg0HWrl3LqlWraGxs5OjRo6xatYrTp09z+vRpLl68mNXzywbmalFp9bsM9YiUJI/fGKOjo7S2\ntsZex6mpKUZGRpiYmIgdEw36k5OTsdvuvfdebrvtNr70pS/Frt955518/OMfp6amJqda/rLJi33M\nrpIqG7EIQ8k4sTES50umpqamrXdIFvRBmyTu7e3l/e9//7Trn/rUp3juuedYvHixfMkqzooqqTLG\nLwwl48TWSQz6oC2Kq6mpmXE9GAzS3t7O6dOnrWyiyIOqVVIl8Iu0ZJzYfJEe2wxer5e333476fXh\n4eGiXyynOpVXv0v6hcgoOknZ1dUl48R5iGZIxQcAj8czbYw/mTvvvJOXX3552vXDhw8D2hlCsS+W\nU52e1e9dXV2m/t+SwC+yJkE+P8lW0paUlKQN/HPnzuXBBx/ki1/84rTr999/P6AVVJPFcmpTefW7\nDPUIYbLElbQul4s5c+bg8XiSHt/Q0MCzzz7LT3/6U1599dXY9Z/97Ge8+qpW+La0tFSKqhUoK77Q\nJfALYYHEMg4ej4eamhrcbveM4/bt28fu3bv51re+Fbve09PDli1aDUSXy8W1117Lxz72MVMDhEp5\n58XEii90CfxCWCBZhpTb7aaqqio2uTt37lyeeuopnnzySb73ve/Frv/N3/wNTz75ZOw+1dXVVFVV\n8dWvfhWPx2N4MJZd14yh8up3CfxCWCRZhtQ111zD4sWL+eIXv0ggEODQoUM8//zz3Hvvvbz44osc\nOnRoWtCvqamhpqaGv/7rv+ZHP/oR733vew0NxvG7rvX09MwYow4Gg/T09LB27VpGRkYk+Keh8up3\nWcAlhA0SV9JOTEzg8Xh49913GRkZ4fDhw/zgBz+Ijem7XC6qqqqoqanh+eefZ+fOnezYsWPaY+pZ\nBBQlq7WNZcXradfK3dXAVsAD7AC+nfD7UuBptI1aQsDdwGCSx5HAL4rau+++y/Hjx2lvb2d4eJjJ\nyUncbjelpaWUl5dTWlrKU089xcGDB2cE/Sg9wTgUCtHR0UFPT0/W96msrGT//v3Mnz8/p+cqFlas\nfrdj5W4p8CRa8L8ZWAssTTjmK8DvgCVoXxDbdD6nEAWpvLycxYsXc/jwYb785S9z8803U1dXx4IF\nC2hvb2fPnj288sorKYM+6FsEJLuuGU/V1e96e/wrgA7gU5Hr/xNtA/Y/jzvmYOSYfrQvmtNAPZDY\nvZcevxAR0aEgj8fD0NAQv/jFL3jmmWc4duxYVvf3+/05LwKSPRjMMz4+zpkzZ3j88cc5dOgQw8PD\n1NfXs2LFCjZs2EBdXV3ew2X59Pj1Th03ASfirp8EfGmOmQRG0AK/FBoRIoVowB4bG+MTn/hEzve3\nclWvLCTLTLXV73rfLemiC6EgK4OxLCTLniqr3/V+Mk4CzXHXm5l+BhA9Zj4wjDbUUwucSfZgnZ2d\nscs+nw+fz6ezeUIUp3yCcbKaQtmQXdesFQgECAQCuh5D7xh/GfAb4CNogf1l4H7g1bhjNqB9ITwE\nfAb4I6A9yWPJGL8QCRI3cclWPmP8+Wb19PX10dzcnPlgYQo7snrGgS8B+4CjwM/Qgv43gTWRY74L\nNADHgK8Bf6rzOYUoGlYuAkqsKZSJ1+tl165d1NXV5fQ8wn6ygEsIxVm5qEp2XXMe2XpRiAJkdTAO\nh8MMDAywbt26pDWAKisr2bVrFy0tLRL0FSCBX6dQKMTExMS0D3M4HMbj8aRcfCGEFawOxmbmnQtj\nSeDPUzgcZmhoiC1bttDf3z/tlLqxsZFly5axceNGGhoapIcjbGNHME6sKWRV3rl0wrIngT8P0dPo\nTBsiG1EASwgj2BWMrSCdsNxJ4M+DVCMUQg3SCcuPHemcjhYKhdiyZUvWOdJ6CmAJIdIbGhrKGPRB\n2xOgra2NgYEBxsfHLWpdYSnqwC/VCIVQg3TCrFXUgb+kpCTnFZFgbQGsQif7ugqQTpjVpMBGHqQa\noX4yiSfiSSfMWhK98iDVCPWJ39c12X/2YDBIMBikv79fJvHyVCzpkNIJy09RD/VEqxHmSqoR6iOT\neOYJh8MMDg7S0dFBa2srCxcujP0YuSm7KqQTlp+ijl7RAli5nGLmWwCrWMX3PD0eD2NjY4TD4WkV\nIM+ePcuRI0fYvXs3hw8fnnb/6CSe7OuamZPPpJxeEtppZ1hF3eOXaoTmSex5PvLIIxw/fpxNmzax\ncuVKGhsbaWpqoqmpiTVr1tDb28vmzZvx+/0zHksm8bLj5DMpK6uQGsmpZ1hFv4BLqhEaL3Ehjt/v\nZ/369bS1tTE+Ps7p01d33XS7r/Y9mpub2bt3Lzt37pyxobjs65pevrX0VTqTctpiSlUWnMkCrjyU\nlJRQW1tLd3d3ylOyyspKuru7JehnKb7nuXz5cu69917a2to4cSJxczaYnJyMXT5x4gSrVq3ijjvu\n4IEHHph2nEzipef0dMhQKMTcuXPZvXs31113HVNTU7GfRNFOWEtLi60r6J18hlX0gR+04L9o0SL6\n+vrw+/14vV7cbjderxe/309fXx+LFi2SoJ+FxIU47e3tbN26NWnQj4oP/kNDQ/j9flavXs2SJUti\ntzthEs/ONQlOTYeMHypZuXIl27dvZ+vWrVy6dImRkZHY2HmUKp0wpy8409OFqgF+DFwH/A74HPBO\nkuMmgNcilweBT+t4TtOUlZXR3NxMV1dXwRbAskJiz3Pp0qV84xvfiF2fnJzE4/FM+88MMDU1FT1l\n5dy5c2zbto27776bjRs3AupM4iXj5DUJdp5JJZuM3rFjB3PnzuXFF1/kO9/5DgcOHODMmTPceOON\n+Hy+WBVSu19HPWdYuW6JaQY9Y/zbgTeBv0LbT/cG4MEkx50Hsvkrba/HL/QbGxtj4cKFsev9/f00\nNTXFrldWVjI+Pp70lDd+vL+hoYEXXniBlStXKr2vqyrjvImve7bMmjvJJssl3Zj+zTffzLp167jl\nlluoqqoiFApRXl6O1+ultLTU0LbmQ6XXO58xfj1f9W3AhyKX/wH43yQP/ELEjI+PM2fOHMLh8Ixe\nf7xTp05RVVUVm8RTNZNqaGgoqwnJ6DivWROSqqRDZnv2U11dnXao5LXXXuO1116bdptqk9H5UGWu\nSs8Yfx0wErl8FqhPcVwZ8Eu0Tdhn5uqJonL58mUuXrxITU3NtB5+Iq/XSygUUmISLxWVxnlVSIeM\nH7rp6emZ8boEg0F6enpYu3YtY2NjLFiwIKfHV2kyOl+qzFVl+urpA7xJbt+cw3M0AsNoQ0EvAkeB\nN5Id2NnZGbvs8/nw+Xw5PI1QQWLP8+zZszQ3N0+b3L148SIul4uqqipGR0enje9HrVy5kvLyctsn\n8dJRaZw3uiYlsZedihlnUrmc/dx1111s3bqVBx54gO3bt2f9HHZPRkfZeYYVCAQIBAK6HkPPGP+b\nwIfRevt1wGHgvRnu830gAOxK8jsZ4y8Aifnkjz32GL29vTz77LMzjr322mspLS3lwoULhMNhJicn\ncbvd1NfX8/LLLysznpuKSuO8YO+alFzXEUxNTXHp0iUOHjzI17/+dY4dO5bV/dxuN8ePH7d9cjTf\ndRNmzFVZnce/F7gncvmeyPVEc4HoJ6sW+Bjwuo7nFIpLXA29e/duvva1ryX9sF+4cIELFy5QUVFB\nbW0t9fX1tLS0sGfPHq677jqlg74eZo3z2rkmJZ+zn/jsrWypMlTi9FX/egL/o8BdaKmanwSiOXvL\ngL+LXF6Vm0UoAAANM0lEQVSMNrZ/FPg3YBtXUztFgWpoaGDPnj14vV4OHz7M008/zd69e2loaJh2\nnNvtprKyEo/Hg9vt5vrrr6e3t5clS5YoOaZvFDODl11rUvJZR+DxeDhw4AC33HJL1vdRKa03/nOe\njioLzuIVfckGYY5wOMzAwADr1q0jFApx3333cccdd+D3+zl37hwul4vq6upYAKqsrGTXrl20tLQo\nO6afaHR0lNbW1pwDnt/vtySX28pN2XMd9pqamiIUCnH58mXeeustbr311oz3UTGtN/FznsiKz7WU\nbBDKSOx57tu3j/7+fgKBAF/4whdYvHgx11xzjW2ro41YZatCJk06FRUVVFdXT/tXFS6Xizlz5tDY\n2Mg77yRb9zmdakMlUU5d9S89fmG6+J7n1NQUV65cweVy2bI62uhVtk4rLGaWfM9+1q5dy+23385D\nDz2U8hjVCyRGOwvR4btZs2bFqnHW1taa/vz59Pgl8IuiYcYqW6nuqtFTHfTdd9/l05/+tG1DJflS\npVSHBH6hm9M2lMiFWb1zFcZ5VZDv6wtw5swZHn/8cQ4dOsTw8DD19fWsWLEiVptHtTMkVUp1gAR+\noYMqvRezmF2vfnx83HHBy2h6z36snIzWS6UhPgn8Ii8q9V7MYlUGjpOClxmK4exHtU1vJKtH5MXJ\nG0pky6p69Spn0ljBqVkuuXD6pjcgPf6ip1rvxSz5lldQpUSAExXq2Y9qpTqkxy9yVgi9FzOpUiLA\niew4+7FzF7RMVCnJDPrq8YsC4NQt+3KlSr16YQ4nJCeo1ImQT7TIi0q9l2xEV9nmEvitXGUr8pds\nC8d4wWCQYDBIf3+/IckJhdCJkKEekReVei/ZcHo1RZGa1ckJqpfqyIYE/iIX7b3kSqXeS7acXE1R\nJGfHLmiF0ImQwF/kCqH3ki0769ULc9iVnOD0ToQE/iJXCL2XXBRDnnkxsSs5wemdCMnjF0VbaKxQ\n88yLid3rM1Qo1WF1yYY/BDqBG4Fb0XbaSmY1sBXwADuAb6c4TgK/jYphqb0oPKosprKzE2H1Aq5j\nwGeAQ2mOKQWeRAv+NwNrgaU6nlOYRIZAhBOpkpzgtFIdev7y32RxzIfRNlePDsL9GG2f3iM6nleY\npKysjObmZrq6umQIxGSFXP7aSrI+Iz9m5+M1ASfirp8EfCY/p9CpmP9DmM0JK0ydJJqckPhaphIt\nkezU5ASjZAr8fUCyfKVNwJ4sHj+nQfvOzs7YZZ/Ph8/ny+XuQijN6hWmxSKaWlksyQmBQIBAIKDr\nMYzI6nkJ2EDyyd2PAg8Dn4pc/xpwDfAXSY6VyV1R0FTavKPQFHNygp3VOVM96StAC9AIlAB+oNeg\n5xTCMexYYVpMJDkhN3p6/J8BtgHzgHNoE7afBBqAv0ObxCVy21a0L5mdwJYUjyc9flGwrNoBTBTf\n+gzZelEULKdnwaiSby4KTz6B31lVtkTRKfYsGKeVvxbOIJ8ooSzJgnFe+WvhDFKkTSirkDaBV2WF\nqRAggV8oqtCyYIqp/LVQnwR+oSSVN4HPZ0PvYit/XQxU3tg9E8nqEUpSMQtG70RzsZa/LjSqJRxI\nOqcoGHbXWU8UDdqZ5hwaGxvTTjQX8wrTQmDU58BIdq7cFUIJZmXBGDXRLCtMna1QEg6kxy+UpNJK\n11AoREdHBz09PVnfp7Kykv379zN//vyUxxTbClOnM+tzoJf0+EXBUCkLxqyJZqdt3lHsVE44yJUE\n/gLk5GyDKJWyYOza0FuopZA+B7IypIColm2gl9PrrEu5BQFqfg6kx18g4ssb9PT0zOiZBINBenp6\nWLt2LSMjI4TDYZtamr2SkhJqa2vp7u5OWYitsrKS7u5u5YI+SLkFoVHxcyCBv0AUSrZBIhWyYKTc\ngoDC+hyo1RqRl3zLG5idbWAUuzeBlw29BRTW50B6/AWgkLIN0rErC0aliWajFUIigFUK6XOgJ4//\nD4FO4EbgVpLvuQvwFhACJoAw8KEUx0kef55ULG9QaAqt3EKhJQJYRcXPgdUlG24EJoHvk3qzdYDf\nAsuAtzM8ngT+PKlW3qBQFUq5BRXLDjiJap8Dqxdw/Qb49yyPVWmFsIhQMdtAZSpMNBuhUBMBrFII\nnwMjAvJLpO/x/wfwDtpE8t8C301xnPT486RSeYNi4dRyC6qWHXAqFT4HZuy52wd4k9y+CdiT5XP8\nPjAM1AEvoJ0pHEh2YGdnZ+yyz+fD5/Nl+RTFrZCyDZzCqa+bnkQA6STMZMfrEQgECAQCuh7Dih5/\nvI2Rf7ck+Z30+HUYHBxMuTdtIq/XS3d3N4sWLaKsrMyC1glVSCJA4bGzSFuqJy2P/ABcC6wGXjfo\nOUWcaHkDrzfZCdpV0WyDlpYWCfoiayqWHRD50xP4PwOcQBvK+SegN3J7Q+Q6aMNEh4FfAUeAfway\nH1wUWXN6eQOhNkkEKCx6Av9zQDMwGy3AfzJy+xBwV+TyfwDvBz4ALAS+oeP5RAaFkG0gzFVIZQdE\n/lRKs5QxfgOpkG0g1JNvVk9fXx/Nzc0mtkwTCoWYmJiY1jkJh8N4PJ6UZ7LFTvbcFUJkpGIigKwk\nzp8EfiFERqqVHZCVxPrI1otCiIxUSwSQlcTWk8AvRBFSJREg35Liw8PDprar0MlQjxBFzs5EACk3\nop8ZJRuEEAXOzuBZSBuYO4kM9QghHEdWEusjgV8I4TiyklgfCfxCCNvISmJ7SOAXQtgmWlI8F1JS\nXD8J/EII2xTSBuZOIumcQghbqbaS2Glk5a4QwnFUW0lcDCTwCyFsp8pK4mKhZ6jnCbQdtUCru38f\nMJLkuNXAVsAD7AC+neLxZKhHCCElxXNk9VDPHqAFuAkYAB5Jckwp8CRa8L8ZWAss1fGcltK7obEZ\npE3ZU7Fd0qbMKioqOHr0KBUVFVRXVysT9FV7nfTQE/hfAiYjl/8NSDYt/2G0PXaDwBXgx1zdnUt5\nKr7R0qbsqdguaVN2pE3mMmqMfz2wO8ntTWj78kadjNwmhBDCJpmWvvWh7aebaBPaUA/AZuAy8KMk\nx8mgvRBCKEZvHv99wP3AJ4BkOyN8FHgY+FTk+teAa4C/SHLs/wPeo7M9QghRbN4E3mvVk61GG7+f\nl+aYMuAttPH/EuAV4IOmt0wIIYQp/i8wCByJ/HwvcnsD8E9xx30SLevn18BGKxsohBBCCCGEsNET\naGcBvwZ+DtSmOO4t4DW0s4r/o0ibVgPHIsc9bHKb/hBtSG2C9MNkb2Hd65Rtm6x8nWrQkhFeA/YB\nVSmOm+DqWerzJrUl099dipbafAwtFfr3TGpHru36PHCGq6/PH5vcnh8CpyNtSmUb2mftVaxZA5Sp\nTT7gHFdfo2Trl4zWDByKtOkNoCPFcVa/Vnn5OFfTSR8D/jLFcb9F+09thWzaVBppUyNaVtQrmPsi\n3wgsRFs3kS7IWvk6ZdMmq1+n7cBDkcsPAd9Jcdx5E9sA2f3dG4C/ilz+NMlToe1o131owcMqH420\nIVWQ/QOufjkvBX6lQJt8QI8F7Yh3HdpiWYA5wL8D7084JqfXys5aPdksAIuyqoqoiovSfoP2RmfD\nqtcpmzZZ/Tq1ATsjl//B5OdKJ5u/O76tPcByzH/vsmmXy4J2xPsXYDTN7+NfpyNoX1hmrwPK1Caw\nvqrxabR5UoAxtLPahoRjcnqtVCnSlmoBGGhrAaKn8F+xrEXOW5Rm1+uUitWvUx1Xa0WdBepTHFcG\n/BLtdNhvQjuy+bvjj5lEa3eq9lrZrings2hfED1YNwSVior/16aA29DOCA4ys+dttgXArcC/Jtye\n02tl9t5leheAAfw+MIz2H/sFtN7mARvbZMaitGzalIkdr1M6Vr5Om3N4jEa01+kG4EXgKNq4qVFU\nXbSYTbt60D7zV4AvRC7fbmajspDYu7b79e1HC6jjQCva8MoNFj33HOAnwIMkH7LM+rUyO/CvzPD7\n+9BONz+R5pjhyL9ngH9E+7bTE9D0tukk2mRLVDPTv2nNaFM2rH6dMrH6dTqDtqbkLNqX33CK46K3\n/xbYjzZHYWTgz+bvPgnMj7TFjZZEcMbANuTbrvghjm6uzkPYJdrmX0SuN0Vus9NY3OX9aB1EL5B6\nBxljlAA/BZ4heVKCiq9VUtksACuP/ABcC/wz0G5zm+xalPYSkGpzUqtfp2zaZPXrFD+5+z9IPkk5\nN9IW0ILtb9Cqxhopm787fnL3M1gzWZhNu+L3M1yDNhxmtgWkn9x9LnL5g2hnZ1ZYQOo2xceGZWjB\n1ewhcxfwNKkTYMC+1ypn2SwA+y9of8Cv0CYT/5cCbQJrF6V9Bq1ndhGtV9GbpE1Wv07ZtAmsfZ3i\n0zn3czWdcxnwd5HLy9H+Qx9FC/pfNqktyf7ub6IFU9AybJ6NtOVltEBjhUztegzt9XsdbQx5scnt\n2QUMofWaT6Clj94f+Yn6LldTFK3oYGVq0wNo79sxtGGfFRa06Xa0uaBfcTU2fRL7XyshhBBCCCGE\nEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBCJ/j9F5gUP54oWZwAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x42d6090>"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Simple."
]
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment