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>
如果你想要一个详细的例子,这里有一个供你参考:
我遇到了类似的输出(和错误),并且有 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);
我正在使用 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>
如果你想要一个详细的例子,这里有一个供你参考:
我遇到了类似的输出(和错误),并且有 3 个问题需要解决:
1。将 stream_layers.js
添加到路径
如 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);