2016-08-02 33 views
0

我正在嘗試將this chart轉換爲 D3多行圖表,我忽略了使用Highcharts的樣式。如何將此D3多系列折線圖x軸轉換爲使用連續數字而不是日期值?

這是d3 viz的代碼。

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

.axis--x path { 
    display: none; 
} 

.line { 
    fill: none; 
    stroke: steelblue; 
    stroke-width: 1.5px; 
} 

</style> 
<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.scaleTime().range([0, width]), 
    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.temperature); }); 

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

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

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

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

    z.domain(cities.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("Temperature, ºF"); 

    var city = g.selectAll(".city") 
    .data(cities) 
    .enter().append("g") 
    .attr("class", "city"); 

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

    city.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.temperature) + ")"; }) 
     .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; 
} 

</script> 

我想保持在TSV的數據,只是使用日期用在Highchart系列看到的原始數據轉換爲x軸。所以不是城市,日期和溫度,它會成爲連擊數,遊戲數量和重擊比例。我也想讓它結束,就像在Highchart例子中那樣,一旦沒有對應的值,線條就會下降到0。如果我能夠保持懸停效果也是很好的Highchart示例。

不幸的是,我不知道如何實現這一點。我知道我必須使用與當前腳本中的parseTime函數不同的函數,但這大概就我所知。

回答

1

你的規模更改爲:

var x = d3.scaleLinear().range([0, width]) 

不要解析爲一個日期:

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

}

相關問題