Table Subplots in JavaScript

How to make a D3.js-based table subplots in javascript.


Plotly Studio: Transform any dataset into an interactive data application in minutes with AI. Try Plotly Studio now.

d3.csv("https://raw.githubusercontent.com/plotly/datasets/master/Mining-BTC-180.csv", function(err, rows){

  function unpack(rows, key) {
  return rows.map(function(row) { return row[key]; });
  }

  // header values
  var headerNames = d3.keys(rows[0]);
  var headerValues = [headerNames[1],headerNames[2],
                      headerNames[3],headerNames[4]];

  // cell values
  var cellValues = [];
  for (i = 0; i < headerValues.length; i++) {
    cellValue = unpack(rows, headerValues[i]);
    cellValues[i] = cellValue;
  }

  // clean date
  for (i = 0; i < cellValues[0].length; i++) {
  var dateValue = cellValues[0][i].split(' ')[0]
  cellValues[0][i] = dateValue
  }

  // create table
  var table = {
    type: 'table',
    columnwidth: [150,200,200,150],
    columnorder: [0,1,2,3],
    header: {
      values: headerValues,
      align: "center",
      line: {width: 1, color: 'rgb(50, 50, 50)'},
      fill: {color: ['rgb(235, 100, 230)']},
      font: {family: "Arial", size: 11, color: "white"}
    },
    cells: {
      values: cellValues,
      align: ["center", "center"],
      line: {color: "black", width: 1},
      fill: {color: ['rgb(235, 193, 238)', 'rgba(228, 222, 249, 0.65)']},
      font: {family: "Arial", size: 10, color: ["black"]}
    },
    xaxis: 'x',
    yaxis: 'y',
    domain: {x: [0,0.4], y: [0,1]}
  }

  // create 1st plot
  var trace1 = {
    x: unpack(rows, 'Date'),
    y: unpack(rows, 'Hash-rate'),
    xaxis: 'x1',
    yaxis: 'y1',
    mode: 'lines',
    line: {width: 2, color: '#9748a1'},
    name: 'hash-rate-TH/s'
  }
  // create 2nd plot
  var trace2 = {
    x: unpack(rows, 'Date'),
    y: unpack(rows, 'Mining-revenue-USD'),
    xaxis: 'x2',
    yaxis: 'y2',
    mode: 'lines',
    line: {width: 2, color: '#b04553'},
    name: 'Mining-revenue-USD'
  }

  // create 3rd plot
  var trace3 = {
    x: unpack(rows, 'Date'),
    y: unpack(rows, 'Transaction-fees-BTC'),
    xaxis: 'x3',
    yaxis: 'y3',
    mode: 'lines',
    line: {width: 2, color: '#af7bbd'},
    name: 'Transaction-fees-BTC'
  }

  var data = [table,trace1,trace2,trace3]

  // define subplot axes
  var axis = {
    showline: true,
    zeroline: false,
    showgrid: true,
    mirror:true,
    ticklen: 4,
    gridcolor: '#ffffff',
    tickfont: {size: 10},
  }

  var axis1 = {domain: [0.5, 1], anchor: 'y1', showticklabels: false}
  var axis2 = {domain: [0.5, 1], anchor: 'y2', showticklabels: false}
  var axis3 = {domain: [0.5, 1], anchor: 'y3'}
  var axis4 = {domain: [0.66, 0.98], anchor: 'x1', hoverformat: '.2f'}
  var axis5 = {domain: [0.34, 0.64], anchor: 'x2', tickprefix: '$', hoverformat: '.2f'}
  var axis6 = {domain: [0.0, 0.32], anchor: 'x3', tickprefix: '\u20BF', hoverformat: '.2f'}

  // define layout
  var layout = {
    title: {text: "Bitcoin mining stats for 180 days"},
    plot_bgcolor: 'rgba(228, 222, 249, 0.65)',
    showlegend: false,
    xaxis1: Object.assign(axis1,axis),
    xaxis2: Object.assign(axis2,axis),
    xaxis3: Object.assign(axis3,axis),
    yaxis1: Object.assign(axis4,axis),
    yaxis2: Object.assign(axis5,axis),
    yaxis3: Object.assign(axis6,axis)
  }

  Plotly.newPlot('myDiv', data, layout);

});
</script>\n\t<script src="/?originalUrl=https%3A%2F%2Fcdnjs.cloudflare.com%2Fajax%2Flibs%2Fd3%2F3.5.17%2Fd3.min.js"></script>\n</head>\n\n<body>\n\t<div id='myDiv'><!-- Plotly chart will be drawn inside this DIV --></div>\n</body>","js":"d3.csv(\"https://raw.githubusercontent.com/plotly/datasets/master/Mining-BTC-180.csv\", function(err, rows){\n\n function unpack(rows, key) {\n return rows.map(function(row) { return row[key]; });\n }\n\n // header values\n var headerNames = d3.keys(rows[0]);\n var headerValues = [headerNames[1],headerNames[2],\n headerNames[3],headerNames[4]];\n\n // cell values\n var cellValues = [];\n for (i = 0; i < headerValues.length; i++) {\n cellValue = unpack(rows, headerValues[i]);\n cellValues[i] = cellValue;\n }\n\n // clean date\n for (i = 0; i < cellValues[0].length; i++) {\n var dateValue = cellValues[0][i].split(' ')[0]\n cellValues[0][i] = dateValue\n }\n\n // create table\n var table = {\n type: 'table',\n columnwidth: [150,200,200,150],\n columnorder: [0,1,2,3],\n header: {\n values: headerValues,\n align: \"center\",\n line: {width: 1, color: 'rgb(50, 50, 50)'},\n fill: {color: ['rgb(235, 100, 230)']},\n font: {family: \"Arial\", size: 11, color: \"white\"}\n },\n cells: {\n values: cellValues,\n align: [\"center\", \"center\"],\n line: {color: \"black\", width: 1},\n fill: {color: ['rgb(235, 193, 238)', 'rgba(228, 222, 249, 0.65)']},\n font: {family: \"Arial\", size: 10, color: [\"black\"]}\n },\n xaxis: 'x',\n yaxis: 'y',\n domain: {x: [0,0.4], y: [0,1]}\n }\n\n // create 1st plot\n var trace1 = {\n x: unpack(rows, 'Date'),\n y: unpack(rows, 'Hash-rate'),\n xaxis: 'x1',\n yaxis: 'y1',\n mode: 'lines',\n line: {width: 2, color: '#9748a1'},\n name: 'hash-rate-TH/s'\n }\n // create 2nd plot\n var trace2 = {\n x: unpack(rows, 'Date'),\n y: unpack(rows, 'Mining-revenue-USD'),\n xaxis: 'x2',\n yaxis: 'y2',\n mode: 'lines',\n line: {width: 2, color: '#b04553'},\n name: 'Mining-revenue-USD'\n }\n\n // create 3rd plot\n var trace3 = {\n x: unpack(rows, 'Date'),\n y: unpack(rows, 'Transaction-fees-BTC'),\n xaxis: 'x3',\n yaxis: 'y3',\n mode: 'lines',\n line: {width: 2, color: '#af7bbd'},\n name: 'Transaction-fees-BTC'\n }\n\n var data = [table,trace1,trace2,trace3]\n\n // define subplot axes\n var axis = {\n showline: true,\n zeroline: false,\n showgrid: true,\n mirror:true,\n ticklen: 4,\n gridcolor: '#ffffff',\n tickfont: {size: 10},\n }\n\n var axis1 = {domain: [0.5, 1], anchor: 'y1', showticklabels: false}\n var axis2 = {domain: [0.5, 1], anchor: 'y2', showticklabels: false}\n var axis3 = {domain: [0.5, 1], anchor: 'y3'}\n var axis4 = {domain: [0.66, 0.98], anchor: 'x1', hoverformat: '.2f'}\n var axis5 = {domain: [0.34, 0.64], anchor: 'x2', tickprefix: '$', hoverformat: '.2f'}\n var axis6 = {domain: [0.0, 0.32], anchor: 'x3', tickprefix: '\\u20BF', hoverformat: '.2f'}\n\n // define layout\n var layout = {\n title: {text: \"Bitcoin mining stats for 180 days\"},\n plot_bgcolor: 'rgba(228, 222, 249, 0.65)',\n showlegend: false,\n xaxis1: Object.assign(axis1,axis),\n xaxis2: Object.assign(axis2,axis),\n xaxis3: Object.assign(axis3,axis),\n yaxis1: Object.assign(axis4,axis),\n yaxis2: Object.assign(axis5,axis),\n yaxis3: Object.assign(axis6,axis)\n }\n\n Plotly.newPlot('myDiv', data, layout);\n\n});\n"}">