J'ai un ensemble de données que je trace dans un nuage. Lorsque je passe la souris sur l'un des cercles, je voudrais qu'il apparaisse avec des données (comme les valeurs x, y, peut-être plus). Voici ce que j'ai essayé d'utiliser:
vis.selectAll("circle")
.data(datafiltered).enter().append("svg:circle")
.attr("cx", function(d) { return x(d.x);})
.attr("cy", function(d) {return y(d.y)})
.attr("fill", "red").attr("r", 15)
.on("mouseover", function() {
d3.select(this).enter().append("text")
.text(function(d) {return d.x;})
.attr("x", function(d) {return x(d.x);})
.attr("y", function (d) {return y(d.y);}); });
Je soupçonne que j'ai besoin d'être plus informatif sur les données à saisir?
Réponses:
Je suppose que vous voulez une info-bulle. Le moyen le plus simple de le faire est d'ajouter un
svg:title
élément à chaque cercle, car le navigateur se chargera d'afficher l'info-bulle et vous n'avez pas besoin du gestionnaire de la souris. Le code serait quelque chose commeSi vous voulez des infobulles plus sophistiquées, vous pouvez utiliser par exemple tipy. Voir ici pour un exemple.
la source
svg:g
que vous superposez avec le cercle réel, mais ne donnez aucune largeur et hauteur. Actuellement, il prend la boîte englobante et place l'info-bulle au bord. Jouer avec les options de tipy pourrait également aider.Un très bon moyen de créer une info-bulle est décrit ici: Exemple d'infobulle simple D3
Vous devez ajouter un div
Ensuite, vous pouvez simplement le basculer en utilisant
d3.event.pageX
/d3.event.pageY
est la coordonnée courante de la souris.Si vous souhaitez modifier le texte, vous pouvez utiliser
tooltip.text("my tooltip text");
Exemple de travail
la source
Il existe une bibliothèque géniale pour faire cela que j'ai récemment découverte. C'est simple à utiliser et le résultat est assez soigné: d3-tip.
Vous pouvez voir un exemple ici :
En gros, tout ce que vous avez à faire est de télécharger ( index.js ), d'inclure le script:
puis suivez les instructions d' ici (même lien que l'exemple)
Mais pour votre code, ce serait quelque chose comme:
définir la méthode:
créez votre svg (comme vous le faites déjà)
appelez la méthode:
ajoutez une astuce à votre objet:
N'oubliez pas d'ajouter le CSS:
la source
Vous pouvez transmettre les données à utiliser dans le mouseover comme ceci - l'événement mouseover utilise une fonction avec vos
enter
données précédemment éditées comme argument (et l'index comme deuxième argument) donc vous n'avez pas besoin de l'utiliserenter()
une deuxième fois.la source
d3.select(this)
pour modifier la forme et je ne savais pas comment obtenir l'instance dans une entrée / mise à jour.Cet exemple concis montre comment créer une info-bulle personnalisée dans d3.
la source
return tooltip.style("top", (d.x + 40) + "px") .style("left", (d.y + 80) + "px");
dans l''mousemove'
attribut. Lad.x
volonté aide à déplacer l'outil pointe par rapport à l'objet, et non pas la page entière