Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/momentjs/2.14.1/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.3/d3.min.js"></script>
<body>
<canvas width="960" height="500"></canvas>
</body>
</body>
</html>
 
#container{
        height: 500px;
    }
.kwh {
    font-family: Roboto-Regular, -apple-system, "Helvetica Neue", sans-serif;
    font-size: 19px;
    color: #9B9B9B;
    letter-spacing: 0px;
    margin-left: -12px;
}
.chart {
    height: 100%;
    margin: 30px auto 0px;
}
div.bar{
    display: inline-block;
    width: 20px;
    height: 75px;
    background-color: teal;
}
.usage-chart path{
    fill:none;
    stroke:#58D6C7;
    stroke-width: 2px;
}
g.axis path {
    stroke-width: 0;
}
#svg-bars{
        width:500px;
        margin:0 auto;
}
.axis-cost,.cost-bar{
    opacity: 0;
}
.axis-cost.on,.cost-bar.on{
    opacity: 1;
}
.area {
        fill: url(#gradient);
        fill-opacity: .2;
        clip-path: url(#clip);
}
    .zoom {
        cursor: move;
        fill: none;
        pointer-events: all;
    }
    .line {
        fill: none;
        stroke: #31B5BB;
        stroke-width: 2px;
        clip-path: url(#clip);
    }
 
var data = getData().map(function (d) {
        return d;
    });
    var canvas = document.querySelector("canvas"),
        context = canvas.getContext("2d");
    var margin = { top: 20, right: 20, bottom: 30, left: 50 },
        width = canvas.width - margin.left - margin.right,
        height = canvas.height - margin.top - margin.bottom;
    var parseTime = d3.timeParse("%d-%b-%y");
    // setup scales
    var x = d3.scaleTime()
        .range([0, width]);
    var x2 = d3.scaleTime().range([0, width]);
    var y = d3.scaleLinear()
        .range([height, 0]);
    // setup domain
    x.domain(d3.extent(data, function (d) { return moment(d.Ind, 'YYYYMM'); }));
    y.domain(d3.extent(data, function (d) { return d.KSum; }));
    // get day range
    var dayDiff = daydiff(x.domain()[0],x.domain()[1]);
    // line generator
    var line = d3.line()
        .x(function (d) { return x(moment(d.Ind, 'YYYYMM')); })
        .y(function (d) { return y(d.KSum); })
        .curve(d3.curveMonotoneX)
        .context(context);
    // zoom
    var zoom = d3.zoom()
        .scaleExtent([1, dayDiff * 12])
        .translateExtent([[0, 0], [width, height]])
        .extent([[0, 0], [width, height]])
        .on("zoom", zoomed);
    
    d3.select("canvas").call(zoom)
    context.translate(margin.left, margin.top);
    draw();
    function draw() {
        xAxis();
        yAxis();
        context.beginPath();
        line(data);
        context.lineWidth = 1.5;
        context.strokeStyle = "steelblue";
        context.stroke();
    }
    function zoomed() {
        console.log(d3.event);
        t = d3.event.transform;
        x.domain(t.rescaleX(x2).domain());
        context.save();
        context.clearRect(0, 0, width, height);
        // context.translate(d3.event.translate[0], d3.event.translate[1]);
        // context.scale(d3.event.scale, d3.event.scale);
        draw();
        context.restore();
    }
    function xAxis() {
        var tickCount = 10,
            tickSize = 6,
            ticks = x.ticks(tickCount),
            tickFormat = x.tickFormat();
        context.beginPath();
        ticks.forEach(function (d) {
            context.moveTo(x(d), height);
            context.lineTo(x(d), height + tickSize);
        });
        context.strokeStyle = "black";
        context.stroke();
        context.textAlign = "center";
        context.textBaseline = "top";
        ticks.forEach(function (d) {
            context.fillText(tickFormat(d), x(d), height + tickSize);
        });
    }
    function yAxis() {
        var tickCount = 10,
            tickSize = 6,
            tickPadding = 3,
            ticks = y.ticks(tickCount),
            tickFormat = y.tickFormat(tickCount);
        context.beginPath();
        ticks.forEach(function (d) {
            context.moveTo(0, y(d));
            context.lineTo(-6, y(d));
        });
        context.strokeStyle = "black";
        context.stroke();
        context.beginPath();
        context.moveTo(-tickSize, 0);
        context.lineTo(0.5, 0);
        context.lineTo(0.5, height);
        context.lineTo(-tickSize, height);
        context.strokeStyle = "black";
        context.stroke();
        context.textAlign = "right";
        context.textBaseline = "middle";
        ticks.forEach(function (d) {
            context.fillText(tickFormat(d), -tickSize - tickPadding, y(d));
        });
        context.save();
        context.rotate(-Math.PI / 2);
        context.textAlign = "right";
        context.textBaseline = "top";
        context.font = "bold 10px sans-serif";
        context.fillText("Price (US$)", -10, 10);
        context.restore();
    }
    function getDate(d) {
        return new Date(d.Ind);
    }
    function daydiff(first, second) {
        return Math.round((second - first) / (1000 * 60 * 60 * 24));
    }
    function getData() {
        return [
            {
                "BriteID": "BI-43dd32fe-ecbc-48d4-a8dc-e1f66110a542",
                "Ind": 201501,
                "TMin": 30.43,
                "TMax": 77.4,
                "KMin": 0.041,
                "KMax": 1.364,
                "KSum": 625.08
            },
            {
                "BriteID": "BI-43dd32fe-ecbc-48d4-a8dc-e1f66110a542",
                "Ind": 201502,
                "TMin": 35.3,
                "TMax": 81.34,
                "KMin": 0.036,
                "KMax": 1.401,
                "KSum": 542.57
            },
            {
                "BriteID": "BI-43dd32fe-ecbc-48d4-a8dc-e1f66110a542",
                "Ind": 201503,
                "TMin": 32.58,
                "TMax": 81.32,
                "KMin": 0.036,
                "KMax": 1.325,
                "KSum": 577.83
            },
            {
                "BriteID": "BI-43dd32fe-ecbc-48d4-a8dc-e1f66110a542",
                "Ind": 201504,
                "TMin": 54.54,
                "TMax": 86.55,
                "KMin": 0.036,
                "KMax": 1.587,
                "KSum": 814.62
            },
            {
                "BriteID": "BI-43dd32fe-ecbc-48d4-a8dc-e1f66110a542",
                "Ind": 201505,
                "TMin": 61.35,
                "TMax": 88.61,
                "KMin": 0.036,
                "KMax": 1.988,
                "KSum": 2429.56
            },
            {
                "BriteID": "BI-43dd32fe-ecbc-48d4-a8dc-e1f66110a542",
                "Ind": 201506,
                "TMin": 69.5,
                "TMax": 92.42,
                "KMin": 0.037,
                "KMax": 1.995,
                "KSum": 2484.93
            },
            {
                "BriteID": "BI-43dd32fe-ecbc-48d4-a8dc-e1f66110a542",
                "Ind": 201507,
                "TMin": 71.95,
                "TMax": 98.62,
                "KMin": 0.037,
                "KMax": 1.864,
                "KSum": 2062.05
            },
            {
                "BriteID": "BI-43dd32fe-ecbc-48d4-a8dc-e1f66110a542",
                "Ind": 201508,
                "TMin": 76.13,
                "TMax": 99.59,
                "KMin": 0.045,
                "KMax": 1.977,
                "KSum": 900.05
            },
            {
                "BriteID": "BI-43dd32fe-ecbc-48d4-a8dc-e1f66110a542",
                "Ind": 201509,
                "TMin": 70,
                "TMax": 91.8,
                "KMin": 0.034,
                "KMax": 1.458,
                "KSum": 401.39
            }];
    }
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
airasheedpro
0viewers