2015-11-03 53 views
0

我有一些动态尺度的散点图,我有一些数据映射到linar颜色尺度,并且它的工作非常好。我尝试为某些离散数据设置一个序数色阶,但它为每个值输出相同的颜色。有序尺度category10将一切都映射到相同的颜色

这里的规模功能可按

var cScale = { 

linear : function(arr, numFunc){ 

    return d3.scale.linear() 
     .domain(d3.extent(arr, numFunc)) 
     .range([colorRange.min,colorRange.max]) 

}, 

ordinal : function(arr, ordinalFunc){ 
    return d3.scale.category10() 
     // .domain(d3.extent(arr, ordinalFunc)) 
    } 
} 

使用如下

window.cScaleFunc = cScale.ordinal 

fillCircleRef 
    .attr("r", function(d){ 
     if(movieFilter(d))return 0; 
     return rScaleFunc(arr, rDataFunc)(rDataFunc(d)); 
    }) 
    .attr("fill", function(d){ 
     return cScaleFunc(arr, cDataFunc)(cDataFunc(d)); 
    }) 

输出

#1f77b4宝莱坞,#1f77b4好莱坞

回答

1

你是返回一个新的实例d3.scale.category10()每次序被称为

ordinal : function(arr, ordinalFunc){ 
    return d3.scale.category10() 
     // .domain(d3.extent(arr, ordinalFunc)) 
    } 
} 

这样来做:

var cScale = { 
myScale : d3.scale.category10(), 
linear : function(arr, numFunc){ 

    return d3.scale.linear() 
     .domain(d3.extent(arr, numFunc)) 
     .range([colorRange.min,colorRange.max]) 

}, 

ordinal : function(arr, ordinalFunc){ 
    return this.myScale;//now there is a single scale and we dont inititialize evrytime its called 
     // .domain(d3.extent(arr, ordinalFunc)) 
    } 
} 

希望这有助于!

+0

我做了 var contextScaleC = cScaleFunc(arr,cDataFunc); fillCircleRef .attr( “补”,函数(d){ 回报contextScaleC(cDataFunc(d));} ) 这是否看行吗? –

+0

是的,你写了window.cScaleFunc = cScale.ordinal 因此,每次调用cScaleFunc(arr,cDataFunc)它都会创建一个新的d3.scale.category10() – Cyril

+0

嗯我也创建其他的动态以及基于变化数据,并希望保持标准的感觉(我意识到我不需要新的实例每次10类),但是这真的是一件坏事吗? –