2012-07-04 29 views
7

Şu anda d3.js.I kütüphanesi üzerinde çalışma yapıyorum Dynamic Line Graph ile çizgi grafiğimiz var Burada, doğrusal ve çizim gücü çizim seçeneğine sahibiz. Ama benim sorunum, veri kümemde bazı değerlerin sıfır olması ve kodun çizim yapamaması için log 0 undefined olması. İşte benim kodunda ölçekli buD3.js kullanarak grafikte sıfırdan nasıl sakınılır

y = d3.scale.log().domain([0.1, max_y _value]).range([h, 0]).nice(); 

gibi ayarlanır ve bu

lineFunction = d3.svg.line() 
     .y(function(d) { 
      return y(d); 
     }); 

Ben onun bir tek question.But ben günlüğü işleyebilir hangi bir yolu olduğunu biliyoruz

nasıl kullanıldığını ise 0 değeri, eğer tek bir sıfır değerine sahip olursam, geri kalanı doğru şekilde çizilir. Eğer y eksenine nasıl bağlanacağından daha doğruysa, iki deyim ve aynı deyimde (0 değerini işlemek için) aralık verebilir miyim?

Yardımlarınız için teşekkür ederiz.

cevap

12

clamp işlevini kullanarak sorunumu çözdüm. Bu benim kod nasıl değiştiğini geçerli:

y = d3.scale.log().clamp(true).domain([0.1, max_y _value]).range([h, 0]).nice(); 
2

sizin için çalışmaz 0 logaritmik ölçek olarak etki alanı sınırları birine sahip bir alan adınız varsa. Ayrıca, günlük ölçeği, belirlenemeyen sayıda keneye sahip bir tick() işlevi sağlar.

Geçerli atamam, doğrusal ölçeklendirilmiş dağılım grafiğinde rastgele etki alanları ve aralıklar içeren verileri görüntülemektir. AMA isteğe bağlı olarak kullanıcı logaritmik skalada değişebilir. Bu sorunlu [0, n] ve [n, 0] alanlarını içerir.

İşte ben bu davalarına bakacak ile geldi bir çözüm: pozitif sınırları olan keyfi bir aralığa Domainimizin proje doğrusal ölçek kullanıyorsanız sorun önlenebilir . [1,10] 'u seçiyorum ama herhangi bir pozitif sayı alabilir. Bundan sonra normal log ölçeği kullanabiliriz.

d3.scale.genericLog = function() { 
    return GenericLog(); 
}; 
function GenericLog() { 
    var PROJECTION=[1,10]; 
    var linearScale, logScale; 

    linearScale=d3.scale.linear(); 
    linearScale.range(PROJECTION); 

    logScale=d3.scale.log(); 
    logScale.domain(PROJECTION); 

    function scale(x) { 
     return logScale(linearScale(x)); 
    } 
    scale.domain = function(x) { 
     if (!arguments.length) return linearScale.domain(); 
     linearScale.domain(x); 
     return scale; 
    }; 
    scale.range = function(x) { 
     if (!arguments.length) return logScale.range(); 
     logScale.range(x); 
     return scale; 
    }; 
    scale.ticks = function(m) { 
     return linearScale.ticks(m); 
    }; 
    return scale; 

} 

Kullanımı: Sadece aralık(), ölçek(), işlevleri ben sadece bu dahil böylece) (keneler ama hepsi uygulamak için 5 dakikadan fazla sürmemelidir gerekli

var scale1 = d3.scale.genericLog().domain([0,1]).range([500,1000]); 
var scale2 = d3.scale.genericLog().domain([-10,0]).range([500,1000]); 
scale1(0) //500 
scale2(-10) //500 
scale2(0) //100 

diğerleri. Ayrıca, lineer skaladaki() değerleri kullanıyorum çünkü kenelerin sayısını sınırlamak zorunda kaldım ve bu da lineer skala ile daha kolay.

DÜZENLEME: Eğer bu sizin günlük ölçeği bozar PROJEKSİYON olarak ne seçtiğinize bağlı be farkında. Kullandığınız daha geniş aralık, ölçeğinizin alt kısmını daha fazla koruyacaktır.