J'utilise le composant piechart.js de nvd3 pour générer un piechart sur mon site. Le fichier .js fourni comprend plusieurs var, 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 mes js en ligne, j'ai pu remplacer certaines de ces variables, comme ceci (overliding showLegend and 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 la info-bulle de la même manière:
.tooltip(function(key, y, e, graph) { return 'Some String' })
Mais quand je fais ça, mon piechart ne s'affiche pas du tout. Pourquoi ne puis-je pas écraser la info-bulle ici? Y a-t-il une autre façon de le faire? Je préférerais plutôt ne pas avoir à modifier piechart.js lui-même du tout; Je dois garder ce fichier générique pour être utilisé dans plusieurs widgets.
Et pendant que nous sommes là, est-ce que je peux faire de l'info-bulle entière un lien cliquable?
Il suffit de remplacer de cette façon, il fonctionnera certainement
function tooltipContent(key, y, e, graph) { return '<h3>' + key + '</h3>' +'<p>' + y + '</p>' ; }
Ou
tooltipContent(function(key, y, e, graph) { return 'Some String' })
Je viens d'avoir le même problème, avec nvd3 1.8.1, et c'est la solution que j'ai trouvée.
Sans l'option useInteractiveGuideline
vous pouvez simplement déclarer votre fonction génératrice d' chart.tooltip.contentGenerator(function (d){ YOUR_FUNCTION_HERE})
dans chart.tooltip.contentGenerator(function (d){ YOUR_FUNCTION_HERE})
:
L'argument d
est donné par nvd3 lors de l'appel de la info-bulle, et il possède trois propriétés:
value
: la valeur de l'axe des x pour la position du curseur index
: l'indice dans la datum
du diagramme correspondant à la position du curseur series
: un tableau contenant, pour chaque élément du tableau:
key
: la clé de légende pour cet élément value
: la valeur de l'axe y pour cet élément à la position du curseur color
: la couleur de la légende pour cet élément Donc, voici un exemple:
chart.tooltip.contentGenerator(function (d) { var html = "<h2>"+d.value+"</h2> <ul>"; d.series.forEach(function(elem){ html += "<li><h3 style='color:"+elem.color+"'>" +elem.key+"</h3> : <b>"+elem.value+"</b></li>"; }) html += "</ul>" return html; })
Note importante
Lorsque l'option useInteractiveGuideline
est utilisée, l'objet chart.tooltip
n'est pas utilisé pour générer la info-bulle, vous devez plutôt utiliser le chart.interactiveLayer.tooltip
, c'est-à-dire:
this.chart.interactiveLayer.tooltip.contentGenerator(function (d) { ... })
J'espère que la réponse vous sera utile, même si tard.
L'info-bulle personnalisée ne peut pas exister avec "useInteractiveGuideline".
Pour ajouter aux réponses précédentes, vous souhaitez parfois utiliser les données de la série et non seulement de x
et 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 que la souris e.pointIndex
, e.pointIndex
est l'index sur les valeurs de la série. Ici e.series.key == key
, mais j'ai e.series
ce qu'est e.series
.
Si vous utilisez l'enveloppe Angular NVD3 , la façon de définir le message personnalisé se fait par des options de graphique, simplement:
$scope.options = { chart: { ... tooltip: { contentGenerator: function(d) { return d.series[0].key + ' ' + d.series[0].value; } }, ... } };
my_chart = nv.models.multiBarChart() .tooltip(function(key, x, y, e, graph) { return '<h3>' + key + '</h3>' + '<p>' + y + ' on ' + x + '</p>'; });
Je pense que vous manquez le paramètre 'x' dans votre fonction tooltip. Le format de l'appel de fonction est le suivant:
function(key, x, y, e, graph)
var chart = nv.models.multiBarChart(); chart.tooltip.contentGenerator(function (obj) { return JSON.stringify("<b>HOHO</b>") })
Cela a fonctionné pour moi …
interactive:true, tooltips: true, tooltip: { contentGenerator: function (d) { return '<h3>PUT YOUR DATA HERE Eg d.data.name</h3>' } }