2016-11-17 69 views
0

我在d3.js中实现了多个系列折线图,下面是该块的示例:http://bl.ocks.org/mbostock/3884955。但是,X轴不显示。 X轴应显示日期。这里是我的代码:使用d3.js不在多系列折线图上显示X轴

<svg width="960" height="500"></svg> 
<script src="//d3js.org/d3.v4.min.js"></script> 
<script> 

var svg = d3.select("svg"), 
    margin = {top: 20, right: 80, 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 parseTime = d3.timeParse("%Y%m%d"); 

var x = d3.scaleBand().rangeRound([0, width]), 
    // xAxis = d3.svg.axis().scale(x).orient("bottom"), 
    y = d3.scaleLinear().range([height, 0]), 
    z = d3.scaleOrdinal(d3.schemeCategory10); 

var line = d3.line() 
    .curve(d3.curveBasis) 
    .x(function(d) { return x(d.date); }) 
    .y(function(d) { return y(d.price); }); 

d3.tsv("data.tsv", type, function(error, data) { 
    if (error) throw error; 

    var products = data.columns.slice(1).map(function(id) { 
    return { 
     id: id, 
     values: data.map(function(d) { 
     return {date: d.date, price: d[id]}; 
     }) 
    }; 
    }); 

    x.domain(data.map(function(d) { return d.date; })); 

    y.domain([ 
    d3.min(products, function(c) { return d3.min(c.values, function(d) { return d.price; }); }), 
    d3.max(products, function(c) { return d3.max(c.values, function(d) { return d.price; }); }) 
    ]); 

    z.domain(products.map(function(c) { return c.id; })); 

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

    g.append("g") 
     .attr("class", "axis axis--y") 
     .call(d3.axisLeft(y)) 
    .append("text") 
     .attr("transform", "rotate(-90)") 
     .attr("y", 6) 
     .attr("dy", "0.71em") 
     .attr("fill", "#000") 
     .text("Price $"); 

    var product = g.selectAll(".product") 
    .data(products) 
    .enter().append("g") 
     .attr("class", "product"); 

    product.append("path") 
     .attr("class", "line") 
     .attr("d", function(d) { return line(d.values); }) 
     .style("stroke", function(d) { return z(d.id); }); 

    product.append("text") 
     .datum(function(d) { return {id: d.id, value: d.values[d.values.length - 1]}; }) 
     .attr("transform", function(d) { return "translate(" + x(d.value.date) + "," + y(d.value.price) + ")"; }) 
     .attr("x", 3) 
     .attr("dy", "0.35em") 
     .style("font", "10px sans-serif") 
     .text(function(d) { return d.id; }); 
}); 

function type(d, _, columns) { 
    d.date = parseTime(d.date); 
    for (var i = 1, n = columns.length, c; i < n; ++i) d[c = columns[i]] = +d[c]; 
    return d; 
} 

这里是我的代码生成的图表: - http://bizvizmap.com/timeseries.html

回答

0

你可能在你的数据的一些问题,因为这plunker有正是你的代码,用一些假的数据我创建:

date,foo,bar,baz 
20160101,11,23,45 
20160102,21,22,35 
20160103,44,76,54 
20160104,31,23,45 
20160105,41,63,15 
20160106,12,22,25 

这里是plunker:在https://plnkr.co/edit/xZY02zVTEh6o9RwNGJBw?p=preview

蜱x轴是一团糟,因为你正在按顺序使用完整的JS日期。正因为如此,使用时间尺度更有意义,因为在这个其他的跳板中:https://plnkr.co/edit/n5u8N9aK8YELtTCHexgR?p=preview

+0

它工作。如前所述,问题出在我的数据上。我正在使用TSV。切换到CSV解决了问题。我不知道序数量级会导致日期的混乱。感谢您抽出宝贵的时间来创建强盗。很有帮助。 – Jonah