2016-04-30 193 views
9

繪製使用nvd3多軸條形圖重疊酒吧。我的問題是酒吧重疊。 y軸上的圖表位於左側,另一個y軸位於右側。NVD3多軸條形圖上繪製

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <link href="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.3/nv.d3.css" rel="stylesheet" type="text/css"> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.2/d3.min.js" charset="utf-8"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.3/nv.d3.js"></script> 
    <style> 
     text { 
      font: 12px sans-serif; 
     } 
     svg { 
      display: block; 
     } 
     html, body, #chart1, svg { 
      margin: 0px; 
      padding: 0px; 
      height: 100%; 
      width: 100%; 
     } 
    </style> 
</head> 
<body class='with-3d-shadow with-transitions'> 

<div id="chart1" > 
    <svg> </svg> 
</div> 

<script> 

    // var testdata = stream_layers(9,10+Math.random()*100,.1).map(function(data, i) { 
    //  return { 
    //   key: 'Stream' + i, 
    //   values: data.map(function(a){a.y = a.y * (i <= 100 ? 100 : 1); return a}) 
    //  }; 
    // }); 
    var testdata=[{"key":"stream1", "values": [ 
    { 
     "x": 0, 
     "y": 44 
    }, 
    { 
     "x": 1, 
     "y": 10 
    }, 
    { 
     "x": 2, 
     "y": 29 
    }, 
    { 
     "x": 3, 
     "y": 88 
    }, 
    { 
     "x": 4, 
     "y": 25 
    }, 
    { 
     "x": 5, 
     "y": 32 
    }, 
    { 
     "x": 6, 
     "y": 100 
    }, 
    { 
     "x": 7, 
     "y": 52 
    }, 
    { 
     "x": 8, 
     "y": 15 
    }, 
    { 
     "x": 9, 
     "y": 78 
    }, 
    { 
     "x": 10, 
     "y": 42 
    }, 
    { 
     "x": 11, 
     "y": 108 
    }, 
    { 
     "x": 12, 
     "y": 17 
    }, 
    { 
     "x": 13, 
     "y": 23 
    }, 
    { 
     "x": 14, 
     "y": 182 
    }, 
    { 
     "x": 15, 
     "y": 9 
    }, 
    { 
     "x": 16, 
     "y": 25 
    }, 
    { 
     "x": 17, 
     "y": 90 
    }, 
    { 
     "x": 18, 
     "y": 32 
    }, 
    { 
     "x": 19, 
     "y": 138 
    }, 
    { 
     "x": 20, 
     "y": 189 
    }, 
    { 
     "x": 21, 
     "y": 3 
    }, 
    { 
     "x": 22, 
     "y": 16 
    }, 
    { 
     "x": 23, 
     "y": 66 
    }, 
    { 
     "x": 24, 
     "y": 46 
    }, 
    { 
     "x": 25, 
     "y": 27 
    }, 
    { 
     "x": 26, 
     "y": 185 
    }, 
    { 
     "x": 27, 
     "y": 13 
    }, 
    { 
     "x": 28, 
     "y": 12 
    }, 
    { 
     "x": 29, 
     "y": 71 
    }, 
    { 
     "x": 30, 
     "y": 191 
    } 
    ]}, 
    {"key":"stream2","values":[ 
    { 
     "x": 0, 
     "y": 1.1 
    }, 
    { 
     "x": 1, 
     "y": 0.5 
    }, 
    { 
     "x": 2, 
     "y": 2.1 
    }, 
    { 
     "x": 3, 
     "y": 1.5 
    }, 
    { 
     "x": 4, 
     "y": 1.7 
    }, 
    { 
     "x": 5, 
     "y": 2.1 
    }, 
    { 
     "x": 6, 
     "y": 0.75 
    }, 
    { 
     "x": 7, 
     "y": 1.75 
    }, 
    { 
     "x": 8, 
     "y": 1 
    }, 
    { 
     "x": 9, 
     "y": 2.3 
    }, 
    { 
     "x": 10, 
     "y": 2 
    }, 
    { 
     "x": 11, 
     "y": 0.5 
    }, 
    { 
     "x": 12, 
     "y": 1.6 
    }, 
    { 
     "x": 13, 
     "y": 1.8 
    }, 
    { 
     "x": 14, 
     "y": 2.35 
    }, 
    { 
     "x": 15, 
     "y": 2.4 
    }, 
    { 
     "x": 16, 
     "y": 1.8 
    }, 
    { 
     "x": 17, 
     "y": 1 
    }, 
    { 
     "x": 18, 
     "y": 1.25 
    }, 
    { 
     "x": 19, 
     "y": 1.85 
    }, 
    { 
     "x": 20, 
     "y": 0.65 
    }, 
    { 
     "x": 21, 
     "y": 0.75 
    }, 
    { 
     "x": 22, 
     "y": 1.25 
    }, 
    { 
     "x": 23, 
     "y": 2.25 
    }, 
    { 
     "x": 24, 
     "y": 0.5 
    }, 
    { 
     "x": 25, 
     "y": 1.85 
    }, 
    { 
     "x": 26, 
     "y": 1.75 
    }, 
    { 
     "x": 27, 
     "y": 1.15 
    }, 
    { 
     "x": 28, 
     "y": 1.9 
    }, 
    { 
     "x": 29, 
     "y": 2.4 
    }, 
    { 
     "x": 30, 
     "y": 1.5 
    } 
    ]}]; 
    testdata[0].type = "bar"; 
    testdata[0].yAxis = 1; 
    testdata[1].type = "bar"; 
    testdata[1].yAxis = 2; 
    console.log(testdata); 

    nv.addGraph(function() { 
     var chart = nv.models.multiChart() 
      .margin({top: 30, right: 60, bottom: 50, left: 70}) 
      .color(d3.scale.category10().range()) 
      .height(450) 
      .width(1200) 
      .color(d3.scale.category10().range()) 
      .useInteractiveGuideline(true) 
      .interpolate('linear'); 

     chart.xAxis.tickFormat(d3.format(',f')); 
     chart.yAxis1.tickFormat(d3.format(',.1f')); 
     chart.yAxis2.tickFormat(d3.format(',.1f')); 

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

     return chart; 
    }); 

</script> 
</body> 
</html> 

甲Plunkr設置embeded此可以發現here

二組數據,以繪製所述多圖形但杆是重疊的。我的輸出屏幕截圖在這裏。

Screenshot of Barchart with two y-axes and different data range.

做的唯一的事情就是調整酒吧的寬度和位置。這些都是選擇由類

d3.selectAll ('.bars1Wrap .nv-groups .nv-series-0 rect') 

當我切換軸

testdata[1].yAxis = 1; 

它可以完美運行。 Graph with one y-axis. But the Ranging is lost.

但問題是測距丟失的數據。我需要兩個數據集的不同範圍。

我試圖繪製圖表

var g3 = d3.selectAll ('.bars1Wrap .nv-groups .nv-series-0 rect') 
          .attr("width", function(d){ return d/2;}); 

但沒有成功...... 讚賞任何幫助後,調整杆的寬度。

回答

2

當然,nvd3是multiChart越野車,當你選擇需要顯示兩個可視化數據集類型「酒吧」

我想說的是,不是這個

testdata[0].type = "bar"; 
testdata[0].yAxis = 1; 
testdata[1].type = "bar"; 
testdata[1].yAxis = 2; 

如果當時

testdata[0].type = "line"; 
testdata[0].yAxis = 1; 
testdata[1].type = "bar"; 
testdata[1].yAxis = 2; 

它工作正常。

這樣纔能有拆散兩個柱狀圖。 需要做一些開箱扭捏,調用該函數後圖表呈現。

function resetBarSize(d1){ 
     //get the width of the bar, and make it half 
     var w2 = d3.select(".bars2Wrap .nv-bar").attr("width")/2; 
     if (!d1){ 
     //initial load d1 will be undefined 
     //in that case make all the bars half 
     d3.selectAll(".bars1Wrap .nv-bar").style("width", w2); 
     d3.selectAll(".bars2Wrap .nv-bar").style("width", w2); 
     //translate the last bar so that there is no overlapping 
     d3.selectAll(".bars2Wrap .nv-bar")[0].forEach(function(d){ 
      var t = d3.transform(d3.select(d).attr("transform")), 
      x = t.translate[0] + w2, 
      y = t.translate[1]; 
      d3.select(d).attr("transform", "translate(" + x +"," + y + ")"); 
     })   
     }else if (d1.yAxis ==2 && d1.disabled){ 
     //in this case axis 2 is disabled or not visible so make bar1 width double. 
     d3.selectAll(".bars1Wrap .nv-bar").style("width", w2 *2); 
     }else if (d1.yAxis ==1 && d1.disabled){ 
     //in this case axis 1 is disabled or not visible so make bar1 width double. 
     d3.selectAll(".bars2Wrap .nv-bar").style("width", w2 *2); 
     } else { 
     //in this case axis both axis is present. Make all the bars half and translate bar 2 so that they don't overlap. 

     d3.selectAll(".bars1Wrap .nv-bar").style("width", w2); 
     d3.selectAll(".bars2Wrap .nv-bar").style("width", w2); 
     d3.selectAll(".bars2Wrap .nv-bar")[0].forEach(function(d){ 
      var t = d3.transform(d3.select(d).attr("transform")), 
      x = t.translate[0] + w2, 
      y = t.translate[1]; 
      d3.select(d).attr("transform", "translate(" + x +"," + y + ")"); 
     }) 
     } 
     return; 
    } 

現在在繪製圖表後調用該函數。

nv.dispatch.on('render_end', function(newState) { 
    resetBarSize(); 
    chart.legend.dispatch.on('legendClick', function(newState) { 
     chart.update(); 
     setTimeout(function(){resetBarSize(newState)}); 
}); 

工作代碼提前here

+0

感謝的最佳解決方案。我在代碼中發現的另外一個問題是,如果我關閉一個圖例,則該條必須達到其全部寬度。同樣在我的情況下,繪製圖表後我不能調用第二個函數。無論如何,我會修改nvd3代碼來做這件事情。感謝您指導我尋找最終解決方案。我希望這個答案對別人也是有用的。 –

+1

請檢查我的編輯答案,我的代碼使得現在的直板全寬,當傳說是關閉的。 – Cyril