Я пытаюсь визуализировать граф d3fc на узле svg в моем элементе response.js и вернуть все это, но он вылетает, когда я вызываю .datum (my_data) в моем выборе d3.Я думаю, что мне не хватает чего-то очень базового в природе DOM или узлов SVG, в частности
. Это учебное пособие по диаграмме, которое я пытаюсь воссоздать (за исключением данных примера, яя использую свой собственный массив из 600 ('x': value, 'y': value} пары данных):
https://bl.ocks.org/ColinEberhardt/9b8b198a81e749c5ab8b1e06b455db61#askmefi_category_year.tsv
<!DOCTYPE html>
<script src="https://unpkg.com/d3@4.6.0"></script>
<script src="https://unpkg.com/d3fc@12.1.0"></script>
<div id='small-multiples'></div>
<style>
html, body, #small-multiples {
height: 100%;
margin: 0;
}
</style>
<script>
d3.tsv('askmefi_category_year.tsv')
.row(function(r) {
return {
category: r.category,
n: Number(r.n),
year: Number(r.year)
}
})
.get(function(data) {
var nested = d3.nest()
.key(function(k) { return k.category; })
.entries(data);
// pick on of the data series
var dataSeries = nested[7].values;
var yExtent = fc.extentLinear()
.accessors([function(d) { return d.n; }])
.pad([0, 0.2])
.include([0]);
var xExtent = fc.extentLinear()
.accessors([function(d) { return d.year; }]);
var line = fc.seriesSvgLine()
.crossValue(function(d) { return d.year; })
.mainValue(function(d) { return d.n; });
var chart = fc.chartSvgCartesian(
d3.scaleLinear(),
d3.scaleLinear())
.yDomain(yExtent(data))
.xDomain(xExtent(data))
.yOrient('left')
.plotArea(line);
// render
d3.select('#small-multiples')
.datum(dataSeries)
.call(chart);
});
А вот мой (почтиидентично) функция реагирования.
plot_d3fc_x(data){
var dataSeries = data
console.log('entered d3fc func, data:', dataSeries)
var yExtent = fc.extentLinear()
.accessors([function(d){
// console.log(d.y)
return d.y;}])
.pad([0,0.2])
.include([0]);
var xExtent = fc.extentLinear()
.accessors([function(d){
// console.log(d.x)
return d.x;}])
var line = fc.seriesSvgLine()
.crossValue(function(d){return d.x;})
.mainValue(function(d){return d.y;})
var chartitself = fc.chartSvgCartesian(
d3.scaleLinear(),
d3.scaleLinear())
.yDomain(yExtent(data))
.xDomain(xExtent(data))
.yOrient('left')
.plotArea(line);
//CRASHES HERE
d3.select('#svg_group')
.datum(dataSeries)
.call(chartitself);
}
Мой рендер в элементеactjs имеет буквально только одну вещь, которую можно выбрать для указанной выше функции:
render() {
return (
<svg id="svg_group"/>
)
}
Я был бы признателен за тонну, если бы кто-нибудь мог объяснитьошибка, которую я получаю при вызове функции:
"TypeError: nodes[i].requestRedraw is not a function
SVGElement.<anonymous>
node_modules/d3fc/build/d3fc.js:7053
7050 | transitionPropagator(d3Selection.select(nodes[i])).select('svg').call(yAxisStore(yAxisComponent));
7051 | });
7052 | container.each(function (d, i, nodes) {
> 7053 | return nodes[i].requestRedraw();
| ^ 7054 | });
7055 | decorate(container, data, index);
7056 | });
View compiled
Selection.each
node_modules/d3-selection/src/selection/each.js:4
1 | export default function (callback) {
2 | for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
3 | for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
> 4 | if (node = group[i]) callback.call(node, node.__data__, i, group);
5 | }
6 | }
7 |
View compiled
SVGGElement.<anonymous>
node_modules/d3fc/build/d3fc.js:7052
7049 | yAxisComponent.decorate(yDecorate);
7050 | transitionPropagator(d3Selection.select(nodes[i])).select('svg').call(yAxisStore(yAxisComponent));
7051 | });
> 7052 | container.each(function (d, i, nodes) {
| ^ 7053 | return nodes[i].requestRedraw();
7054 | });
7055 | decorate(container, data, index);
View compiled
Selection.each
node_modules/d3-selection/src/selection/each.js:4
1 | export default function (callback) {
2 | for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
3 | for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
> 4 | if (node = group[i]) callback.call(node, node.__data__, i, group);
5 | }
6 | }
7 |
View compiled
cartesian
node_modules/d3fc/build/d3fc.js:6993
6990 |
6991 | var cartesian = function cartesian(selection$$1) {
6992 | var transitionPropagator = propagateTransition(selection$$1);
> 6993 | selection$$1.each(function (data, index, group) {
| ^ 6994 | var container = containerDataJoin(d3Selection.select(group[index]), [data]);
6995 | container.enter().attr('auto-resize', '');
6996 | chartLabelDataJoin(container, [xOrient(data)]).attr('class', function (d) {
View compiled
Selection.call
node_modules/d3-selection/src/selection/call.js:4
1 | export default function () {
2 | var callback = arguments[0];
3 | arguments[0] = this;
> 4 | callback.apply(null, arguments);
5 | return this;
6 | }
View compiled
cartesianBase
node_modules/d3fc/build/d3fc.js:7236
7233 | container.select('.y-label-container>.y-label').text(yLabel);
7234 | decorate(container, data, index);
7235 | });
> 7236 | selection$$1.call(cartesian);
| ^ 7237 | };
7238 |
7239 | rebindAll(cartesianBase, cartesian, include(/^x/, /^y/, 'chartLabel'));
View compiled
Selection.call
node_modules/d3-selection/src/selection/call.js:4
1 | export default function () {
2 | var callback = arguments[0];
3 | arguments[0] = this;
> 4 | callback.apply(null, arguments);
5 | return this;
6 | }
View compiled
LinePlot.plot_d3fc_x
src/d3charts/LinePlot.js:193
190 | .attr("height", svgHeight);
191 |
192 | console.log(d3.select('#svg_group'))
> 193 | svg
| ^ 194 | .append("g")
195 | .datum(dataSeries)
196 | .call(chartitself);
View compiled
LinePlot.componentDidMount
src/d3charts/LinePlot.js:43
40 | console.log('body', d3.select('body'))
41 | console.log(d3.select('#small-multiples'))
42 | console.log(d3.select('svg'))
> 43 | this.plot_d3fc_x(construct_d3_input(parsed_data['rest_dict']['x']))
| ^ 44 | }
45 |
46 | //pass in the len 600 array
View compiled
▶ 16 stack frames were collapsed.
(anonymous function)
src/App.js:132
129 | })
130 | })
131 | .then(() => {
> 132 | this.setState({
| ^ 133 | route: "display/charts"
134 | })
135 | console.log('route set to display/charts')```