0

I am trying to plot a graph using D3.js. file.json is my JSON file. Date-Time should be in the X-Axis and Sales should be in Y-Axis.

This is my JSON Structure,

[

    {

        Date : "2017-12-17 18:30:01",
        Sales : "50"

    },
    {   Date : "2017-12-17 17:30:00",
        Sales : "20"

    },
    {
        Date : "2017-12-17 16:30:00",
        Sales : "10"
    }

]

I want to plot a graph Date vs number of sales. This is my JS :-

<!DOCTYPE html>
<meta charset="utf-8">
<style> 

.line {
  fill: none;
  stroke: steelblue;
  stroke-width: 2px;
}
</style>
<body>

<!-- load the d3.js library -->     
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>

d3.json("file.json", function(data) {
   var canvas = d3.select("body").append("svg")
        .attr("width", 500)
        .attr("height", 500)
        .attr("border", "black")

   var group = canvas.append("g")
        .attr("transform", "translate(100,10)")

   var line = d3.line()
        .x(function(d, i) {
            return d.Date;
        })
        .y(function(d, i) {
            return d.Sales;
        }); 

   group.selectAll("path")
        .data(data).enter()
        .append("path")
        .attr("d", function(d){ return line(d) })
        .attr("fill", "none")
        .attr("stroke", "green")
        .attr("stroke-width", 3);
});

</script>

It is showing error :- Uncaught TypeError: Cannot read property 'line' of undefined . I changed from d3.svg.line() to d3.line() , but it is now showing blank page.

4
  • 2
    You're using D3 v4. So, it should be var line = d3.line(). Commented Dec 18, 2017 at 22:01
  • 1
    Now, it is not showing anything. fill = None Commented Dec 18, 2017 at 22:03
  • 1
    And that's because you don't have scales, which is another problem. Commented Dec 18, 2017 at 22:26
  • I am trying to add scale, it is showing, Cannot read property 'linear' of undefined Commented Dec 18, 2017 at 22:30

1 Answer 1

1

Here is an example of what you might want (taken from: https://bl.ocks.org/mbostock/3883245)

var data = [
    {
        Date : "2017-12-17 18:30:01",
        Sales : "50"

    },
    {   Date : "2017-12-17 17:30:00",
        Sales : "20"

    },
    {
        Date : "2017-12-17 16:30:00",
        Sales : "10"
    }
].map(function(entry) {
  return {
    Date: d3.timeParse("%Y-%m-%d %H:%M:%S")(entry.Date),
    Sales: +entry.Sales
  }
});

var svg = d3.select("svg"),
    margin = {top: 20, right: 20, bottom: 30, left: 50},
    width = +svg.attr("width") - margin.left - margin.right,
    height = +svg.attr("height") - margin.top - margin.bottom,
    g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");

var x = d3.scaleTime()
    .rangeRound([0, width]);

var y = d3.scaleLinear()
    .rangeRound([height, 0]);

var line = d3.line()
    .x(function(d) { return x(d.Date); })
    .y(function(d) { return y(d.Sales); });

x.domain(d3.extent(data, function(d) { return d.Date; }));
y.domain(d3.extent(data, function(d) { return d.Sales; }));

g.append("g")
    .attr("transform", "translate(0," + height + ")")
    .call(d3.axisBottom(x))

g.append("g")
    .call(d3.axisLeft(y))

g.append("path")
    .datum(data)
    .attr("fill", "none")
    .attr("stroke", "steelblue")
    .attr("stroke-linejoin", "round")
    .attr("stroke-linecap", "round")
    .attr("stroke-width", 1.5)
    .attr("d", line);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.12.0/d3.min.js"></script>'

<svg width="600" height="180"></svg>

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.