Comment puis-je inclure des sauts de ligne dans les étiquettes en D3 graphiques?
Je suis en utilisant D3 pour générer un graphique à barres (j'ai adapté le code de cet exemple). Les étiquettes que j'utilise sur le xde l'axe sont un couple de mots de longueur chacune, et de ce fait, toutes les étiquettes de chevauchement j'ai besoin de rompre avec ces étiquettes à travers les lignes. (Ça va être beau si je peut remplacer tous les espaces de chaque étiquette avec des retours à la ligne.)
J'ai d'abord essayé en remplaçant les espaces avec littérale des retours à la ligne (

) et la mise en xml:space="preserve"
sur les étiquettes' <text>
éléments. Malheureusement, il s'avère que le SVG ne respecte pas cette propriété. Ensuite, j'ai essayé d'envelopper chaque mot dans un <tspan>
que je pourrais plus tard de style. J'ai passé chaque étiquette grâce à cette fonction:
function (text) {
return '<tspan>' + text.replace(//g, '</tspan><tspan>') + '</tspan>';
}
mais cela met juste littérale <tspan>
s dans la sortie. Comment puis-je me les étiquettes de texte dans tspan
s (ou de faire autre chose), de sorte que mes étiquettes ne se chevauchent pas?
- Est-ce une double question? stackoverflow.com/questions/4991171/...
- pas vraiment, OP besoin d'insérer
tspan
's pas autowrap texte avec foreignObject (ce qui est exagéré, et non pris en charge par IE9 (et 10?).
Vous devez vous connecter pour publier un commentaire.
J'ai fini par utiliser le code suivant pour casser chaque x-des étiquettes de l'axe à travers les lignes:
Noter que cela suppose que les étiquettes ont déjà été créés. (Si vous suivez la forme canonique de l'histogramme exemple puis les étiquettes ont été mis en place dans juste la façon dont vous avez besoin.) Il n'y a pas de véritables sauts de ligne de la logique actuelle; la fonction convertit chaque espace en un retour à la ligne. Cela correspond à mes fins bien, mais vous devrez peut-être modifier le
split()
ligne pour être plus intelligent sur la façon dont il partitions les parties de la chaîne en lignes.d
ici est un point de données et pas de la chaîne que vous êtes à la mise en forme, afin.split()
(pour moi au moins) ont nécessité une modification ded.description.split("\n");
.d3.select(this).text()
à saisir le réel élément de texte au lieu de la limite de la valeur de données. C'est important pour 2 raisons: tout d'abord, votre axe de valeurs peuvent être des nombres plutôt que des chaînes de caractères (ce code ne fonctionne pas dans ce cas) et la deuxième, mon amélioration permet de personnaliser le texte à être inséré par untickFormat
de la fonction sur l'axe de la génératrice.var dateFormat = d3.timeFormat("%b %e|%H:%M"); ... var el = d3.select(this); var words = el.text().split('|'); el.text('');
SVG élément de texte ne prend pas en charge l'habillage du texte, il y a donc deux options:
Voir Mike Bostock de commentaire sur ce ici.
Quelque chose que j'ai trouvé pour être utile, c'est à l'aide d'un foreignObject' tag au lieu de texte ou tspan éléments. Cela permet, pour la simple intégration de HTML, permettant de mots pour casser naturellement. La réserve étant l'ensemble des dimensions de l'objet de répondre à des besoins particuliers:
Quel que soit les éléments que vous placez à l'intérieur de cet objet peut ensuite être obtenue à l'aide de d3.sélectionner/sélectionner tous de mettre à jour les valeurs de texte dynamique.
Ayant regardé autour, j'ai trouvé que Mike Bostock a fourni une solution vous permettant de renvoyer le texte à la ronde.
http://bl.ocks.org/mbostock/7555321
Pour l'implémenter dans mon code (je suis en utilisant effondré arborescence). J'ai simplement copié le "wrap" la méthode.
Ensuite ajouté les éléments suivants
Je ne vois pas de raison que cela ne devrait pas travailler pour une force dirigée, bar ou tout autre motif
Amendement :
J'ai modifié l'écharpe de la fonction à la suite pour n'importe qui qui lit ceci est à l'aide de collapisible graphique. Le changement de l'attribut "x" détermine la allignment correctement, l'incrémentation de la linenumber a été réalisée sur une ligne distincte que les problèmes ont été relevés dans le code d'origine et "y" a été difficile à zéro sinon des problèmes pourraient survenir dans lequel l'espacement de la ligne a augmenté avec chaque ligne.
Il y a aussi cette réponse de l'habillage de longues étiquettes.
et le fichier de données "les données.tsv":
utilisation
<tspan>
et dans sa.d3
nv.modèles.axe = function() {
...
modifier toutes les occurrences de .texte( à l' .html(