JSFiddle - React, Tailwind, and code Playground

by chrisloughnane

HTML

<script src="http://mbostock.github.com/d3/d3.v2.js"></script>

CSS

.axis text {
  font: 10px sans-serif;
}
.axis path, .axis line {
  fill: none;
  stroke: #000;
  shape-rendering: crispEdges;
}

JavaScript

function barStack(d) {
    var l = d[0].length
    while (l--) {
        var posBase = 0, negBase = 0;
        d.forEach(function(d) {
            d=d[l]
            d.size = Math.abs(d.y)
            if (d.y<0)  {
                d.y0 = negBase
                negBase-=d.size
            } else
            { 
                d.y0 = posBase = posBase + d.size
            } 
        })
    }
    d.extent= d3.extent(d3.merge(d3.merge(d.map(function(e) { return e.map(function(f) { return [f.y0,f.y0-f.size]})}))))
    return d
}



var data = [[{x:1,y:3},{x:2,y:6},{x:3,y:3}],
            [{x:1,y:4},{x:2,y:2},{x:3,y:9}],
            [{x:1,y:10},{x:2,y:3},{x:3,y:4}]]


var  h=500
    ,w=500
    ,margin=10
    ,color = d3.scale.category10()

    ,x = d3.scale.ordinal()
        .domain(d3.range(data[0].length+1))
        .rangeRoundBands([margin,w-margin], .1)

    ,y = d3.scale.linear()
        .range([h-margin,0+margin])

    ,xAxis = d3.svg.axis().scale(x).orient("bottom").tickSize(6, 0)
    ,yAxis = d3.svg.axis().scale(y).orient("left")

barStack(data)
y.domain(data.extent)


svg = d3.select("body")
    .append("svg")
    .attr("height",h)
    .attr("width",w)

svg.selectAll(".series").data(data)
    .enter().append("g").classed("series",true).style("fill", function(d,i) { return color(i)})
        .selectAll("rect").data(Object)
        .enter().append("rect")
            
svg.append("g").attr("class","axis x")
svg.append("g").attr("class","axis y")


var layout = 0,dur=0
redraw()
dur = 1500


function redraw() {
    if (layout=!layout) {
        /* Readjust the range to witdh and height */
        x.rangeRoundBands([margin,w-margin], .1)
        y.range([h-margin,0+margin])
        
        /* Reposition and redraw axis */
        svg.select(".x.axis")
            .transition().duration(dur)
            .attr("transform","translate (0 "+y(0)+")")
            .call(xAxis.orient("bottom"))
        svg.select(".y.axis")
            .transition().duration(dur)
        ...