2

我试图稍微改变 nvd3 水平图表的行为。

现在水平图表有一个图例,可以选择同时选择多个图例项。我只是想一次只显示一个项目,以便在选择一个系列时,取消选择其他系列。

var data = [
  {
    "key": "Series1",
    "color": "#d62728",
    "values": [
      { 
        "label" : "A" ,
        "value" : 1
      } , 
      { 
        "label" : "B" ,
        "value" : 8
      } , 
    ]
    },
    {
    "key": "Series2",
    "color": "#1f77b4",
    "values": [
      { 
        "label" : "C" ,
        "value" : 25
      } , 
      { 
        "label" : "D" ,
        "value" : 16
      } , 

    ]
  }
]

nv.addGraph(function() {
var chart = nv.models.multiBarHorizontalChart()
    .x(function(d) { return d.label })
    .y(function(d) { return d.value })
    .margin({top: 30, right: 20, bottom: 50, left: 175})
    .showValues(true)
    .tooltips(false)
    .showControls(false);

chart.yAxis
    .tickFormat(d3.format(',.2f'));

d3.select('#chart svg')
    .datum(data)
  .transition().duration(500)
    .call(chart);

nv.utils.windowResize(chart.update);

return chart;
});

我还在第 6264 到 6272 行修改了 nv.d3.js 的 multiBarHorizo​​ntalChart 部分:

//============================================================
// Event Handling/Dispatching (in chart's scope)
//------------------------------------------------------------
data.map(function(d,i){
  d.disabled= true;
  return d;
});

这使它的行为类似于单选按钮,但是当图表首次加载时,Series1 和 Series2 都是可见的。

所以我的问题是“你如何让只有一个系列可见?”

4

2 回答 2

2

我最终更换

var barsWrap = g.select('.nv-barsWrap').datum(data.filter(function(d, i) {return !d.disabled }))

在 nv.d3.js 文件中包含以下内容:

 var all_undefined = true;
 for (var i=0; i < data.length; i++){  
   if (data[i].disabled === true || data[i].disabled === false){
     all_undefined = false;
   }
 }
  if (all_undefined){
    var barsWrap = g.select('.nv-barsWrap')
      .datum(data.filter(function(d, i) {
        if (i===0){
        wrap.selectAll('.nv-series').classed('disabled', true);
        wrap.select('.nv-series').classed("disabled", false);
        return !d.disabled
        }
      }))  
  }
  else{
    var barsWrap = g.select('.nv-barsWrap')
      .datum(data.filter(function(d, i) {return !d.disabled }))
  }

不是一个非常优雅的解决方案,但它可以从水平条形图中的图例制作单选按钮。

于 2013-01-31T05:55:25.940 回答
1

我遇到了同样的问题,最终创建了一个补丁来解决这个问题,我相信,这是一种针对最新版本的更清洁的方法。您可以在此处关注问题和拉取请求:

https://github.com/novus/nvd3/issues/168

于 2013-07-01T05:58:25.297 回答