JSFiddle - React, Tailwind, and code Playground

by Shashank D

CSS

body {
  font: 10px sans-serif;
}

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

JavaScript

// Generate a log-normal distribution with a median of 30 minutes.
var values = d3.range(1000).map(d3.random.logNormal(Math.log(800), .4));

// Values are in seconds.
console.log(values);

// Formatters for counts and times (converting numbers to Dates).
var formatCount = d3.format(",.0f"),
    formatTime = d3.time.format("%Mm %Ss"),
    formatMinutes = function(d) { 
        var hours = Math.floor(d / 3600),
            minutes = Math.floor((d - (hours * 3600)) / 60),
            seconds = d - (minutes * 60);
        var output = seconds + 's';
        if (minutes) {
            output = minutes + 'm ' + output;
        }
        if (hours) {
            output = hours + 'h ' + output;
        }
        return output;
    };

var margin = {top: 10, right: 30, bottom: 30, left: 30},
    width = 660 - margin.left - margin.right,
    height = 400 - margin.top - margin.bottom;

var x = d3.scale.linear()
    .domain([0, d3.max(values)])
    .range([0, width]);

var xAxis = d3.svg.axis()
    .scale(x)
    .orient("bottom")
    .tickFormat(formatMinutes)
    .tickValues(d3.range(0, d3.max(values), 600));

var svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
  .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

svg.append("g")
    .attr("class", "x axis")
    .attr("transform", "translate(0," + height/2 + ")")
    .call(xAxis);