简单的折线图,日期为D3

时间:2013-07-17 21:15:48

标签: javascript d3.js

我正试图掌握D3,并希望沿着x轴绘制一个简单折线图7天的演示。到目前为止,我有http://jsfiddle.net/wRDXt/1/

// Define the resolution
var width = 500;
var height = 250;    

// Create the SVG 'canvas'
var svg = d3.select("body")
    .append("svg")
    .attr("viewBox", "0 0 " + width + " " + height)

// get the data
var dataset = [
    { date: new Date(2013, 17, 1), value: 1 },
    { date: new Date(2013, 17, 2), value: 2 },
    { date: new Date(2013, 17, 3), value: 3 },
    { date: new Date(2013, 17, 4), value: 4 },
    { date: new Date(2013, 17, 5), value: 5 },
    { date: new Date(2013, 17, 6), value: 6 },
    { date: new Date(2013, 17, 7), value: 7 }
];

// Define the padding around the graph
var padding = 50;

// Set the scales

var minDate = d3.min(dataset, function(d) { return d.date; });
minDate.setDate(minDate.getDate() - 1);
var maxDate = d3.max(dataset, function(d) { return d.date; });

var xScale = d3.scale.linear()
    .domain([minDate, maxDate])
    .range([padding, width - padding]);

var yScale = d3.scale.linear()
    .domain([0, d3.max(dataset, function(d) { return d.value; })])
    .range([height - padding, padding]);

// x-axis
var xAxis = d3.svg.axis()
    .scale(xScale)
    .orient("bottom")
    .tickFormat("todo")
    .tickSize(5, 5, 0)

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

// y-axis
var yAxis = d3.svg.axis()
    .scale(yScale)
    .orient("left")
    .tickFormat(function (d) { return d; })
    .tickSize(5, 5, 0)
    .ticks(5); // set rough # of ticks

svg.append("g")
    .attr("class", "axis y-axis")
    .attr("transform", "translate(" + padding + ",0)")
    .call(yAxis);

// Scatter plot
svg.selectAll("circle")
    .data(dataset)
    .enter()
    .append("circle")
    .attr("class", "data-point")
    .attr("cx", function(d) {
        return xScale(d.date);
    })
    .attr("cy", function(d) {
        return yScale(d.value);
    })
    .attr("r", 5);

// line graph
var line = d3.svg.line()
    .x(function(d) { 
        return xScale(d.date); 
    })
    .y(function(d) { 
        return yScale(d.value); 
    });

svg.append("svg:path").attr("d", line(dataset));

我遇到了一些问题:

  • 如何让x轴每天显示一个刻度线(我希望每个刻度线与数据点匹配并与之对齐)
  • 由于某种原因(如多边形?
  • ),线图位正在填充
  • 如何很好地格式化轴上的刻度文本,这就像“1 JUL”,“2 JUL”等
  • 如何让第一个日期值显示在第一个刻度而不是y轴上 - 我尝试从minDate中抽出一天,但是它会影响到你可以看到的情节

1 个答案:

答案 0 :(得分:5)

我已经更新了你的jsfiddle来做你想做的事情here。简单地说,我做了以下事情:

  • 使用时间刻度而不是线性刻度。然后,您可以将d3.time.days, 1指定为ticks
  • 默认情况下填充路径,不显示笔划。查看我添加的CSS。
  • 使用适当格式的.tickFormat功能。
  • 应使用时间刻度和适当的刻度规格来修复。