2016-04-25 10 views
0

私はD3折れ線グラフの例をとり、ローカルデータを使用して実行するためにわずかに変更しました。私はdata.tsv()をコメントアウトし、var data配列のdata.forEach()に置き換えました。これは同じことを達成するはずです。D3折れ線グラフの例 - 日付に問題がある

私は線グラフと日付に問題があったので、この例を試しています。私はラインの中にNaNのロットをつけてしまいます。

私の現在のバージョンは単純で、x = 0(軸上)に誤って縦線を描いています。 SVGのパスは次のとおりです。

<path class="line" 
d="M0,450 
L0,307.85928143712596 
L0,72.7544910179639 
L0,0 
L0,8.083832335329655 
L0,30.314371257485206"></path> 

私は何が間違っているのか分かりません。私は単に、データ配列の5点をグラフにしたいと思います。私はおそらく、それが指摘されたときに頭を叩く原因となる構文エラーがあることを理解していますが、それ以上の点では、D3が時間ベースのデータから何を求めているのか分かりません。 D3が日付データに必要なタイプは何ですか?time.format.parse()はjavascriptの日付パーサーと何を比較しますか?なぜ1つを使用し、他は使用しないのですか?いつNaNリターンと0を得るのですか?

ここに私のコードは次のとおりです。私はそれフィドル作っなど任意の助け

<!DOCTYPE html> 
<head> 
    <meta charset="utf-8" /> 
    <title>LGTest</title> 
</head> 
<style> 
    body { 
     font: 10px sans-serif; 
    } 

    .axis path, 
    .axis line { 
     fill: none; 
     stroke: #000; 
     shape-rendering: crispEdges; 
    } 

    .x.axis path { 
     display: none; 
    } 

    .line { 
     fill: none; 
     stroke: steelblue; 
     stroke-width: 1.5px; 
    } 
</style> 
<body> 
    <script src="d3.min.js"></script> 
<script> 
    var data = [ 
     { date: "24-Apr-07", close: 93.24 }, 
     { date: "25-Apr-07", close: 95.35 }, 
     { date: "26-Apr-07", close: 98.84 }, 
     { date: "27-Apr-07", close: 99.92 }, 
     { date: "30-Apr-07", close: 99.80 }, 
     { date: "1-May-07", close: 99.47 } 
    ]; 
var margin = {top: 20, right: 20, bottom: 30, left: 50}, 
    width = 960 - margin.left - margin.right, 
    height = 500 - margin.top - margin.bottom; 

var formatDate = d3.time.format("%e-%b-%y"); 

data.forEach(function (d) { d = type(d) }); 


var x = d3.time.scale() 
    .range([0, width]); 

var y = d3.scale.linear() 
    .range([height, 0]); 

var xAxis = d3.svg.axis() 
    .scale(x) 
    .orient("bottom"); 

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

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

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 + ")"); 

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

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

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

    svg.append("g") 
     .attr("class", "y axis") 
     .call(yAxis) 
    .append("text") 
     .attr("transform", "rotate(-90)") 
     .attr("y", 6) 
     .attr("dy", ".71em") 
     .style("text-anchor", "end") 
     .text("Price ($)"); 

    svg.append("path") 
     .datum(data) 
     .attr("class", "line") 
     .attr("d", line); 
//}); 

    function type(d) { 
     d.date = formatDate.parse(d.date); 
     d.close = +d.close; 
    return d; 
} 

</script> 
</body> 

おかげで、アドバイス、remonstrations、

+0

私はそれフィドル作られ、ここでの問題は何でしょうか。 https://jsfiddle.net/xcn35ycm/5/ – echonax

+0

うわー。それはjsfiddleでそれを行う素晴らしいアイデアです - それは私のマシン上とは異なる結果ですがそこで動作します!私はそれがそれに影響を与えるかどうかを確認するために使用しているd3ライブラリを更新します。 –

+0

私はそれを答えるようにして、そこから更新できるようにします。 – echonax

答えて

2

。それはうまくいっているようだが、ここで何が問題なの?

が、私はこれらのデータを使用:

var data = [ 
     { date: "24-Apr-07", close: 93.24 }, 
     { date: "25-Apr-07", close: 95.35 }, 
     { date: "26-Apr-07", close: 98.84 }, 
     { date: "27-Apr-07", close: 99.92 }, 
     { date: "30-Apr-07", close: 99.80 }, 
     { date: "1-May-07", close: 99.47 } 
    ]; 

https://jsfiddle.net/xcn35ycm/5/

+0

私のコードからスタイルを削除しました。これは、私の例とjsFiddleの唯一の違いです。私がそれをしたら、それは働いた。だから、必ずしも私が日付を理解しているわけではありません、私はd3レンダリングにスタイルとCSSの効果を理解していません。 これは私にとって重要なことですので、レッスンに感謝します! –

+0

jsfiddleはこれらの種類のもののためのすばらしいデバッグツールです。お役に立てて嬉しいです – echonax

関連する問題