2017-01-02 10 views
0

この中でfiddleストロークの色を変更するにはどうすればよいですか?ストロークの色を定義する方法

私はこのコードを試してみましたが、それは、色変更されません:

var colors = ["#F0E5FF","#E1CCFF","#C499FF","#AC79F2","#8D4CE5","#6100E5","#C94D8C"]; 

var colorScaleDomain = [100, 300, 1000, 10000, 50000, 600000]; 

var colorScale = d3.scale.threshold() 
    .domain(colorScaleDomain) 
    .range(colors); 

link.style("stroke", function(d){ 
    return colorScale(d[0].size) 
}); 

私のコードで間違って何を?

+0

あなたのコードでは、次のようになります:https://jsfiddle.net/mkaran/om8tqotp/ d3.scale.ordinal()https://jsfiddle.net/mkaran/6qvjep7r /。私はあなたが与えているカラースケール領域が広すぎると信じていますので、d [0] .sizeは1つのカテゴリに分類され、したがって1つの色しか与えません。 [300,500,1000,1300,1800,2000,5000,10000,13000,18000,20000] https://jsfiddle.net/mkaran/gLvnm0pf/ – mkaran

+0

@mkaran:そうです、ドメインをより良く調整してみてください。私の実際のデータセットははるかに大きいからです。あなたは答えを投稿できますか? – Dinosaurius

+0

@mkaran:私はやや不愉快で、一つのこと。 'var colors = ["#9EDAE5 "、"#6100E5 "、"#C94D8C "];' var colorScaleDomain = [300、1000,20000] 'ならば、' 300'より小さい 'size'を持つ全てのエントリは色「#9EDAE5」を持っていますか? – Dinosaurius

答えて

3

この問題は、データの「サイズ」属性に関してcolorScaleDomainがどのように選択されるかにあります。現在の方法では、多くの値が1つのカテゴリに分類されるため、1つの色が選択されます。私は一般的なソリューションを提供しようとするでしょう、ないハードコードされた規模: https://jsfiddle.net/mkaran/3adu1u2n/ 、colorScaleDomainがあなたの色スケールの

var colors = ["#F0E5FF","#E1CCFF","#C499FF","#AC79F2","#8D4CE5","#6100E5","#C94D8C"]; 
var maxSize = d3.max(classes, function(d) { return +d.size;}); 
var colorScaleDomain = []; 
var bin = Math.round(maxSize/colors.length); 
for(let i=0; i < colors.length; i++){ 
    colorScaleDomain.push(bin*i) 
} 
console.log(colorScaleDomain) 
var colorScale = d3.scale.threshold() 
    .domain(colorScaleDomain) 
    .range(colors); 

例の長さと同じ数の等しいビンを作成することによって計算されます。[0, 3513, 7026, 10539, 14052, 17565, 21078]

色を別々にグループ化する場合は、サイズとは異なる変数を使用してみることができます。例えば。 d.imports.lengthであり、これらは異なるようにグループ化されます(https://jsfiddle.net/mkaran/snec9kgf/)。

+0

これでもう少し明確になりますhttps://github.com/d3/d3-3 .x-api-reference/blob/master/Quantitative-Scales.md#threshold 'デフォルトの閾値スケールは、数値のラウンド関数に相当します。例えば、しきい値(0.49)は0を返し、しきい値(0.51)は1を返します。同様に、1830は1800-2000の範囲に入り、「#000000」にエンコードされます。 – mkaran

+0

呼び出される関数は以下の通りです。scale(x){ if(x <= x)returnの範囲[d3.bisect(domain、x)]; }とし、colors.lenghtがcolorScaleDomainより大きい場合、12000,15000などの値は 'undefined'を返します。コンソールを見てください:https://jsfiddle.net/mkaran/2oq1hLys/ – mkaran

+0

https://github.com/d3/d3-3.x-api-reference/blob/master/Quantitative-Scales.md# threshold_domain 'スケールの範囲内の値の数がN + 1の場合、スケールのドメイン内の値の数はNにする必要があります。ドメイン内にN個未満の要素がある場合、範囲内の追加の値は無視されます。ドメイン内にN個以上の要素がある場合、一部の入力に対してスケールが未定義に戻ってもよい – mkaran

関連する問題