Placer les étiquettes au centre de nœuds d3.js
Je commence avec d3.js et suis en train de créer une ligne de nœuds qui contiennent chacun une centrée sur l'étiquette du numéro.
Je suis en mesure de produire le résultat désiré visuellement, mais la façon dont je l'ai fait, il n'est guère optimale car elle implique le codage en dur des coordonnées x-y pour chaque élément de texte. Ci-dessous le code:
var svg_w = 800;
var svg_h = 400;
var svg = d3.select("body")
.append("svg")
.attr("width", svg_w)
.attr("weight", svg_h);
var dataset = [];
for (var i = 0; i < 6; i++) {
var datum = 10 + Math.round(Math.random() * 20);
dataset.push(datum);
}
var nodes = svg.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(dataset)
.enter()
.append("circle")
.attr("class", "node")
.attr("cx", function(d, i) {
return (i * 70) + 50;
})
.attr("cy", svg_h / 2)
.attr("r", 20);
var labels = svg.append("g")
.attr("class", "labels")
.selectAll("text")
.data(dataset)
.enter()
.append("text")
.attr("dx", function(d, i) {
return (i * 70) + 42
})
.attr("dy", svg_h / 2 + 5)
.text(function(d) {
return d;
});
La node
classe est de coutume de classe CSS que j'ai défini séparément pour les circle
éléments, tandis que les classes nodes
et labels
ne sont pas explicitement définis et ils sont empruntés à partir de ce réponse.
Comme on le voit, la position de chaque étiquette de texte est codé en dur, de sorte qu'il apparaît au centre de chaque nœud. Évidemment, ce n'est pas la bonne solution.
Ma question est comment dois-je associer correctement chaque étiquette de texte à chaque nœud cercle de manière dynamique, de sorte que si le positionnement d'une modification de l'étiquetage ainsi que celle d'un cercle automatiquement. Conceptuel explication est extrêmement bienvenue avec le code exemple.
- Texte des ancres semblent pas travailler directement en D3, mais avez-vous essayé quelque chose d'aussi simple que de CSS text-align? Ceci devrait faire l'affaire! w3schools.com/cssref/pr_text_text-align.asp essayez Également de prendre un coup d'oeil aux postes de ce type à partir de la d3 Groupe Google: groups.google.com/forum/#!searchin/d3-js/text-align/d3-js/...
- Où avez-vous l'idée que le texte des ancres ne fonctionnent pas en d3?
- il ya quelques mois ils n'ont pas travaillé...merci pour la clarification 🙂 sympa de voir une approche simple pour ce problème
Vous devez vous connecter pour publier un commentaire.
La texte d'ancre attribut fonctionne comme prévu sur un élément svg créé par D3. Cependant, vous devez ajouter le
text
et lacircle
dans une communeg
élément pour s'assurer que letext
et lacircle
sont centrés les uns avec les autres.Pour ce faire, vous pouvez modifier votre
nodes
variable:Noter que le
dataset
est maintenant une liste d'objets, de sorte qued.y
etd.x
peut être utilisé au lieu d'une liste de chaînes de caractères.Ensuite, remplacez votre
circle
ettext
append (avec le code suivant:Maintenant, au lieu de changer la position de la
circle
vous changez la position de lag
élément qui se déplace à la fois lacircle
et latext
.Ici est un JSFiddle montrant le texte centré sur les cercles.
Si vous souhaitez que votre texte soit dans un autre
g
élément de sorte qu'il apparaît toujours sur le dessus, puis utilisez led.x
etd.y
valeurs définies dans la premièreg
élément de la création detransform
le texte.y
etx
peuvent être stockées pour chaque chaîne, et de mettre votre texte à l'intérieur d'ung
élément de sorte que leg
élément qui peut être transformée.g
éléments et à l'intérieur de laquelle vous créez une série deg
éléments pour les données dans le tableau, puis vous créeztext
éléments à l'intérieur de chacun de cesg
élément? Ce qui me confond un peu, c'esttext.append("svg:text")...
, netext
ici représente la série deg
éléments? Si oui, comment faut-D3 créer untext
élément chacun de cesg
éléments? La syntaxe est un peu trompeur.text
représente la série deg
éléments. Sous les couvertures de D3, leappend
méthodes sait faire uneach
quand on donne une liste d'éléments. Ainsi, leappend
est appliquée à chaqueg
élément dans la liste.each
. Plus précisément voir ce qu'il dit presque tous les autres opérateur utiliseeach
sous les couvertures..attr("text-anchor", "middle")
pour chaquetext
élément, l'étiquette, qui est au milieu horizontalement mais légèrement décalé verticalement. J'ai résolu ce problème en ajoutantattr("y", ".3em")
(à partir d'exemples empruntés à d3.js le site web), ce qui semble bien fonctionner, même de taille arbitraire de nœud de cercle. Cependant, exactement ce que cet attribut supplémentaire n'échappe à ma compréhension. Bien sûr, il fait quelque chose pour la coordonnée de chaquetext
élément, mais pourquoi.3em
en particulier? Il semble presque magique pour moi...La meilleure réponse est venu de la personne lui-même:
Juste ajouter
.attr("text-anchor", "middle")
à chaque élément de texte.Exemple:
Cette page décrit ce qui se passe sous le capot svg quand il vient à des éléments de texte. Comprendre les sous-jacents des machines et des structures de données m'a aidé à obtenir un meilleur contrôle sur la façon dont j'ai dû modifier mon code pour qu'il fonctionne.