D3: Uncaught ReferenceError: stream_layers is not defined

D3: Uncaught ReferenceError: stream_layers is not defined

我正在使用 nvd3.js 创建一个简单的堆叠条形图,如 here

所述

我在 angular 指令 中添加了 link 中提到的代码,如下所示:

app.directive('stackBar', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            nv.addGraph(function() {
                var chart = nv.models.multiBarChart()
                            /*.transitionDuration(350)*/
                            .reduceXTicks(true)   //If 'false', every single x-axis tick label will be rendered.
                            /*.rotateLabels(0)    */  //Angle to rotate x-axis labels.
                            .showControls(true)   //Allow user to switch between 'Grouped' and 'Stacked' mode.
                            .groupSpacing(0.1)    //Distance between each group of bars.

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

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

                d3.select(element[0])
                            .datum(exampleData())
                            .call(chart);

                nv.utils.windowResize(chart.update);
                return chart;
            });

            //Generate some nice data.
            function exampleData() {
                return stream_layers(3,10+Math.random()*100,.1).map(function(data, i) {
                        return {
                            key: 'Stream #' + i,
                            values: data
                        };
                });
            }
        }
    }   
});

这是我的 HTML:

<td class="centered" colspan="5">
      <div stack-bar>

      </div>
</td>

但是,我收到以下错误:

Uncaught ReferenceError: stream_layers is not defined

知道我哪里出错了吗?

另外,'transitonDuration' 也没有用,所以我把它注释掉了。我一开始以为是d3版本问题,但我用的是最新版本,问题依旧。

编辑:

Huang Feng 的回答帮我排除了错误。但是我没有得到任何图表,而是得到了很多文本。这是 屏幕截图:

知道为什么吗?

此外,该指令在 ng-repeat 中,这就是屏幕截图中有多行的原因。

这是因为您没有定义stream_layers函数,而且它也不是nvd3 lib中的函数。 定义在这里:

http://nvd3.org/assets/js/data/stream_layers.js

如果你想使用它,你应该在 html 中包含这个库,例如:

<script src="../stream_layers.js"></script>

如果你想要一个详细的例子,这里有一个供你参考:

http://bl.ocks.org/mbostock/3943967

我遇到了类似的输出(和错误),并且有 3 个问题需要解决:

1。将 stream_layers.js 添加到路径

, you need to include the stream_layers.js function to generate fake data for the example. I downloaded the source code from nvd3.org 所述,stream_layers.js 文件位于 novus-nvd3-8ceb270/test/stream_layers.js(您很可能至少需要更新 你的路径的第一部分基于最新的缩短 git 散列。

2。将 transitionDuration 替换为 duration

另一个问题是 NVD3 的 API 已经改变。检查源代码(novus-nvd3-8ceb270/src/models/multiBarChart.js 中的第 456 行)后,transitionDuration 方法已被替换为 duration。这是上面代码的一个片段,更正了持续时间选项:

var chart = nv.models.multiBarChart()
  .duration(350)
  .reduceXTicks(true)   //If 'false', every single x-axis tick label will be rendered.
  /*.rotateLabels(0)    */  //Angle to rotate x-axis labels.
  .showControls(true)   //Allow user to switch between 'Grouped' and 'Stacked' mode.
  .groupSpacing(0.1)    //Distance between each group of bars.

3。创建 SVG

最后,您的屏幕截图仅显示文字。我认为这是因为您在需要将图表附加到 SVG 元素时试图将其附加到 div。纠正此问题的一种方法是将 svg 附加到元素 [0],然后选择该 svg 以用于可视化:

var svg = d3.select(element[0])
  .append('svg')
  .attr('id', 'my-bar-chart-svg')

d3.select('#my-bar-chart-svg')
   .datum(exampleData())
   .call(chart);

如果您仍然没有看到任何内容,您可能需要 fiddle 使用您创建的 SVG 元素的宽度和高度来附加图表。这是一个用于测试的快速技巧:

var svg = d3.select(element[0])
  .append('svg')
  .attr('id', 'my-bar-chart-svg')
  .attr('width', 800)
  .attr('height', 400)

d3.select('#my-bar-chart-svg')
   .datum(exampleData())
   .call(chart);