2016-08-04 4 views
0

Jsonファイルからデータをロードし、d3js v4のキャンバスタグ内にそのラインを印刷したいとします。 同じコードがTSVファイルで動作していましたが(明らかにrequestTsvのrequestJsonが変更されています)、JSONを使用することはできません。キャンバスd3jsのJsonデータとプロットラインにアクセスできない

編集: Gerardoのおかげで、TSVがオブジェクト{x:value、y:value}で構成されていることがわかりました.Jsonは2つの配列を持つオブジェクトです。 Jsonファイルのxとy配列?

私は何かが間違ってここにあると確信している:

d3.requestJson("dato.json", function(d) { 
    d.x = +d.x; 
    d.y = +d.y; 
    return d; 
}, function(error, data) { 
    if (error) throw error; 
    x.domain(d3.extent(data, function(d) { return d.x; })); 
    y.domain(d3.extent(data, function(d) { return d.y; })); 
    context.beginPath(); 
    line(data); 
    context.lineWidth = 1.5; 
    context.strokeStyle = "steelblue"; 
    context.stroke(); 
}); 

これは、JSONファイルである:これは

<!DOCTYPE html> 
 
<meta charset="utf-8"> 
 
<canvas width="960" height="500"></canvas> 
 
<script src="//d3js.org/d3.v4.0.0-alpha.4.min.js"></script> 
 
<script> 
 

 
var canvas = document.querySelector("canvas"), 
 
    context = canvas.getContext("2d"); 
 

 
var margin = {top: 20, right: 20, bottom: 30, left: 50}, 
 
    width = canvas.width - margin.left - margin.right, 
 
    height = canvas.height - margin.top - margin.bottom; 
 

 

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

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

 
var line = d3.line() 
 
    .x(function(d) { return x(d.x); }) 
 
    .y(function(d) { return y(d.y); }) 
 
    .context(context); 
 

 
context.translate(margin.left, margin.top); 
 

 
d3.requestJson("dato.json", function(d) { 
 
    d.x = +d.x; 
 
    d.y = +d.y; 
 
    return d; 
 
}, function(error, data) { 
 
    if (error) throw error; 
 
    x.domain(d3.extent(data, function(d) { return d.x; })); 
 
    y.domain(d3.extent(data, function(d) { return d.y; })); 
 

 

 

 
    context.beginPath(); 
 
    line(data); 
 
    context.lineWidth = 1.5; 
 
    context.strokeStyle = "steelblue"; 
 
    context.stroke(); 
 
}); 
 

 

 

 

 
</script>

{ 
"chart": { 
    "y": [57, 92, 30, 91, 56, 20], 
    "x": [1,2,3,4,5,6] 
}} 

ここでは完全なコードTSVファイル:

x \t y 
 
1 \t 93.24 
 
2 \t 95.35 
 
3 \t 98.84 
 
4 \t 99.92 
 
5 \t 99.80 
 
6 \t 99.47 
 
7 \t 100.39 
 
8 \t 100.40 
 
9 \t 100.81

+2

jsonデータにはルートに 'x'プロパティがないため、' d.x = + d.x'は失敗します –

+0

Jaromandaありがとうございました。 d3で2つの配列を持つオブジェクトにどのようにアクセスできますか? –

+0

@Omar、私はd3.jsonがアクセサーを受け入れないことを確信しているにもかかわらず、私はd3.requestJsonについてはわからないが、私は検索するので私の答えを削除した。一方、私は答えを元に戻した。 –

答えて

1

次の2つの問題を抱えている、と私の答えは、ちょうど最初の1をカバーします。

function(d) { 
    d.x = +d.x; 
    d.y = +d.y; 
    return d; 
}, 

基本的に、それは数字に文字列を変更します。

まず、"data.json"function(error, data)間のすべてのこの部分は、私たちが「アクセサ」ことができるものです。しかし、ここに問題があります:d3.csvd3.tsvはアクセサを持つことができますが、d3.jsonにはにアクセサーがありません(d3.requestJsonはありません)。このすべてを削除して、コールバック内の数字に変換する必要があります。

しかし、あなたがTSVを投稿しない限り、私が助けることができない2番目の問題があります。d3.tsvd3.jsonに変更するだけでは不十分です。コードを変更したくない場合は、d3.tsvがTSVで作成する構造体と一致するJSONを作成する必要があります。これはオブジェクトの配列です(tsvバージョン、console.logデータを使用します。一致する必要があります)。今、あなたのコードは、あなたが持っているそのJSONで動作しません。

編集:

あなたがあなたの質問に共有TSVファイルに基づいて、あなたはまさにこのようにJSONを作成する必要があります。

[ 
    {"x": 1, "y": 93.24}, 
    {"x": 2, "y": 95.35}, 
    {"x": 3, "y": 98.84}, 
    ... 
] 

、オブジェクトの配列です。

+0

私はjsonから数値を取得するためにnumber()js関数を使用する必要があります: d3.requestJson( "../ file.json"、function(data){ //私は使用する必要がありますこの関数の内部のデータ }); //データはここでは動作しません 私が正しく理解していれば、私の質問は今どのように私はJson構造にアクセスできますか?私はJson構造がTSV構造よりも優れていると思うからです。 –

+0

@Omar、JSONの作成方法を解説しました。 –

関連する問題