{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "While Matplotlib is powerful, it requires a steep learning curve. Moreover, I found it often requires more lines of code for the type of visualisations I wish to produce than various *.js libriaries. Ever since I found out about IPython Notebook and d3js I wanted to combine the two and replace Matplotlib in my workflow. IPython offers a great interactive way of using Python. D3js coupled with developer tools in Chrome/Firefox does the same to graphics." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Due to security concerns there is currently no easy way to execute Javascript in a cell. With this script you can create the d3 code from within (I)Python but render them later on with PhantomJs. Becasue of that one can easily switch between producing interactive SVG visualisations by just copying the resulting HTML code from the rendered script file, or saving a static version in PNG, PDF, etc.\n", "\n", "The main ingredients are coded as a [class in Python](http://gist.github.com/4484816)\n", "\n", "Dependencies:\n", "\n", "* PhantomJs (in `PATH`)\n", "* `titlecase`\n", "* NumPy" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from ipyD3 import *\n", "from IPython.display import display\n", "d3 = d3object()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "All arguments are kwargs, and you can set:\n", "\n", "* `height` of your object\n", "* `width` of your object\n", "* html that will preceed yout object (`topHtml`)\n", "* html that will follow yout object (`bottomHtml`)\n", "* a predefined `style` that already includes `topHtml`, `botttomHtml`, and css\n", "* weather to execute the scripts in your notebook (`publish`)\n", "* how precise should be the data on conversion to Javascript variables (`precision`)\n", "* path to the PhantomJs executable (`phantomExec`)\n", "* path to directory where you want to permanently story otherwise temporary ipyD3 files (`keepTempDir`)\n", "* previous `d3` objects if you wish to create a multi-page report" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Figures\n", "\n", "You start by initializing the object." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "d3 = d3object(width=800,\n", " height=200,\n", " style='JFFigure',\n", " number=1,\n", " d3=None,\n", " precision=100,\n", " title='Example figure with d3js',\n", " desc='Standrad normal distribution')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Variables are passed through `addVar` function. It will convert the basic types to `Javascript`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "d3.addVar(\n", "interpolation1='basis',\n", "interpolation2='step-before',\n", "resolution=80,\n", "domainRange=[-4,4],\n", "imposeMax=0\n", ")" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can add your own `Javascript` and `CSS`. Note, that all variables specified with `addVar` are pasted at the beginning of the script, so if you need to change a variable's value within the script you need to use `addJs`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "d3.addJs('''\n", " var svg = d3.select(\"#\"+d3ObjId)\n", " .append(\"svg\")\n", " .attr(\"width\", width)\n", " .attr(\"height\", height)\n", " .append(\"g\").attr(\"id\", \"#\"+d3ObjId+'InnerG')\n", "\n", " // A formatter for counts.\n", " var formatCount = d3.format(\",.0f\");\n", " \n", " var margin = {top: 10, right: 30, bottom: 30, left: 30},\n", " width = width - margin.left - margin.right,\n", " height = height - margin.top - margin.bottom;\n", " \n", " var x = d3.scale.linear()\n", " //.domain(domainRange)\n", " .range([0, width]);\n", " \n", " // Generate a histogram using twenty uniformly-spaced bins.\n", " var xAxis = d3.svg.axis()\n", " .ticks(4)\n", " .scale(x)\n", " .orient(\"bottom\");\n", "\n", " function appendHistogram(series, domainSeries, height, width, x_offset, y_offset, interpolation){\n", " var svg2 = svg.append(\"g\")\n", " y_offset=Math.round(y_offset)\n", " height=Math.round(height)\n", " height+=y_offset\n", " width+=x_offset\n", "\n", " x.range([x_offset, width])\n", " .domain(domainSeries)\n", "\n", " var data = d3.layout.histogram()\n", " .bins(x.ticks(resolution))\n", " .frequency(0)\n", " (series);\n", " \n", " var seriesMax=d3.max([imposeMax, d3.max(data, function(d) { return d.y; })]);\n", " var y = d3.scale.linear()\n", " //.domain([0, d3.max(data, function(d) { return d.y; })])\n", " .domain([0, seriesMax])\n", " .range([height, y_offset]);\n", " \n", "\n", " var area = d3.svg.area()\n", " .interpolate(interpolation)\n", " .x(function(d) { \n", " if(interpolation==\"step-before\")\n", " return x(d.x+d.dx/2)\n", " return x(d.x); \n", " })\n", " .y0(height)\n", " .y1(function(d) { return d3.max([y(d.y),y(seriesMax)]); });\n", " \n", " svg2.append(\"path\")\n", " .datum(data)\n", " .attr(\"class\", \"area\")\n", " .attr(\"d\", area);\n", " \n", " svg2.append(\"g\")\n", " .attr(\"class\", \"axis\")\n", " .attr(\"transform\", \"translate(0,\" + height + \")\")\n", " .call(xAxis);\n", " \n", " \n", " }\n", "\n", "appendHistogram(data, domainRange, height, width/2-15, 10, 0, interpolation1)\n", "appendHistogram(data, domainRange, height, width/2-15, width/2+20, 0, interpolation2)\n", "''')\n", "\n", "d3.addCss('''\n", " .polyline{\n", " stroke: #000;\n", " shape-rendering: crispEdges;\n", " }\n", " .area{\n", " shape-rendering: geometricPrecision;\n", " stroke: #000 !important;\n", " stroke-width:1 !important;\n", " fill: #ddd !important;\n", " }\n", " \n", " .axis path, .axis line {\n", " fill: none;\n", " stroke: #000;\n", " stroke-width: 1px;\n", " color-rendering: optimizeQuality !important;\n", " shape-rendering: crispEdges !important;\n", " text-rendering: geometricPrecision !important; \n", " \n", " }\n", "''')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "E.g. dsitribution of standard normal. D3js allows for quick swtiching between histograms and approx. shape of the distribution.\n", "\n", "With too few observations:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "d3.addVar(data=np.random.randn(1000))\n", "html=d3.render(mode=('show','html'))\n", "display(html)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\r\n", "
-4-2024-4-2024
\r\n", "
\r\n", " Figure 1. Example Figure With D3js. Standrad normal distribution
\r\n", " \r\n", "\r\n" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "And with just enough:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "d3.addVar(data=np.random.randn(300000))\n", "html=d3.render(mode=('show','html'))\n", "display(html)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\r\n", "
-4-2024-4-2024
\r\n", "
\r\n", " Figure 1. Example Figure With D3js. Standrad normal distribution
\r\n", " \r\n", "\r\n" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "While displaying the 'rendered' `svg` (which is what `('show', 'html')` does) is handy. Some prefer to get a `png`, although it tends to be of lower quality." ] }, { "cell_type": "code", "collapsed": false, "input": [ "d3.addVar(data=np.random.randn(300000))\n", "png=d3.render(mode=('show','png'))\n", "display(png)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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YVpQ/NRVV12lZ5991nQM+ImHH36YuwIBgJ+KiorS1KlT1aVLF+v18ssva8uWLaajIUBxm2E/NHnyZF1zzTXq2LGj6SjwE2FhYZo+fbpuvPFGvfbaa6bjAABcrE+fPk7Dr776qqEkAC0ofuejjz5Senq6xo0bZzoK/MyAAQPUsGFDLVy40HQUAADgxyhQ/ExcXByXdsFtHnjgAb388svatGmT6SgAAMBPcYmXHxk3bpyeeuop1ahRw3QU+LFXX31V7du351amgIfl5eXpqaee0tatW61xu3bt0uWXX24wFfxVTk6OVq5cqS+//NIad9NNN/HYAngEd/HyE4899ph27typBx54wHQUBIAdO3YoKSlJGzduNB0FCBjZ2dnq1KmTpkyZYo2rV6+e4uLiDKaCv9qyZYveeOMNFd5saf/+/WrdurVefPFFw8ngD8q6ixcFih9Yv369Jk+erOXLl5uOggCyZs0affzxx3r99ddNRwECQnZ2ts477zwusYQRq1ev1vr167VixQrTUeAHuM2wn8vJydEVV1xBcQKPGzhwoMLDwzV9+nTTUQAAgB+hQPFxF154od58803TMRCg7rrrLu3cuVNLly41HQUAAPgJOsn7sHHjxumWW25R586dTUdBAJs/f76GDRumDh066KKLLjIdBwDgJt9//71SUlKs4aioKF188cUGE8Ff0QfFR7300kv67LPPlJiYaDoKIEkaPny41q5dyx1eABf59NNPde211yo4OFiS5HA4dN555yk1NdVwMgSiEydOaNGiRTp69Kg17pNPPtEXX3yhJk2aGEwGX0QneT/0zjvvyG6380cKXmXPnj268847lZmZaToK4BemTZumX3/9Vbfffrs1rm7dugoNDTWYCjjtoosu0pdffqmwsDDTUeBj6CTvZ7744gtNmzaN4gReJzw8XOPHj9eIESNMRwH8Ru3atdWkSRPrRXECIBBQoPiQ7OxsDRgwQKtWrTIdBSjRtddeq5CQED3xxBOmowAAAB9FJ3kf0rx5c3377bemYwBn9eCDD+rGG29UdHS0oqOjTccBfMY333zj9NTub775RpGRkQYTAYAZFCg+YsCAAfr0009VrRqNXvB+K1asUJ8+ffTTTz+ZjgL4jAEDBqhLly7Wfj4vL08333yz4VRA6XJzc/Xiiy+qXr161rg77rhDQUFBBlPBH9BJ3gf07dtXd911F2ej4VN+/PFHDR8+XPv27TMdBfAJoaGh2rJli0JCQkxHAcrlww8/1EcffWQN79y5U9dcc41mzZplMBV8QVmd5GlB8XKjR4/W1VdfTXECn9O8eXMtXrxYXbt21datW03HAQC4WL9+/dSvXz9rOCUlRcePHzeYCP6C64W82Ny5c1W3bl3dcMMNpqMAldK5c2c98MADuuyyy0xHAQAAPoICxUs9++yz+uKLL3gQI3xer169dNNNN+n66683HQUAAPgALvHyQikpKfr666/197//3XQUwCX69++v+vXra/DgwXrrrbdMxwGMO3LkiO677z6dOHHCGte0aVNuhAKfVqtWLa1du1Z33nmnNe7SSy/lZg+oMAoUL/PII49o06ZNstvtpqMALhUdHS2Hw6Hw8HBt2rRJ55xzjulIgDGvvvqqvvvuOw0dOtQaN3LkSAUHBxtMBVTNbbfdpho1aujUqVOS8u/ydfvtt1OgoMK4i5cXGT16tOrUqaP777/fdBTAbb7//nsNGzZMKSkpGjJkiOk4gBEpKSn65JNPNHfuXNNRALfJyclR165d9eeff5qOAi/DXbx8xMUXX6zBgwc7nU0D/FGrVq20ceNG3X333dqxY4emTZtmOhLgdr/88osyMzOt4T179ojzfwgEDodDH3zwgTUcEhKiPn36GEwEX0ALimGbN2/W8OHDNXfuXPXs2dN0HMCj/vnPf2rJkiVatmwZd/qCXxswYIB++OEH1ahRQ5J08uRJzZ49W926dTOcDHAfh8OhhQsXKiMjwxr3yy+/6JFHHtG1115rMBlMK6sFhQLFoL/97W969dVXtWzZMtWpU8d0HMCIH3/8UQ888IDatWunZcuWmY4DuEXHjh315JNPqn379qajAEbNmjVLffr0cepIj8BTVoHC7UIM6devn/bv368333yT4gQBrXnz5lq2bJnOP/982Ww2vfzyy6YjAQDcpGnTpkpJSdFVV12lq666SldeeaWeffZZ07HgZWhB8TC73a7XX39dd955p2JiYkzHAbzOQw89pOzsbL388stq1KiR6ThAhR04cECjRo3Szz//bI3Lzc3V4sWLFRYWZjAZYN7Jkye1ceNGa/jnn3/WkiVLtGvXLoOp4Gl0kvcSr7/+uiZOnKgrr7xSS5cuVRmfCxCwHnroIX3yySeKiIjQww8/rHvvvdd0JKBCvvjiCx04cECzZs2yxjVo0IDiBJAUHBysvn37WsO7d+/Wc889ZzARvBEFipu98847SkpKUpMmTbR8+XI1b97cdCTA6/Xt21ebN2/W3Llzdfvtt+uGG27Q4MGDTccCSnTo0CGtXbvWGs7IyFCNGjV03nnnGUwF+I5jx47p4YcftoZbtmypsWPHGkwE07jEyw0OHDigp59+Wk8//bSioqJ05513cqcWoJK2bt2WVDj6AAAVHElEQVSqlJQU7d27V1OmTOGPFrzO0KFDdeDAATVu3FiSdOrUKY0cOVJdu3Y1nAzwDWlpadq5c6c1/O6778put2vAgAEGU8GduIuXB6WlpSktLU3Lly/XLbfcouHDh/O0bMBFdu/erWeffVZr167VpEmTNHHiRNWqVct0LASY48eP65577tG3335rjTt27JjmzJlDiwngItOmTdPu3btVr149Sfl9uCZNmkRLuh+hQHGzH374QampqVqyZIk6deqkESNG8DwHwI2OHj2q5557Ts8++6yGDx+uSZMmqXPnzqZjIUB8++236t+/vxYsWGCNq1Onjjp16mQwFeBfjh07pi+//NIa/uqrr7R582Z9+OGHBlPBlShQ3GDdunX697//rbS0NOXl5alfv3668cYbaS0BPOyVV17RCy+8oEsvvVRXXXWVhg4dajoS/Mz69es1fvx4pwcsnnPOOUpJSTGcDAgcGRkZmj17tho0aGCN69ixo+x2Oy3pPooCxUVeeeUVffzxx3r++efVo0cPxcbG6uKLL1aXLl1MRwMC3saNG7V8+XJt3LhR8fHxGj9+vFq3bm06FnxMXl6err/+em3atMkaFxwcrPHjxysqKsoa17p1a9WvX99ERCBgff311zp27Jg1PG3aNK1du5bWSx9FgVJJv//+uz7++GO98MILev311zV48GBde+21io2NVXBwsOl4AEpw5MgRrVixQu+9956OHj2qXr16qVevXurZs6d69uxpnQUHCu3Zs0d5eXmSpJycHHXt2lWffPKJ9fOgoCCexwN4ofj4eB06dMjar+fk5GjBggXq2bOnNU1oaKhCQkJMRcRZUKCU09GjR7Vx40Z99NFH+uCDD7Rjxw5df/316tWrlwYNGmQ6HoAK2rt3rzIyMrRt2zZlZGQoKChIP/74ozp16qSoqCh169ZNrVu3VkREhFq2bGk6Lgx45513FB8f73QA07t3b/31r381mApAeRw5ckR79uyxhvft26cFCxbo999/t8aFh4drypQpCgoKkpR/wuGGG27weFacKeALlJycHB0+fFjZ2dn66aefrNeJEyf0+eefa+/evdq3b58iIiLUsGFD9erVS71799b5559vOjoAF9u/f792796trKwsHT58WFu2bNF3332nQ4cOqV27doqOjlaTJk3UqVMndezYUZ06ddJf/vIX07FRDidPntSvv/7qNJySkqLDhw9b47Zs2aL09HRr2OFwKCUlhRubAH7q5Zdf1meffWYNHzhwQL///rsaNmwoKX8fMGDAAE2YMMGaplq1aqpZs6bHswYavypQTp06ZRUcv/zyiw4fPmy99u7dq/379+uHH35Q3bp1tWHDBh0+fFi5ublq2bKlQkND1aRJEzVt2lSNGzdW27Zt1ahRI7Vs2VItWrRQ7dq1Tb89AIbk5OTou+++0/79+5WZmak9e/Zoz549qlOnjjZu3KiWLVuqZcuWat26tVq2bKkaNWqoTp06qlOnjho3bqzQ0FA1aNBADRo0UMOGDVW/fn32KVWQm5urU6dOWcN//PGH00HG0aNHZbfbtW/fPmtcy5YttXPnThX+zTt16pTi4uIUERFhTdOxY0dFR0c7LavwzCoA/5eXl6fPP//cGj5x4oT+8Y9/6Ouvv7bGNWrUSFdffbXCwsKscW3atHHaJ4WFhal3795O827YsKGqVavmxvT+xSMFSnZ2tq6++mr98ccfqlatmqpVq6amTZvqwIEDysvLk8PhUGhoqNXs5nA45HA41LBhQ2VnZ+vkyZPKzc1V/fr1lZ2drby8POtVv359HThwwNowwsPDlZ2drdDQUOvawrp16yokJER16tRR7dq1FRYWptzcXIWGhio4OFjVq1dXbm6uU+Z69eo5nW2rWbOm/vjjD6dpateu7dRUWKdOHacOWpIUEhKiEydOlDrfkhSfpkaNGsrJyXGapm7duvrtt99KzVJS5uK/I+mM91582awb1g3r5rSS1s3hw4f122+/6dixYzp27JhycnL0xx9/KDc3Vzk5OapXr57VKnvixAk5HA79+uuvOnXqlEJCQhQSEqI2bdrowIED1v6xQYMG+u2336yDaZvNpkaNGuno0aPWNE2aNNEvv/wim81mTRcSEqIjR44oJydHoaGhatq0qd5//30j/eIOHjyo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\r\n", "text": [ "" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "And then you can easily create other grpahics like Violin plots (see http://bl.ocks.org/z-m-k/5014368 or https://gist.github.com/z-m-k/5014368 for code)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "html=d3.render(mode=('show','html'))\n", "display(html)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\r\n", "
-10-50510
\r\n", "
\r\n", " Figure 1. Example Figure With D3js. Violin plots
\r\n", " \r\n", "\r\n" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Saving and rendering\n", "\n", "You can also save the output to a file by adding `file` to `mode` and providing a path with `fileName` in `render`.\n", "\n", "Furthermore, if the script requires more time to fully render you can change `renderTime` (defaults to 1000ms)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "d3.render(mode=['html', 'file'], renderTime=10000, fileName='PATH/TO/THE/FILE')" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Tables\n", "I often use this class to produce tables. Of course you could use `ipy_table` too. The main difference between the two approaches is that `ipy_table` produces tabls in HTML while ipyD3 outputs SVG. In the end, ipyD3 allows for more customization (see below)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "d3 = d3object(width=800,\n", " height=400,\n", " style='JFTable',\n", " number=1,\n", " d3=None,\n", " title='Example table with d3js',\n", " desc='An example table created created with d3js with data generated with Python.')\n", "data=[[1277.0, 654.0, 288.0, 1976.0, 3281.0, 3089.0, 10336.0, 4650.0, 4441.0, 4670.0, 944.0, 110.0],\n", "[1318.0, 664.0, 418.0, 1952.0, 3581.0, 4574.0, 11457.0, 6139.0, 7078.0, 6561.0, 2354.0, 710.0],\n", "[1783.0, 774.0, 564.0, 1470.0, 3571.0, 3103.0, 9392.0, 5532.0, 5661.0, 4991.0, 2032.0, 680.0],\n", "[1301.0, 604.0, 286.0, 2152.0, 3282.0, 3369.0, 10490.0, 5406.0, 4727.0, 3428.0, 1559.0, 620.0],\n", "[1537.0, 1714.0, 724.0, 4824.0, 5551.0, 8096.0, 16589.0, 13650.0, 9552.0, 13709.0, 2460.0, 720.0],\n", "[5691.0, 2995.0, 1680.0, 11741.0, 16232.0, 14731.0, 43522.0, 32794.0, 26634.0, 31400.0, 7350.0, 3010.0],\n", "[1650.0, 2096.0, 60.0, 50.0, 1180.0, 5602.0, 15728.0, 6874.0, 5115.0, 3510.0, 1390.0, 170.0],\n", "[72.0, 60.0, 60.0, 10.0, 120.0, 172.0, 1092.0, 675.0, 408.0, 360.0, 156.0, 100.0]]\n", "data=[list(i) for i in zip(*data)]\n", "sRows=[['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'Deecember']]\n", "sColumns=[['Prod {0}'.format(i) for i in xrange(1,9)],\n", " [None, '', None, None, 'Group 1', None, None, 'Group 2']]\n", "d3.addSimpleTable( data, \n", " fontSizeCells=[12,],\n", " sRows=sRows,\n", " sColumns=sColumns,\n", " sRowsMargins=[5,50,0],\n", " sColsMargins=[5,20,10],\n", " spacing=0,\n", " addBorders=1,\n", " addOutsideBorders=-1,\n", " rectWidth=45,\n", " rectHeight=0 \n", " )\n", "html=d3.render(mode=['html', 'show'])\n", "display(html)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\r\n", "
Table 1
\r\n", "
Example Table With D3js
\r\n", "
An example table created created with d3js with data generated with Python.
\r\n", "
127765428819763281308910336465044414670944110131866441819523581457411457613970786561235471017837745641470357131039392553256614991203268013016042862152328233691049054064727342815596201537171472448245551809616589136509552137092460720569129951680117411623214731435223279426634314007350301016502096605011805602157286874511535101390170726060101201721092675408360156100Prod 1Prod 2Prod 3Prod 4Prod 5Prod 6Prod 7Prod 8Group 1Group 2JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDeecember
\r\n", "\r\n" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "For a slightly cleaner look you can remove the borders..." ] }, { "cell_type": "code", "collapsed": false, "input": [ "d3 = d3object(width=800,\n", " height=400,\n", " style='JFTable',\n", " number=1,\n", " d3=None,\n", " title='Example table with d3js',\n", " desc='An example table created created with d3js with data generated with Python.')\n", "d3.addSimpleTable( data, \n", " fontSizeCells=[12,],\n", " sRows=sRows,\n", " sColumns=sColumns,\n", " sRowsMargins=[5,50,0],\n", " sColsMargins=[5,20,10],\n", " spacing=2,\n", " addBorders=0,\n", " addOutsideBorders=-1,\n", " rectWidth=45,\n", " rectHeight=0 \n", " )\n", "html=d3.render(mode=['html', 'show'])\n", "display(html)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\r\n", "
Table 1
\r\n", "
Example Table With D3js
\r\n", "
An example table created created with d3js with data generated with Python.
\r\n", "
127765428819763281308910336465044414670944110131866441819523581457411457613970786561235471017837745641470357131039392553256614991203268013016042862152328233691049054064727342815596201537171472448245551809616589136509552137092460720569129951680117411623214731435223279426634314007350301016502096605011805602157286874511535101390170726060101201721092675408360156100Prod 1Prod 2Prod 3Prod 4Prod 5Prod 6Prod 7Prod 8Group 1Group 2JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDeecember
\r\n", "\r\n" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "But since it is HTML you can easily increase readability of the table!! With _addTable_ instead of _addSimpleTable_. In fact _addSimpleTable_ is just a reference to _addTable_" ] }, { "cell_type": "code", "collapsed": false, "input": [ "d3 = d3object(width=800,\n", " height=400,\n", " style='JFTable',\n", " number=1,\n", " d3=None,\n", " title='Example table with d3js',\n", " desc='An example table created created with d3js with data generated with Python.')\n", "d3.addTable(data,\n", " dataAdd=[],\n", " pVals=-1,\n", " fontSizeCells=[11,5],\n", " fontSizeCellsLabels=[11,5],\n", " sRows=sRows,\n", " sColumns=sColumns,\n", " sRowsMargins=[5,50,0],\n", " sColsMargins=[5,20,10],\n", " fontSizeHeaders=11,\n", " shrinkHeadersBorders=1.5,\n", " heatmapIgnoreText=1,\n", " varLabels=[],\n", " heatmap={\n", " 'draw':1,\n", " 'spacing':2,\n", " 'fillProportion':21,\n", " 'addText':1,\n", " 'addTextRows':1,\n", " 'addBorders':0,\n", " 'addOutsideBorders':-1,\n", " 'rectWidth':45,\n", " 'rectHeight':21,\n", " },\n", " smallHeatmap={\n", " 'draw':0,\n", " 'spacing':0,\n", " 'fillProportion':5,\n", " 'addText':0,\n", " 'addTextRows':0,\n", " 'addBorders':1,\n", " 'addOutsideBorders':-1,\n", " 'rectWidth':5,\n", " 'rectHeight':5,\n", " },\n", " heatmapLegendVert=1,\n", " legend= {\n", " 'draw':0,\n", " 'width':2,\n", " 'height':15,\n", " 'rectWidth':60,\n", " 'rectHeight':60\n", " },\n", " rightPaneOffset=0,\n", " colorDomainAuto=1,\n", " #colorDomainAutoIgnoreRows=[5],\n", " colorRange=['#ffffff', '#dddddd', '#cccccc', '#bbbbbb', '#aaaaaa', '#999999']\n", ")\n", "d3 = d3object(width=800,\n", " height=400,\n", " style='JFTable',\n", " number=1,\n", " d3=d3,\n", " keepTempDir='c:\\sandbox',\n", " title='Example table with d3js with a small heatmap',\n", " desc='An example table created created with d3js with data generated with Python.')\n", "d3.addTable(data,\n", " dataAdd=[],\n", " pVals=-1,\n", " fontSizeCells=[11,5],\n", " fontSizeCellsLabels=[11,5],\n", " sRows=sRows,\n", " sColumns=sColumns,\n", " sRowsMargins=[5,50,0],\n", " sColsMargins=[5,20,10],\n", " fontSizeHeaders=11,\n", " shrinkHeadersBorders=1.5,\n", " heatmapIgnoreText=1,\n", " varLabels=['Sales'],\n", " heatmap={\n", " 'draw':1,\n", " 'spacing':2,\n", " 'fillProportion':0,\n", " 'addText':1,\n", " 'addTextRows':1,\n", " 'addBorders':0,\n", " 'addOutsideBorders':-1,\n", " 'rectWidth':45,\n", " 'rectHeight':21,\n", " },\n", " smallHeatmap={\n", " 'draw':1,\n", " 'spacing':0,\n", " 'fillProportion':10,\n", " 'addText':0,\n", " 'addTextRows':0,\n", " 'addBorders':0,\n", " 'addOutsideBorders':0,\n", " 'rectWidth':10,\n", " 'rectHeight':10,\n", " },\n", " heatmapLegendVert=1,\n", " legend= {\n", " 'draw':1,\n", " 'width':2,\n", " 'height':15,\n", " 'rectWidth':45,\n", " 'rectHeight':30\n", " },\n", " rightPaneOffset=100,\n", " colorDomainAuto=1,\n", " colorRange=['#ffffff', '#eeeeee', '#aaaaaa', '#111111', '#000000']\n", ")\n", "html=d3.render(mode=['html', 'show'])\n", "display(html)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\r\n", "\r\n", "
Table 1
\r\n", "
Example Table With D3js
\r\n", "
An example table created created with d3js with data generated with Python.
\r\n", "
127765428819763281308910336465044414670944110131866441819523581457411457613970786561235471017837745641470357131039392553256614991203268013016042862152328233691049054064727342815596201537171472448245551809616589136509552137092460720569129951680117411623214731435223279426634314007350301016502096605011805602157286874511535101390170726060101201721092675408360156100Prod 1Prod 2Prod 3Prod 4Prod 5Prod 6Prod 7Prod 8Group 1Group 2JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDeecember10,00020,00030,00040,000
 
\r\n", "\r\n", "\r\n", "
Table 1
\r\n", "
Example Table With D3js With a Small Heatmap
\r\n", "
An example table created created with d3js with data generated with Python.
\r\n", "
127765428819763281308910336465044414670944110131866441819523581457411457613970786561235471017837745641470357131039392553256614991203268013016042862152328233691049054064727342815596201537171472448245551809616589136509552137092460720569129951680117411623214731435223279426634314007350301016502096605011805602157286874511535101390170726060101201721092675408360156100Prod 1Prod 2Prod 3Prod 4Prod 5Prod 6Prod 7Prod 8Group 1Group 2JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDeecember8,71234,820Sales10,00020,00030,00040,000
\r\n", "\r\n" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "I often work with output from statistical packages and including more information in a cell also comes at little to no cost." ] }, { "cell_type": "code", "collapsed": false, "input": [ "d3 = d3object(width=800,\n", " height=400,\n", " style='JFTable',\n", " number=1,\n", " d3=None,\n", " title='Example table with d3js',\n", " desc='An example table created created with d3js with data generated with Python.')\n", "sRows=[['Long/Short Eq. Hedge',\n", " 'FoF',\n", " 'Not L/S nor FoF',\n", " 'All',\n", " 'Not FoFs',\n", "]]\n", "\n", "sColumns=[\n", " ['N',\n", " 'Initial',\n", " 'Average',\n", " 'Incentive',\n", " 'Management',\n", " 'Median',\n", " 'Mean [%]',\n", " 'Std. dev.',\n", " 'Skewness',\n", " 'Kurtosis'\n", " ],\n", " [ '',\n", " None,\n", " 'AUM [M, USD]',\n", " None,\n", " 'Fees [%]',\n", " None,\n", " None,\n", " None,\n", " None,\n", " 'Returns'\n", " ]\n", " ]\n", "data=[[3452, 3, 22, 20.0, 1.5, 0.666, 0.656, 3.538, -0.1, 1.0],\n", " [5791, 7, 22, 10.0, 1.5, 0.502, 0.27, 1.17, -0.9, 1.8],\n", " [6718, 4, 23, 20.0, 1.5, 0.7, 0.637, 1.448, -0.2, 1.2],\n", " [15961,5,23, 20.0, 1.5, 0.6, 0.467, 1.467, -0.4, 1.3],\n", " [10170,4, 23, 20.0, 1.5, 0.69, 0.646, 2.633, -0.1, 1.1],\n", " ]\n", "dataAdd=[['', '', '', '', '', '', 0.015, '', '', 0.084],\n", " ['', '', '', '', '', '', 0.016, '', '', 0.015],\n", " ['', '', '', '', '', '', 0.024, '', '', 0.162],\n", " ['', '', '', '', '', '', 0.058, '', '', 0.126],\n", " ['', '', '', '', '', '', 0.093, '', '', 0.149],\n", " ]\n", "dataAdd=[dataAdd,[[i for i in j] for j in dataAdd]]\n", "d3.precision=2\n", "data=d3.convertVar(data)\n", "d3.precision=4\n", "d3.addSimpleTable( data, \n", " dataAdd=dataAdd,\n", " fontSizeCells=[12,10,10],\n", " pVals=0,\n", " sRows=sRows,\n", " sColumns=sColumns,\n", " sRowsMargins=[5,100,0],\n", " sColsMargins=[5,20,10],\n", " spacing=2,\n", " addBorders=0,\n", " addOutsideBorders=-1,\n", " rectWidth=45,\n", " rectHeight=0 \n", " )\n", "html=d3.render(mode=('show','html'))\n", "display(html)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\r\n", "
Table 1
\r\n", "
Example Table With D3js
\r\n", "
An example table created created with d3js with data generated with Python.
\r\n", "
345257916718159611017037454222223232320102020201.51.51.51.51.50.670.50.70.60.690.66★★0.0150.27★★0.0160.64★★0.0240.470.0580.650.0933.541.171.451.472.63-0.1-0.9-0.2-0.4-0.110.0841.8★★0.0151.20.1621.30.1261.10.149NInitialAverageIncentiveManagementMedianMean [%]Std. dev.SkewnessKurtosisAUM [M, USD]Fees [%]ReturnsLong/Short Eq. HedgeFoFNot L/S nor FoFAllNot FoFs
\r\n", "\r\n" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 12 } ], "metadata": {} } ] }