Barchart Example using d3.chart

by hiral

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3.chart/0.2.1/d3.chart.js"></script>
<script src="https://code.jquery.com/jquery-2.2.3.min.js"></script>
<button>Save</button>
<div id="vis"></div>
<div id="svgdataurl"></div>
<canvas id="pngdataurl"></canvas>

CSS

.bar {
  fill: steelblue;
}

.bar:hover {
  fill: brown;
}

.axis {
  font: 10px sans-serif;
}

.axis path,
.axis line {
  fill: none;
  stroke: #000;
  shape-rendering: crispEdges;
}

.x.axis path {
  display: none;
}

JavaScript

$('button').click(function(){
  var html = d3.select("svg")
        .attr("version", 1.1)
        .attr("xmlns", "http://www.w3.org/2000/svg")
        .node().parentNode.innerHTML;

  //console.log(html);
  var imgsrc = 'data:image/svg+xml;base64,'+ btoa(html);
  var img = '<img src="'+imgsrc+'">'; 
  d3.select("#svgdataurl").html(img);
});
d3.chart('BarChart', {

  initialize: function() {
    var chart = this;

    // chart margins to account for labels.
    // we may want to have setters for this.
    // not sure how necessary that is tbh.
    chart.margins = {
      top : 10,
      bottom : 15,
      left : 50,
      right : 0,
      padding : 10
    };

    // default chart ranges
    chart.x =  d3.scale.linear();
    chart.y = d3.scale.linear();

    chart.base
      .classed('Barchart', true);

    // non data driven areas (as in not to be independatly drawn)
    chart.areas = {};

    // cache for selections that are layer bases.
    chart.layers = {};

    // make sections for labels and main area
    //  _________________
    // |Y|    bars      |
    // | |              |
    // | |              |
    // | |              |
    // | |______________|
    //   |      X       |

    // -- areas
    chart.areas.ylabels = chart.base.append('g')
      .classed('ylabels', true)
      .attr('width', chart.margins.left)
      .attr('transform',
        'translate('+(chart.margins.left-1)+','+(chart.margins.top + 1)+')');

    // -- actual layers
    chart.layers.bars = chart.base.append('g')
      .classed('bars', true)
      .attr('transform',
        'translate(' + chart.margins.left + ',' + (chart.margins.top + 1)+')');

    chart.layers.xlabels = chart.base.append('g')
      .classed('xlabels', true)
      .attr('height', chart.margins.bottom);

    chart.on("change:width", function() {
      chart.x.range([0, chart.w - chart.margins.left]);
      chart.layers.bars.attr('width', chart.w - chart.margins.left);
      chart.layers.xlabels.attr('width', chart.w...