2013-06-11 3 views
6

D3のマルチラインチャートで作業していますが、レンダリングに問題があります。私は私のデータセットが考えられるかもしれないことを理解し、X = 2でレンダリングする「ライン1」に停止を0 d3系列データでヌル値を入力

[ 
    { 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} ] } 
] 

「ライン2」うまくレンダリングしますが、私はこのようになりますデータを持つ2本のラインを描画しようとしています不完全ですが、xの空白やヌル値がある場合にデフォルト値0を設定する方法があるのであれば私は興味がありましたか?具体的には、この例では、「行1」にy = 0(x = 3)を表示します。

+0

これはJSが行うものではありませんが、nvd3.js APIにはこれを有効にする設定が含まれている場合があります。 3番目の要素を挿入するJavaScriptを記述することは可能ですが、まずnvd3 APIで設定を確認します。 –

+0

(あなたのラインを描くために使用しているものは教えていない) d3の 'd3.svg.line()'関数を使用してパスを描画している場合は、配列内の要素よりも多くの点を描画するように組み込みの方法はありません。ここには 'defined()'メソッドがありますが、事前に定義されていない要素で配列を埋める必要があります。私はまた、nvd3がこれを処理する何かを持っているが、チェックしていないことを疑う。 – meetamit

+1

@AndrewGibson、私は現在、nullデータポイントを埋めるためのプログラム的なアプローチを持っていますが、あなたが示唆したようにD3 APIから使用できる設定や関数を期待していました。まだそれを見つけることがまだありません... –

答えて

2

D3とNVD3にはこれを行う機能がありません。あなたの最善の策はあなたの欠けている値を挿入することです。いくつかのUnderscoreユーティリティを使用するCoffeeScriptでもd3には同じ機能が多数あるため、必要がない場合はUnderscoreに依存する必要はありません。最初にドメイン値のリストを取得し、欠損値を挿入します。

メソッドgetDomainValuesは、データと次元(キー)を取り込み、すべての値を取得して一連のドメイン値を取得します。あなたのようなデータを持っていた場合:

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} ] 

をそれは返します:

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


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

次元のための方法insertValues挿入のデフォルト値(最も一般的に0を) values配列に存在しない値。次元別にソートします。あなたのようなデータがあった場合 :

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

をし、ドメイン[0、1,2,3,4,5] -10の値を与え、あなたは取得したい:

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 

だから、このようにそれらを呼ぶかもしれない:

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で表示:https://gist.github.com/FaKod/e6724675e4ebaf9f8fa4

+1

JavaScriptへのinsertValues(...)のコンパイル:https://gist.github.com/FaKod/e6724675e4ebaf9f8fa4 – Christopher