Étiquette à l'extérieur de l'arc (graphique) d3.js
Je suis nouveau sur d3.js et j'essaie de faire un diagramme circulaire avec elle.
J'ai un problème: je ne peux pas obtenir mes étiquettes à l'extérieur de ma arcs...
Les étiquettes sont positionnées à l'arc.le centre de gravité
arcs.append("svg:text")
.attr("transform", function(d) {
return "translate(" + arc.centroid(d) + ")";
})
.attr("text-anchor", "middle")
Qui peut m'aider avec ça?
- Cette fonction calculée sur le centre de la tarte pour un graphique circulaire. - Je ajouter une fonction permettant d'obtenir le point central de l'arc. Au-dessous de l'image est basée sur ma nouvelle fonction . consultez le lien: github.com/mbostock/d3/issues/1124
- Donc, si vous voulez aller avec une très jolie légende plutôt que de texte aléatoire traîner. J'ai trouvé une très bonne solution pour les étiquettes. stackoverflow.com/questions/20675617/...
Vous devez vous connecter pour publier un commentaire.
Je peux résoudre ce problème - avec la trigonométrie :).
Voir violon: http://jsfiddle.net/nrabinowitz/GQDUS/
Fondamentalement, l'appel de
arc.centroid(d)
retourne un[x,y]
tableau. Vous pouvez utiliser le Théorème de Pythagore pour calculer l'hypoténuse, qui est la longueur de la ligne à partir du centre de la tourte à l'arc centre de gravité. Ensuite, vous pouvez utiliser les calculsx/h * desiredLabelRadius
ety/h * desiredLabelRadius
pour calculer le désiréx,y
pour votre étiquette d'ancrage:Le seul inconvénient est que
text-anchor: middle
n'est pas un choix plus que vous seriez mieux réglage de latext-anchor
repose sur le côté de la tarte que nous sommes sur:display
style de votre étiquette conditionnellement surd.endAngle - d.startAngle > someValue
.Spécifiquement pour les diagrammes à secteurs, la
d3.layout.pie()
fonction du format de données avec unstartAngle
etendAngle
attributs. Le rayon peut être ce que vous désirez (à quelle distance du centre, vous souhaitez placer l'étiquette).Combinant ces informations avec un couple fonctions trigonométriques vous permet de déterminer les coordonnées x et y pour les étiquettes.
Considérer cette gist/bloc.
Concernant le x/y de positionnement du texte, la magie est dans cette ligne (formaté pour des raisons de lisibilité):
((d.endAngle - d.startAngle) /2) + d.startAngle
nous donne notre (thêta) en radians.(radius - 12)
est l'arbitraire rayon que j'ai choisi pour la position du texte.-1 *
l'axe des y est inversé (voir ci-dessous).Les fonctions trigonométriques sont utilisés:
cos = adjacent /hypotenuse
etsin = opposite /hypotenuse
. Mais il ya un couple de choses que nous devons envisager de faire ces travaux avec nos étiquettes.Que les dégâts les choses un peu et a essentiellement pour effet de permutation
sin
etcos
. Nos fonctions trigonométriques deviennent alors:sin = adjacent /hypotenuse
etcos = opposite /hypotenuse
.La substitution des noms de variables, nous avons
sin(radians) = x /r
etcos(radians) = y /r
. Après quelques manipulation algébrique, nous pouvons obtenir à la fois des fonctions en termes de x et y respectivementr * sin(radians) = x
etr * cos(radians) = y
. À partir de là, il suffit de le brancher dans le transformer, traduire attribut.Cela va mettre les étiquettes au bon endroit, pour faire de fantaisie, vous avez besoin d'un style logique comme ceci:
Cela fera des étiquettes à partir de 10:30 heures à 1:30 heures et à partir de 4:30 heures à 7:30 heures d'ancrage dans le milieu (ils sont au-dessus et au-dessous), les étiquettes à partir de 1:30 heures à 4:30 heures d'ancre sur la gauche (à droite), et les étiquettes à partir de 7:30 heures à 10:30 heures d'ancre sur la droite (ils sont à gauche).
Les mêmes formules peuvent être utilisées pour n'importe quel D3 radial graphique, la seule différence est la façon dont vous déterminez l'angle.
J'espère que cela aide quelqu'un de tomber sur elle!
Merci!
J'ai trouvé une autre façon de résoudre ce problème, mais la tienne semble mieux 🙂
J'ai créé une seconde d'arc avec un plus grand rayon et l'a utilisé pour positionner mes étiquettes.
my_arc.clone.outerRadius(r + 20)
au lieu de la pleined3.svg.arc()...
?Je ne sais pas si cela aide, mais j'ai été en mesure de créer des arcs où je place le texte, à la fois, sur l'arc et juste à l'extérieur il. Dans un cas, où je place la grandeur de l'arc dans les arcs, je tourne le texte sur l'arc pour correspondre à l'angle de l'arc. Dans les autres, où je place le texte à l'extérieur de l'arc, il est tout simplement à l'horizontale. Le code est situé à: http://bl.ocks.org/2295263
De Mon Mieux,
Frank
oui bébé, c'est SOHCAHTOA
JS:
Suivantes CoffeeScript a fonctionné pour moi d'obtenir des étiquettes toujours à l'intérieur de la tarte de tranches, mais vers le bord extérieur:
C'était faible coût de la réponse que j'ai été heureux avec. Il repousse toutes les étiquettes horizontalement (c'est là que j'ai eu l'espace supplémentaire):
Que j'ai obtenu le même par tirage au pourcentage d'étiquettes à l'extérieur du graphique graphique, voici le code http://bl.ocks.org/farazshuja/e2cb52828c080ba85da5458e2304a61f