J'ai un graphique chronologique contenant des points de données indiquant des événements spécifiques. J'ai essayé de construire une fonction de zoom dans le graphique, mais j'ai atteint une impasse. Je peux zoomer sur l'axe, mais je ne peux pas repositionner les datapoins dans la nouvelle échelle. J'ai traversé beaucoup de d3 bl.ocks mais n'ai pas trouvé de solution.Comment faire en sorte que les éléments d'une ligne de temps suivent un zoom à l'aide de D3.js v4
J'ai une version minimale en jsFiddle ici: https://jsfiddle.net/q73ggw3e/2/
pièces principales sont:
le zoom:
var zoom = d3.zoom()
.scaleExtent([1, Infinity])
.translateExtent([[0, 0], [width, height]])
.extent([[0, 0], [width, height]])
.on("zoom", zoomed);
Les points de données:
svg.append("g")
.selectAll("logo")
.attr("class", "logo")
.data(data)
.enter()
.append("circle")
.attr("cy", 40)
.attr("cx", function(d) { return x(d);})
.attr("r", 10)
.style("fill", "#000000")
La zone de zoom :
svg.append("rect")
.attr("class", "zoom")
.attr("width", width)
.attr("height", height)
.call(zoom);
Et la fonction zoomée:
function zoomed() {
svg.select(".axis--x")
.call(xAxis.scale(d3.event.transform.rescaleX(x)));
var new_x = d3.event.transform.rescaleX(x);
svg.selectAll(".logo")
.attr("cx", function(d) { return new_x(d);});
};
Je est obligatoire la (.logo) classe de cercles à l'événement zoom aussi, mais pour une raison que l'axe effectue un zoom ...
Où est-ce que je vais mal? Ou y a-t-il un autre moyen de le faire ...
Si cela est important, les points de données auront également des fonctions de glisser-déposer, de survol et de clic. Cela fonctionne bien pour le moment, mais le zoom rect bloque les événements de pointeur. Mais ce doit être trié après le zoom fonctionne ...
Comme Frog a souligné qu'il était un problème d'ajouter les bonnes choses au comportement de zoom. Fonctionne bien maintenant. –