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
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. –
(Ç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
@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 ... –