DC 很好,因为您可以将维度和组直接传递给图形对象本身,而不必手动更新对交叉过滤器的更改。
如果您想将 Crossfilter 和 NVD3 绑定在一起,您需要手动更新 NVD3 域/范围或有关更改 crossfilter 维度/组状态的数据。如果您查看源代码,这基本上就是 Crossfilter 页面示例的处理方式:http: //square.github.io/crossfilter/。每当画笔发生变化时,图形都会重新绘制并更新以反映变化。
让 NVD3 图表重绘和反映新数据很容易。您可以更新数据并再次调用条形图......例如。
var svg = d3.select("body").append("svg").style("height", "500px");
var barChart = nv.models.multiBarChart();
// Just execute this block each time the chart data changes
// and the chart will update in a nicely animated manner
svg
.datum(chartData)
.transition()
.duration(500)
.call(barChart);
棘手的部分实际上是如果您想在 NVD3 图表中内置画笔。这可能会变得棘手,因为您必须保持画笔与 NVD3 图表同步,因为它们的数据已更改以便正确绘制,但如果您只想根据另一个图表的画笔事件正确更新 NVD3 图表或你根本不关心刷子,它根本不应该太难。关于画笔的好教程在这里:http ://bl.ocks.org/mbostock/1667367
尽管如此,NVD3 还是非常擅长暴露几乎所有底层图表组件(刻度、轴等),这意味着您可以根据需要访问、添加和更新画笔,然后注册画笔事件,更新crossfilter,然后根据需要重新绘制图表。
它也是开源的,因此您的另一个选择是分叉存储库并将画笔支持和事件直接添加到源代码中。
就个人而言,我制作了一个自定义时间线图表,它使用画笔并在画笔更新时触发事件。在事件中,我更新 NVD3 堆积条形图的数据并重新绘制它。因此,当您更改时间线过滤器时,条形图会动画并更新。看到它在行动中很漂亮。
无论哪种方式,听起来都是一个有趣的挑战。祝你好运!