在D3 Javascript可视化中使用JSON数据

时间:2011-08-10 08:41:50

标签: javascript json wcf d3.js jsonp

我正在使用JSON数据来驱动一些使用javascript D3可视化工具(http://mbostock.github.com/d3/)制作的图表。我已经设置了我的WCF服务,这个代码在Jquery中运行正常:

$('#getDataItems').click(function () {

            var $DataList = $('#DataList');
            $DataList.empty().appendLi('Loading...');

            // Get the JsonP data
            $.getJSON('http://localhost:65025/CustomersService.svc/GetMyDataItems?callback=?', null, function (somedata) {
                alert('Received ' + somedata.length + ' Items');

                $DataList.empty();
                $.each(somedata, function () {
                    $DataList.appendLi(this.ID + " - " + this.Value);
                });  // end each dataitem function
            });  // end success function
        });  // end #getDataItems.click

D3也有使用JSON数据的功能,但我还没有成功。它看起来像这样:

// this works
//var data = [4, 8, 15, 16, 23, 42];

// this doesn't
     var data = function () {
            d3.json('http://localhost:65025/CustomersService.svc/GetMyDataItems?callback=?',
     function (data) }  })
   }

//.. rest of the example is known working code so its here only for reference

// create the chart class as an append to the body element.
var chart = d3.select("body")
    .append("svg:svg")
    .attr("class", "chart")
    .attr("width", 420)
    .attr("height", 20 * data.length);

// Set the width relative to max data value
var x = d3.scale.linear()
 .domain([0, d3.max(data)])
 .range([0, 420]);

var y = d3.scale.ordinal()
 .domain(data)
 .rangeBands([0, 120]);

chart.selectAll("rect")
 .data(data)
 .enter().append("svg:rect")
 .attr("y", y)
 .attr("width", x)
 .attr("height", y.rangeBand());

chart.selectAll("text")
 .data(data)
 .enter().append("svg:text")
 .attr("x", x)
 .attr("y", function (d) { return y(d) + y.rangeBand() / 2; })
 .attr("dx", -3) // padding-right
 .attr("dy", ".35em") // vertical-align: middle
 .attr("text-anchor", "end") // text-align: right
 .text(String);

几乎所有代码都来自D3下载中的“条形图”示例,该工作正常。如果我手动声明数据(根据上面的整数数组),它可以工作,但不能使用JSON命令。我还简化了返回的数据,因此它只包含整数。但最终,我希望能够使用“id字段”,“值字段”等访问JSON数据,并在代码中引用这些数据。

任何人对我的语法是否不正确有任何想法?我意识到函数(数据)是用来向图表添加数据的,但是这个例子中的代码是有用的,所以我更愿意从那一点开始。

1 个答案:

答案 0 :(得分:18)

D3有自己的json获取框架完整性的功能,但你不必使用它。您可以使用jQuery $.getJSON尝试d3图表,它应该可以使用。这就是我的工作,因为我的大部分开发工作都是使用jQuery完成的。

至于您的示例,d3.json语义与$.getJSON完全相同。它是异步调用,在检索数据后调用该函数。尝试这样的事情:

d3.json(
  'http://localhost:65025/CustomersService.svc/GetMyDataItems?callback=?',
  function (jsondata) {

    // create the chart here with
    // the returned data

    console.log(jsondata);

    var data = jsondata.map(function(d) { return d.Value; });
    console.log(data);

  });