Использование данных JSON в визуализации D3 Javascript
Я работаю с использованием данных 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. Я также упростил возвращаемые данные, так что они состояли только из целых чисел. В конечном счете, я хотел бы иметь доступ к данным JSON с "полем id", "полем значения" и т. д. и ссылаться на них в коде.
кто-нибудь есть идеи о том, Мой синтаксис неправильный? Я понимаю, что функция (данные) предназначена для добавления данных в диаграмму, но код в этом примере работает, поэтому я бы предпочел начать с этого точка.
1 ответов
D3 имеет свою собственную функцию получения json для полноты структуры, но вам не нужно ее использовать. Вы можете попробовать свою диаграмму d3 с помощью jQuery $.getJSON
и это должно работать. Это то, что я делаю, так как большая часть моей разработки выполняется с помощью 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);
});