У меня есть массив объектов, называемый graphData
(размер варьируется). Каждый элемент содержит всю информацию, необходимую для создания графика d3, и я могу успешно рисовать графики, если я получаю доступ к элементам graphData
путем жесткого кодирования (то есть graphdata[0]
, graphdata[1]
и т. Д.).Динамическое создание нескольких графиков dv svg
Проблема возникает, когда я пытаюсь использовать цикл for для создания одного графика для каждого из элементов. Посмотрел на stackoverflow и в Интернете, но все решения связаны с созданием фиксированного числа нескольких графиков, а не для генерации нескольких графиков динамически.
Ниже приведен мой рабочий код для генерации одного графика. Каков рекомендуемый способ генерации x числа графиков автоматически?
var graphData = data.graph;
var RADIUS = 15;
var edgeData = graphData[0].edges;
var nodeData = graphData[0].nodes;
var stageNum = graphData[0].stage;
var xScale = d3.scale.linear()
.domain([d3.min(edgeData, function (d) {
return d.start[0];
}),
d3.max(edgeData, function (d) {
return d.start[0];
})])
.range([50, w - 100]);
var yScale = d3.scale.linear()
.domain([d3.min(edgeData, function (d) {
return d.start[1];
}),
d3.max(edgeData, function (d) {
return d.start[1];
})])
.range([50, h - 100]);
var rScale = d3.scale.linear()
.domain([0, d3.max(edgeData, function (d) {
return d.start[1];
})])
.range([14, 17]);
// already have divs with classes stage1, stage2... created.
var svg = d3.select(".stage" + stageNum).append("svg")
.attr({"width": w, "height": h})
.style("border", "1px solid black");
var elemEdge = svg.selectAll("line")
.data(edgeData)
.enter();
var edges = elemEdge.append("line")
.attr("x1", function (d) {
return xScale(d.start[0]);
})
.attr("y1", function (d) {
return yScale(d.start[1]);
})
.attr("x2", function (d) {
return xScale(d.end[0]);
})
.attr("y2", function (d) {
return yScale(d.end[1]);
})
.attr("stroke-width", 2)
.attr("stroke", "black");
var elemNode = svg.selectAll("circle")
.data(nodeData)
.enter();
var nodes = elemNode.append("circle")
.attr("cx", function (d) {
return xScale(parseInt(d.x));
})
.attr("cy", function (d) {
return yScale(parseInt(d.y));
})
.attr({"r": rScale(RADIUS)})
.style("fill", "yellow")
.style("stroke", "black");
Что делать, если мы хотим, чтобы пересмотреть данные, используемые для каждого элемента? D3 уже предоставляет инструменты, чтобы избежать хакерских циклов. Это буквально **, что он был построен, чтобы делать! Это даже в [пояснении к объединению] (http://bost.ocks.org/mike/join/): «Вместо того, чтобы сообщать D3, как что-то сделать, скажите D3, что вы хотите». Я бы уклонился от этого - особенно при работе с несколькими графиками. –
Да, я согласен с тобой. но проблема была нарушена для цикла. Я попытался это исправить. Ваш подход намного лучше, чем подход в вопросе. +1 для этого. – Fawzan
Все хорошо. Как только я узнал, как сделать d3 моей грязной работой, я никогда не хотел возвращаться. :) –