Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
78 views
in Technique[技术] by (71.8m points)

javascript - dealing with dates on d3.js axis

How do I make my line x-axis based on date in d3.js?

I am attempting to teach myself how to use d3.js. I've been looking at the examples that come with it and have been attempting to recreate the line graph using json delivered data. I'm able to feed the data into the line graph, but the x-axis is supposed to be a date instead of a number. The date format that I'm using is MM/DD/YY, but the graph plots everything at 0. My json data is coming across fine, but I'm having trouble figuring out how to plot the x coordinates. This was taken straight from the line.js that comes in the d3.js examples folder when downloaded. The date portion doesn't do the trick. I'm hoping someone can point me to an example or be able to explain how I can make it work.

d3.json('jsonChartData.action',
  function (data) {
    console.log(data);

    var w = 450,
    h = 275,
    p = 30,
    x = d3.scale.linear().domain([0, 100]).range([0, w]),
    y = d3.scale.linear().domain([0, 100]).range([h, 0]);

    var vis = d3.select("body")
    .data([data])
    .append("svg:svg")
    .attr("width", w + p * 2)
    .attr("height", h + p * 2)
    .append("svg:g")
    .attr("transform", "translate(" + p + "," + p + ")");

    var rules = vis.selectAll("g.rule")
    .data(x.ticks(5))
    .enter().append("svg:g")
    .attr("class", "rule");

    rules.append("svg:line")
    .attr("x1", x)
    .attr("x2", x)
    .attr("y1", 0)
    .attr("y2", h - 1);

    rules.append("svg:line")
    .attr("class", function(d) { return d ? null : "axis"; })
    .attr("y1", y)
    .attr("y2", y)
    .attr("x1", 0)
    .attr("x2", w + 1);

    rules.append("svg:text")
    .attr("x", x)
    .attr("y", h + 3)
    .attr("dy", ".71em")
    .attr("text-anchor", "middle")
    .text(x.tickFormat(10));

    rules.append("svg:text")
    .attr("y", y)
    .attr("x", -3)
    .attr("dy", ".35em")
    .attr("text-anchor", "end")
    .text(y.tickFormat(10));

    vis.append("svg:path")
    .attr("class", "line")
    .attr("d", d3.svg.line()
    .x(function(d) { return x(d3.time.days(new Date(d.jsonDate))); })
    .y(function(d) { return y(d.jsonHitCount); }));

    vis.selectAll("circle.line")
    .data(data)
    .enter().append("svg:circle")
    .attr("class", "line")
    .attr("cx", function(d) { return x(d3.time.days(new Date(d.jsonDate))); })
    .attr("cy", function(d) { return y(d.jsonHitCount); })
    .attr("r", 3.5);
  });

JSON as printed out by my action:

[{"jsonDate":"09/22/11","jsonHitCount":2,"seriesKey":"Website Usage"},`{"jsonDate":"09/26/11","jsonHitCount":9,"seriesKey":"Website Usage"},{"jsonDate":"09/27/11","jsonHitCount":9,"seriesKey":"Website Usage"},{"jsonDate":"09/29/11","jsonHitCount":26,"seriesKey":"Website Usage"},{"jsonDate":"09/30/11","jsonHitCount":2,"seriesKey":"Website Usage"},{"jsonDate":"10/03/11","jsonHitCount":3,"seriesKey":"Website Usage"},{"jsonDate":"10/06/11","jsonHitCount":2,"seriesKey":"Website Usage"},{"jsonDate":"10/11/11","jsonHitCount":2,"seriesKey":"Website Usage"},{"jsonDate":"10/12/11","jsonHitCount":2,"seriesKey":"Website Usage"},{"jsonDate":"10/13/11","jsonHitCount":1,"seriesKey":"Website Usage"},{"jsonDate":"10/14/11","jsonHitCount":5,"seriesKey":"Website Usage"},{"jsonDate":"10/17/11","jsonHitCount":2,"seriesKey":"Website Usage"},{"jsonDate":"10/18/11","jsonHitCount":6,"seriesKey":"Website Usage"},{"jsonDate":"10/19/11","jsonHitCount":8,"seriesKey":"Website Usage"},{"jsonDate":"10/20/11","jsonHitCount":2,"seriesKey":"Website Usage"},{"jsonDate":"10/21/11","jsonHitCount":4,"seriesKey":"Website Usage"},{"jsonDate":"10/24/11","jsonHitCount":1,"seriesKey":"Website Usage"},{"jsonDate":"10/25/11","jsonHitCount":1,"seriesKey":"Website Usage"},{"jsonDate":"10/27/11","jsonHitCount":3,"seriesKey":"Website Usage"},{"jsonDate":"11/01/11","jsonHitCount":2,"seriesKey":"Website Usage"},{"jsonDate":"11/02/11","jsonHitCount":1,"seriesKey":"Website Usage"},{"jsonDate":"11/03/11","jsonHitCount":2,"seriesKey":"Website Usage"},{"jsonDate":"11/04/11","jsonHitCount":37,"seriesKey":"Website Usage"},{"jsonDate":"11/08/11","jsonHitCount":1,"seriesKey":"Website Usage"},{"jsonDate":"11/10/11","jsonHitCount":39,"seriesKey":"Website Usage"},{"jsonDate":"11/11/11","jsonHitCount":1,"seriesKey":"Website Usage"},{"jsonDate":"11/14/11","jsonHitCount":15,"seriesKey":"Website Usage"},{"jsonDate":"11/15/11","jsonHitCount":2,"seriesKey":"Website Usage"},{"jsonDate":"11/16/11","jsonHitCount":5,"seriesKey":"Website Usage"},{"jsonDate":"11/17/11","jsonHitCount":4,"seriesKey":"Website Usage"},{"jsonDate":"11/21/11","jsonHitCount":2,"seriesKey":"Website Usage"},{"jsonDate":"11/22/11","jsonHitCount":3,"seriesKey":"Website Usage"},{"jsonDate":"11/23/11","jsonHitCount":11,"seriesKey":"Website Usage"},{"jsonDate":"11/24/11","jsonHitCount":2,"seriesKey":"Website Usage"},{"jsonDate":"11/25/11","jsonHitCount":1,"seriesKey":"Website Usage"},{"jsonDate":"11/28/11","jsonHitCount":10,"seriesKey":"Website Usage"},{"jsonDate":"11/29/11","jsonHitCount":3,"seriesKey":"Website Usage"}]`
question from:https://stackoverflow.com/questions/8301531/dealing-with-dates-on-d3-js-axis

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You're trying to use d3.scale.linear() for dates, and that won't work. You need to use d3.time.scale() instead (docs):

// helper function
function getDate(d) {
    return new Date(d.jsonDate);
}

// get max and min dates - this assumes data is sorted
var minDate = getDate(data[0]),
    maxDate = getDate(data[data.length-1]);

var x = d3.time.scale().domain([minDate, maxDate]).range([0, w]);

Then you don't need to deal with the time interval functions, you can just pass x a date:

.attr("d", d3.svg.line()
    .x(function(d) { return x(getDate(d)) })
    .y(function(d) { return y(d.jsonHitCount) })
);

Working fiddle here: http://jsfiddle.net/nrabinowitz/JTrnC/


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

56.9k users

...