geoChoroplethChart 为黑色,一键有两个值选项

geoChoroplethChart is black with two option of value for one key

我有下一个数据使用 dc.js 和 geoChoroplethChart,

var data = crossfilter([
{ state: 'one', bar: 'A', num: '1' },
{ state: 'two', bar: 'B', num: '2' },
{ state: 'three', bar: 'A', num: '3' },
{ state: 'one', bar: 'B', num: '3' },
{ state: 'one', bar: 'A', num: '2' },
{ state: 'two', bar: 'B', num: '2' },
]);


var statedim=data.dimension(function(d){return d['state'];})
var my_group=statedim.group();

reducer=reductio();
reducer.value('nbar').exception(function(d){return d['bar']}.exceptionCount(true);
reducer.value('nnum').exception(function(d){return d['num']}.exceptionCount(true);


reducer(my_group);

其中state是我国家的一个地区,颜色是基于nnum的,所以我使用

.valueAccessor(function (d) {return d.value.nnum.exceptionCount})

但我希望它在标题出现状态下,nnum和nbar。

.title(function(d){
return["state: " +d.key,
"#nnum: "+d.value].join('\n')})

但我不知道如何在没有 geoChoroplethChart 的标题中集成 nbar。

我觉得在用

.valueAccessor(function (d) {return d.value})

.title(function(d){
return["state: " +d.key,
"#nnum: "+d.value.nnum.exceptionCount,
"nbar:" +d.value.nbar.exceptionCount].join('\n')})

是标题的解决方案,但是状态填满黑色,当我点击另一个图形时,地图没有反应。

geoChoropleth 处理数据的方式确实很奇怪。所有其他图表将交叉过滤器数据绑定到 SVG; geoChoropleth binds the map data and hides the crossfilter data in an internal object。然后它为访问者伪造绑定数据。

此外,正如您所指出的,它将 valueAccessor() 的结果存储在其隐藏数据中,而不是绑定原始数据然后在需要时使用 valueAccessor。我很确定这是个坏主意。

但抱怨够了。让我们像往常一样找到解决方法。

事实证明,您无需深入了解值访问器即可获得正确的颜色。您可以保留 valueAccessor 默认值,它将获取 d.value。然后使用 colorAccessor 获得正确的颜色:

.colorAccessor(function(d){
  return d ? d.nbar.exceptionCount : null;
})

注意对未定义数据的防范,这是同样奇怪的结果。

我们还需要防止标题访问器中出现未定义的 value,因为图表是根据地图数据而不是交叉过滤器数据构建 key/value 对:

.title(function(d){
  var arr = ["state: " + d.key];
  if(d.value) // have to guard against null data for "other" states
    arr.push(
     "#nnum: "+d.value.nnum.exceptionCount,
     "nbar:" +d.value.nbar.exceptionCount
    );
  return arr.join('\n');
})

你的 fiddle 分支:https://jsfiddle.net/gordonwoodhull/7qb3yujj/14/