Vous avez la bonne idée, c'est juste un désaccord de données.
La chose importante à comprendre est que tous les filtres dans crossfilter se font à travers les objets de dimension. La valeur que vous filtrez doit être compatible avec la dimension sur laquelle vous filtrez.
Par conséquent, puisque votre graphique en ligne est basé sur le temps, vous ne pourrez pas le filtrer par Source
. Vous devrez configurer une autre dimension pour le faire :
var sourceDim2 = spendData2.dimension(function(d) { return d.Source; })
Ensuite, filtrez cette dimension plutôt que le graphique en ligne :
sobRingChart.on('filtered', function(chart) {
if(chart.filters().length)
sourceDim2.filterFunction(function(k) {
return chart.filters().indexOf(k) !== -1;
});
else sourceDim2.filter(null);
dc.redrawAll()
});
C'est compliqué seulement parce qu'il doit gérer le filtrage sur plusieurs valeurs (lorsque plus d'une tranche du graphique en anneau est sélectionnée). Crossfilter ne le rend pas simple, probablement parce que ce n'est pas très efficace. (Ce n'est généralement pas très important.)
Nous devons donc voir s'il y a des filtres. S'il y en a, nous définissons une fonction de filtre qui vérifie si la clé actuellement considérée est dans chart.filters()
. Sinon, nous appelons .filter(null)
pour effacer le filtre.