40 votes

nvd3 piechart.js - Comment modifier l'infobulle ?

J'utilise le composant piechart.js de nvd3 pour générer un camembert sur mon site. Le fichier .js fourni comprend plusieurs var's, comme suit :

var margin = {top: 30, right: 20, bottom: 20, left: 20}
    , width = null
    , height = null
    , showLegend = true
    , color = nv.utils.defaultColor()
    , tooltips = true
    , tooltip = function(key, y, e, graph) {
        return '<h3>' + key + '</h3>' +
               '<p>' +  y + '</p>'
      }
    , noData = "No Data Available."
    , dispatch = d3.dispatch('tooltipShow', 'tooltipHide')
;

Dans mon js en ligne, j'ai pu remplacer certaines de ces variables, comme ceci (remplacement de showLegend et margin) :

var chart = nv.models.pieChart()
    .x(function(d) { return d.label })
    .y(function(d) { return d.value })
    .showLabels(false)
    .showLegend(false)
    .margin({top: 10, right: 0, bottom: 0, left: 0})
    .donut(true);

J'ai essayé d'écraser l'infobulle de la même manière :

.tooltip(function(key, y, e, graph) { return 'Some String' })

mais lorsque je fais cela, mon camembert ne s'affiche pas du tout. Pourquoi ne puis-je pas écraser l'info-bulle ici ? Existe-t-il un autre moyen de le faire ? Je préférerais vraiment ne pas avoir à modifier piechart.js lui-même ; j'ai besoin de garder ce fichier générique pour l'utiliser dans plusieurs widgets.

Et pendant que nous y sommes, y a-t-il un moyen de transformer toute l'infobulle en un lien cliquable ?

4 votes

Je ne suis pas un expert en nvd3, je viens juste de commencer à jouer avec. J'ai eu le même problème que toi, ce que tu cherches est : .tooltipContent(function(key, y, e, graph) { return 'Some String' }) Et pendant que nous y sommes, y a-t-il un moyen de transformer toute l'infobulle en un lien cliquable ? Vous pouvez renvoyer n'importe quel HTML pour l'infobulle, mais comme elle apparaît/disparaît au survol, vous aurez du mal à cliquer dessus.

56voto

user1847371 Points 351

Il suffit de passer outre de cette manière pour que cela fonctionne définitivement.

function tooltipContent(key, y, e, graph) {
            return '<h3>' + key + '</h3>' +'<p>' + y + '</p>' ;
        }

Ou

tooltipContent(function(key, y, e, graph) { return 'Some String' })

1 votes

+1 pour la solution alternative. J'ai utilisé .tooltip(..) pour un grand nombre de cartes NVD3, et j'ai juste dû utiliser .tooltipContent(..) pour le lineChart.js

0 votes

Pouvez-vous me dire, s'il vous plaît, comment je peux modifier cette méthode pour le graphique linéaire de NVD3 car le tooltipcontent ne fonctionne pas dans ce cas ?

6 votes

@MitakshGupta tooltipContent est déprécié, utilisez chart.tooltip.contentGenerator au lieu de

15voto

user2612936 Points 31

L'info-bulle personnalisée ne peut pas exister avec "useInteractiveGuideline".

4 votes

Il est désormais possible d'avoir un contenu personnalisé avec des directives interactives à partir de la version 1.8.1 ( github.com/novus/nvd3/tree/v1.8.1-alpha ).

5voto

J. C. Leitão Points 2136

Pour ajouter aux réponses précédentes, parfois vous voulez utiliser les données de la série et pas seulement de x y y . Par exemple, lorsque

data = {'values': [{'month': 1, 'count': 2}, ...], 'key': 'test' }

Pour ces situations, utilisez

.tooltip(function(key, x, y, e, graph) {
         var d = e.series.values[e.pointIndex];
         return '<h3>' + e.series.key + '</h3><p>' + d.month.toString() + ...;
 });

e.series est la série particulière sur laquelle la souris se trouve, e.pointIndex est l'indice sur les valeurs de la série. Ici e.series.key == key mais j'avais de l'empathie pour ce qui est e.series .

0 votes

Pourriez-vous prendre un moment pour regarder ma question ici stackoverflow.com/questions/64051027/ Ce que vous dites est très proche de ce que je veux réaliser, et votre structure de données est exactement ce que j'ai, mais ma fonction (d) n'a qu'un seul argument - d, et je ne suis pas en mesure d'atteindre les attributs personnalisés dans le tableau de valeurs via l'argument d.

4voto

Aleck Landgraf Points 191
my_chart = nv.models.multiBarChart()
  .tooltip(function(key, x, y, e, graph) {
    return '<h3>' + key + '</h3>' +
           '<p>' +  y + ' on ' + x + '</p>';
  });

1 votes

Je viens de voter pour cet article de -1 à 0. Pourquoi a-t-il été rétrogradé ? C'était utile.

2 votes

Ce n'était pas moi, mais je suppose que c'est parce que la réponse est incorrecte - la question portait sur les graphiques en secteurs, et l'info-bulle ne fonctionne pas pour les secteurs, elle doit être tooltipContent et il ne devrait pas y avoir de paramètre x.

1 votes

Bien que la question ait été orientée vers les diagrammes circulaires, je suis reconnaissant que cela ait été ajouté. Ma recherche était plus générale.

2voto

jbizzle Points 31

Je pense qu'il vous manque le paramètre 'x' dans votre fonction tooltip. Le format de l'appel de fonction est :

function(key, x, y, e, graph)

1 votes

C'est incorrect - il n'y a pas de paramètre x dans les camemberts ; le problème est qu'il devrait être .tooltipContent comme dans la réponse de user1847371

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X