2016-08-04 67 views
0

我想从Json文件中加载数据,然后用d3js v4在canvas标签内打印行。 相同的代码与TSV文件(显然改变requestTsv中的requestJson)一起工作,但我无法设法使它与JSON一起工作。Can not acces Json data and plot line on canvas d3js

编辑: 感谢Gerardo我知道文件是不同的,因为TSV由objects {x:value,y:value}组成,并且Json是一个具有两个数组的对象,我如何访问里面的数据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文件:

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

这里全码:

<!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>
这是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中的两个数组的对象? –

+0

@Omar,我删除了我的答案,因为尽管确定d3.json不接受访问者,但我不确定d3.requestJson,但我会搜索。同时,我放弃了答案。 –

回答

1

你有两个问题,我的回答将覆盖只是第一个。

首先,"data.json"function(error, data)之间的所有这部分是我们可以在“访问”:

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

基本上,它改变字符串的数字。但这里是问题:d3.csvd3.tsv可以有访问者,但d3.json不能有一个访问者(都不d3.requestJson)。你必须删除所有这些,并将字符串转换为回调中的数字。

但你有第二个问题,我不能帮助(除非你发布你的TSV):改变d3.tsvd3.json是不够的。如果您不想更改代码,则必须创建一个JSON,该JSON与d3.tsv创建的TSV结构相匹配,TSV是一个对象数组(使用tsv版本,console.log数据:这就是您的结构必须匹配)。现在,您的代码将无法使用您拥有的JSON。

编辑:

根据您对您的问题分享了TSV文件,你必须精确地创建一个JSON是这样的:

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

也就是说,对象的数组。

+0

所以我必须使用number()js函数从json获取数字,并执行如下操作: d3.requestJson(“../ file.json”,function(data){ //我必须使用这里的数据在这个函数里面 }); //这里的数据将不起作用 如果我理解正确,我现在的问题是如何访问Json结构?因为我认为Json结构比TSV结构更好。 –

+0

@Omar,我编辑了答案,向您展示了如何创建JSON。 –