2013-06-11 24 views
6

D3'te çok satırlı bir grafik üzerinde çalışıyorum ancak işleme ile ilgili bazı sorunlar yaşıyorum. Benim veri kümesi düşünülebilir anlıyoruz x = 2'de render "satırı 1" durur0 d3 serisi verileriyle boş değerlerini doldurun

[ 
    { key:"line 1", values: [ {x:1, y:1}, {x:2, y:2} ] }, 
    { key:"line 2" , values: [ {x:1, y:1}, {x:2, y:2}, {x:3, y:3} ] } 
] 

"hat 2" sadece iyi işler, ancak: Şöyle verilerle iki satır işlemek için çalışıyorum eksik, ama x için boşluk veya boş değerlerin var olduğu varsayılan bir 0 değeri ayarlamak için bir yol olup olmadığını merak ettim? Özellikle bu örnekte, "1. satırın" y = 0 olduğunu, burada x = 3 olmasını istiyorum.

+0

Bu, JS'nin yapacağı bir şey değil, ancak nvd3.js API'sı bunu etkinleştirmek için bir ayar içerebilir. Üçüncü öğeyi ekleyebilecek bir JavaScript yazmak mümkündür, ancak önce bir ayar için nvd3 API'sini kontrol ederim. –

+0

(Çizginizi çizmek için ne kullandığınızı bize söylemediniz). Yolları çizmek için d3'ün 'd3.svg.line()' işlevini kullanıyorsanız, dizideki öğeler olduğundan daha fazla nokta çizmesini söyleyecek yerleşik bir yol yoktur. Burada oynayabilecek bir “defined()” metoduna sahiptir, ancak dizinizi önceden bu “undefined” elemanlarla doldurmanız gerekir. Ayrıca, nvd3'ün bununla başa çıkabileceğinden şüphe duyuyorum, ama kontrol etmedim. – meetamit

+1

@AndrewGibson, Şu anda boş veri noktasını doldurmak için programlı bir yaklaşımım var, ama önerdiğiniz gibi D3 API'dan kullanabileceğim bir ayar veya işlev umuyordum. Hala bulamadım ... –

cevap

2

D3 ve NVD3'ün bunu yapmak için bir işlevi yoktur. En iyi bahisten eksik olan değerleri eklemek. Bazı Underscore yardımcı programlarını kullanan bazı CoffeeScript'ler, ancak d3 aynı işlevlerin çoğuna sahipti, bu yüzden ihtiyacınız yoksa Underscore'a bağlı olmanız gerekmez. Önce alan değerlerinin listesini alırsınız, sonra eksik değerlerinizi eklersiniz.

getDomainValues ​​ yönteminde veri ve bir boyut (anahtar) alır ve etki alanı değerlerini almak için tüm değerleri alır. Eğer gibi verileri olsaydı:

key : a 
    values : [ {x: 4, y:1}, {x: 5, y:1}, {x: 7, y:1} ] 
    key : b 
    values : [ {x: 1, y:10}, {x: 2, y:5}, {x: 3, y:0} ] 

Bu döndürür:

[1,2,3,4,5,7] 


getDomainValues = (data, dimension) -> 
_.uniq _.flatten _.map data, (item) -> _.pluck(item.values, dimension) 

boyut için yöntem insertValues ​​ ekler varsayılan değerler (en sık 0) değerler dizisinde bulunmayan değerler. Boyut olarak sıralar. Eğer gibi verileri olsaydı :

key : a 
    values : [ {x: 4, y:1}, {x: 2, y:1}, {x: 1, y:1} ] 

Ve bir alan [0, 1,2,3,4,5] ve -10 değerini tedarik olsun istiyorum:

key : a 
    values : [ {x: 0, y:-10}, {x: 1, y:1}, {x: 2, y:1}, {x: 3, y:-10}, {x: 4, y:1}, {x: 5, y: -10}] 


insertValues = (data, value, dimension, metric, domain)->  
defaults = {} 
for item in domain 
    v = {} 
    v[dimension] = item 
    v[metric] = value 
    defaults[item] = v 

_.each data, (item) -> 
    vals = _.groupBy(item.values, (i) -> i[dimension]) 
    vals = _.flatten _.values _.defaults vals, defaults 
    vals = _.sortBy vals, dimension 
    item.values = vals 
data 

Yani bunun gibi onları diyebilirsiniz:

data = [ 
    { key:"line 1", values: [ {x:1, y:1}, {x:2, y:2} ] }, 
    { key:"line 2" , values: [ {x:1, y:1}, {x:2, y:2}, {x:3, y:3} ] } 
] 

domain = getDomainValues data, 'x' 
filledData = insertValues data, 0, 'x', 'y', domain 

JavaScript'te bakın: https://gist.github.com/FaKod/e6724675e4ebaf9f8fa4

+1

"Derlenmiş" insertValues ​​(...) JavaScript'e: https://gist.github.com/FaKod/e6724675e4ebaf9f8fa4 – Christopher