2

I'm trying to make a simple line graph in D3.js loading my data from an array in Javascript.

I started from this simple example

http://bl.ocks.org/d3noob/b3ff6ae1c120eea654b5

and I'm following the suggestions in this post

D3js take data from an array instead of a file

Here you're my code

<!DOCTYPE html>
<meta charset="utf-8">
<style> /* set the CSS */

body { font: 12px Arial;}

path { 
    stroke: steelblue;
    stroke-width: 2;
    fill: none;
}

.axis path,
.axis line {
    fill: none;
    stroke: grey;
    stroke-width: 1;
    shape-rendering: crispEdges;
}

</style>
<body>

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

<script>

// Set the dimensions of the canvas / graph
var margin = {top: 30, right: 20, bottom: 30, left: 50},
    width = 600 - margin.left - margin.right,
    height = 270 - margin.top - margin.bottom;

// Parse the date / time
var parseDate = d3.time.format("%d-%b-%y").parse;

// Set the ranges
var x = d3.time.scale().range([0, width]);
var y = d3.scale.linear().range([height, 0]);

// Define the axes
var xAxis = d3.svg.axis().scale(x)
    .orient("bottom").ticks(5);

var yAxis = d3.svg.axis().scale(y)
    .orient("left").ticks(5);

// Define the line
var valueline = d3.svg.line()
    .x(function(d) { return x(d.date); })
    .y(function(d) { return y(d.close); });

// Adds the svg canvas
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 + ")");

var data = [
  {time: "01-01-2000", value:23.2},
  {time: "02-01-2000", value:22.2},
  {time: "03-01-2000", value:21.5},
  {time: "04-01-2000", value:21.2},
  {time: "05-01-2000", value:20.8},
  {time: "06-01-2000", value:21.6},
  {time: "01-02-2000", value:21.6},
  {time: "01-03-2000", value:22.0},
  {time: "01-04-2000", value:22.4},
  {time: "01-05-2000", value:23.3},
];


// Get the data
//d3.csv("data.csv", function(error, data) {
        data.forEach(function(d) {
            d.date = parseDate(d.time);
            d.close = +d.value;
        });

    // Scale the range of the data
    x.domain(d3.extent(data, function(d) { return d.time; }));
    y.domain([0, d3.max(data, function(d) { return d.value; })]);

    // Add the valueline path.
    svg.append("path")
        .attr("class", "line")
        .attr("d", valueline(data));

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

    // Add the Y Axis
    svg.append("g")
        .attr("class", "y axis")
        .call(yAxis);

//});

</script>
</body>

when I try to execute I obtain the following error in my web console

d3.v3.min.js:1 Error: <path> attribute d: Expected number, "MNaN,0.9012875536…".

Any suggestions / example will be appreciated!!!

Cesare

1 Answer 1

2

You have another date format. Try this:

var parseDate = d3.time.format("%d-%m-%Y").parse;

And use d.date instead of d.time in your x.domain:

x.domain(d3.extent(data, function(d) { return d.time; }));

Demo: https://embed.plnkr.co/SGRyjWxjReXq8ENLd4LI/

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

2 Comments

ok it's working now!!! Just another quicky question: if I need to add also hours in my time, so for example 01-01-2000-10:30:23 (gg-mm-yyyy-hh:mm.sec), what is the right format date in D3? I can change the structure of my time if necessary but I've to manage minutes and seconds .... Thank you in advance!
you can figure it out easily from d3.time.format docs

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.