如何将 crossfilter(ed) 数据集连接到 d3 图表?
How do I connect a crossfilter(ed) dataset to a d3 chart?
我已经使用我现有的数据集成功创建了一个交叉过滤器对象,创建了一个维度并添加了一个过滤器:
var calendarData = crossfilter([
{start_date: "2015-07-01",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-07-01",end_date: "2015-07-24",Channel: "Twitter"},
{start_date: "2015-07-15",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-08-05",end_date: "2015-09-24",Channel: "Facebook"},
{start_date: "2015-08-05",end_date: "2015-08-10",Channel: "Facebook"}
]);
// create dimension, based on Channel
var calendarDataByChannel = calendarData.dimension(function(d) { return d.Channel; });
// filter by Twitter
var calendarDataFilter = calendarDataByChannel.filter("Twitter");
然后我创建一个 svg 并尝试按照正常的 d3 功能附加矩形和诸如此类的东西,引用交叉过滤器:
var rectangles = svg.append("g")
.selectAll("rect")
.data(calendarData)
.enter();
但是没用。连接到交叉过滤数据的正确方法是什么?
我不想在这个项目中使用 dc.js,我能找到的所有示例通常都与 dc 有关。
谢谢,
基思
两行变化:
您的代码
var calendarDataFilter = calendarDataByChannel.filter("Twitter");
应该是:
var calendarDataFilter = calendarDataByChannel.filter("Twitter").top(Infinity);
接下来你的代码:
var rectangles = svg.append("g")
.selectAll("rect")
.data(calendarData)
.enter();
应该是
var rectangles = svg.append("g")
.selectAll("rect")
.data(calendarDataFilter)
.enter();
工作代码here
希望对您有所帮助!
Crossfilter 中的维度和过滤器是有状态的。所以这里最后一行的日志将是 true
.
var calendarData = crossfilter([
{start_date: "2015-07-01",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-07-01",end_date: "2015-07-24",Channel: "Twitter"},
{start_date: "2015-07-15",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-08-05",end_date: "2015-09-24",Channel: "Facebook"},
{start_date: "2015-08-05",end_date: "2015-08-10",Channel: "Facebook"}
]);
var calendarDataByChannel = calendarData.dimension(function(d) { return d.Channel; });
var calendarDataFilter = calendarDataByChannel.filter("Twitter");
console.lot(calendarDataByChannel === calendarDataFilter);
写这个的惯用方式更像是
var calendarData = crossfilter([
{start_date: "2015-07-01",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-07-01",end_date: "2015-07-24",Channel: "Twitter"},
{start_date: "2015-07-15",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-08-05",end_date: "2015-09-24",Channel: "Facebook"},
{start_date: "2015-08-05",end_date: "2015-08-10",Channel: "Facebook"}
]);
// create dimension, based on Channel
var calendarDataByChannel = calendarData.dimension(function(d) { return d.Channel; });
// filter by Twitter
calendarDataByChannel.filter("Twitter");
var rectangles = svg.append("g")
.selectAll("rect")
.data(calendarDataByChannel.top(Infinity))
.enter();
您可能想看一下非常好的 Crossfilter 教程,例如:http://blog.rusty.io/2012/09/17/crossfilter-tutorial/在这里提问也有效:-)
我已经使用我现有的数据集成功创建了一个交叉过滤器对象,创建了一个维度并添加了一个过滤器:
var calendarData = crossfilter([
{start_date: "2015-07-01",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-07-01",end_date: "2015-07-24",Channel: "Twitter"},
{start_date: "2015-07-15",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-08-05",end_date: "2015-09-24",Channel: "Facebook"},
{start_date: "2015-08-05",end_date: "2015-08-10",Channel: "Facebook"}
]);
// create dimension, based on Channel
var calendarDataByChannel = calendarData.dimension(function(d) { return d.Channel; });
// filter by Twitter
var calendarDataFilter = calendarDataByChannel.filter("Twitter");
然后我创建一个 svg 并尝试按照正常的 d3 功能附加矩形和诸如此类的东西,引用交叉过滤器:
var rectangles = svg.append("g")
.selectAll("rect")
.data(calendarData)
.enter();
但是没用。连接到交叉过滤数据的正确方法是什么?
我不想在这个项目中使用 dc.js,我能找到的所有示例通常都与 dc 有关。
谢谢, 基思
两行变化:
您的代码
var calendarDataFilter = calendarDataByChannel.filter("Twitter");
应该是:
var calendarDataFilter = calendarDataByChannel.filter("Twitter").top(Infinity);
接下来你的代码:
var rectangles = svg.append("g")
.selectAll("rect")
.data(calendarData)
.enter();
应该是
var rectangles = svg.append("g")
.selectAll("rect")
.data(calendarDataFilter)
.enter();
工作代码here
希望对您有所帮助!
Crossfilter 中的维度和过滤器是有状态的。所以这里最后一行的日志将是 true
.
var calendarData = crossfilter([
{start_date: "2015-07-01",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-07-01",end_date: "2015-07-24",Channel: "Twitter"},
{start_date: "2015-07-15",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-08-05",end_date: "2015-09-24",Channel: "Facebook"},
{start_date: "2015-08-05",end_date: "2015-08-10",Channel: "Facebook"}
]);
var calendarDataByChannel = calendarData.dimension(function(d) { return d.Channel; });
var calendarDataFilter = calendarDataByChannel.filter("Twitter");
console.lot(calendarDataByChannel === calendarDataFilter);
写这个的惯用方式更像是
var calendarData = crossfilter([
{start_date: "2015-07-01",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-07-01",end_date: "2015-07-24",Channel: "Twitter"},
{start_date: "2015-07-15",end_date: "2015-09-01",Channel: "Twitter"},
{start_date: "2015-08-05",end_date: "2015-09-24",Channel: "Facebook"},
{start_date: "2015-08-05",end_date: "2015-08-10",Channel: "Facebook"}
]);
// create dimension, based on Channel
var calendarDataByChannel = calendarData.dimension(function(d) { return d.Channel; });
// filter by Twitter
calendarDataByChannel.filter("Twitter");
var rectangles = svg.append("g")
.selectAll("rect")
.data(calendarDataByChannel.top(Infinity))
.enter();
您可能想看一下非常好的 Crossfilter 教程,例如:http://blog.rusty.io/2012/09/17/crossfilter-tutorial/在这里提问也有效:-)