2011-08-10 16 views
8

Javascript D3 görselleştirme araçlarıyla (http://mbostock.github.com/d3/) yapılan bazı grafikleri yürütmek için JSON verilerinin kullanımı üzerinde çalışıyorum. Ben setup benim WCF hizmetini ettik ve jQuery bu kod çalışıyor:D3 Javascript görselleştirmede JSON verilerini kullanma

$('#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 da JSON verilerini kullanarak bir işlevi vardır, ama henüz başarı olmadı. Bu şuna benzer:

// 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); 

Hemen hemen tüm kod çalışıyor D3 indir, içinde 'çubuk grafik' örnek değil. Verileri manuel olarak bildirirsem (yukarıdaki tamsayılar dizisi başına) çalışır, ancak JSON komutuyla değil. Ayrıca döndürülen verileri basitleştirdim, böylece yalnızca tamsayılardan oluşuyordu. Nihayetinde, JSON verilerine 'id alanı', 'değer alanı' vb. Ile erişmek ve bunlara kodda başvurmak isterdim.

Sözdizimimin yanlış olup olmadığı konusunda herhangi bir fikri olan var mı? Grafiğe veri eklemek için fonksiyonun (veri) kullanılmasının gerekli olduğunu anlıyorum, ancak bu örnekte kod çalışır bu yüzden bu noktadan başlamayı tercih ederim.

cevap

18

D3 çerçevenin bütünlüğü için kendi json alma işlevine sahiptir, ancak bunu kullanmak zorunda değilsiniz. D3 grafiğinizi jQuery $.getJSON ile deneyebilirsiniz ve işe yarayacaktır. Benim geliştirmemizin çoğu jQuery kullanılarak yapıldığı için yaptığım şey bu.

Örneğinizle ilgili olarak, d3.json semantikleri, tam olarak $.getJSON ile aynıdır. Veriler alındıktan sonra fonksiyonun çağrıldığı asenkron çağrıdır. Şunun gibi bir şey deneyin:

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

    }); 
+0

Merhaba! Bunun için teşekkürler. Eğer jquery versiyonunu (ilk snippet'te) kullanırsam, 'somedata' değişkeni ile bitebilirsem - değerleri 'var data = [1, 2, 3]' e benzer diziye nasıl alırdım? JSON, 'kayıt' başına iki alan içerir - ad ve değer. Peki, JSON değerlerini, grafiği tamamlamak için 'veri' ile aynı biçime nasıl koyabilirim? Üzgünüm, umarım bu mantıklıdır, açıklamaya çalışıyorum! :) – Glinkot

+0

Web hizmetiniz, [1, 2, 3] 'gibi bir şey döndürüyorsa, o zaman bu bilgi 'veri' değişkeni gibi olmalıdır. Tam olarak ne geri döndüğünüzü görmek için firebug ve 'console.log (data)' kullanın. – rmarimon

+0

jQUery örneğinizden, veriler bir "ID" ve "Value" çifti olarak alınır. Verileri bu şekilde nasıl alacağımı yansıtacak şekilde cevabı güncelledim. – rmarimon