在系列图表中使用画笔时饼图无法正确更新
Pie chart not updating properly when using brush in series chart
我有 1 个饼图和 1 个带画笔的系列折线图。当前,当我刷饼图更新时,无论选择的范围如何,都显示相同的结果。如何使笔刷正常工作?
const pieChart = dc.pieChart('#piechart');
const chart = dc.seriesChart('#chart');
const groupParameter = 'markdown';
const data = d3.csvParse(d3.select('pre#data').text());
data.forEach(d => {
d.week = +d.week;
d.markdown = +d.markdown;
});
const ndx = crossfilter(data);
const pieDimension = ndx.dimension(d => d.itemCategory);
const dimension = ndx.dimension(d => [d.itemCategory, d.week]);
const pieGroup = pieDimension.group().reduceSum(d => d[groupParameter]);
const group = dimension.group().reduceSum(d => d[groupParameter]);
pieChart
.width(768)
.height(480)
.dimension(pieDimension)
.group(pieGroup)
.legend(dc.legend());
chart
.width(768)
.height(480)
.chart(c => dc.lineChart(c).curve(d3.curveCardinal))
.x(d3.scaleLinear().domain([27, 38]))
.brushOn(true)
.yAxisLabel(groupParameter)
.yAxisPadding('5%')
.xAxisLabel('Week')
.elasticY(true)
.dimension(dimension)
.group(group)
.mouseZoomable(true)
.seriesAccessor(d => d.key[0])
.keyAccessor(d => d.key[1])
.valueAccessor(d => d.value)
.legend(
dc
.legend()
.itemHeight(13)
.gap(5)
.horizontal(1)
.legendWidth(140)
.itemWidth(70)
);
chart.margins().left += 100;
dc.renderAll();
https://jsfiddle.net/qwertypomy/L37d01e5/#&togetherjs=HF15j0M5pH
似乎没有为系列图表正确实施刷亮。
问题是系列图表的维度键是二维数组,但应用了正常的RangedFilter,不理解这些键。
您可以手动应用一个过滤器处理程序,它会查看密钥的右侧部分:
chart.filterHandler(function(dimensions, filters) {
if (filters.length === 0) {
dimension.filter(null);
} else {
var filter = dc.filters.RangedFilter(filters[0][0], filters[0][1]);
dimension.filterFunction(function(k) {
return filter.isFiltered(k[1]);
});
}
return filters;
});
实际上,我不确定是否有解决此问题的优雅方法。我已经开始一个问题来跟踪它:https://github.com/dc-js/dc.js/issues/1471
编辑: 这不起作用,除非它同时应用于系列图表 及其所有子图表 。效率极低,但像这样:
function filterHandler(dimensions, filters) {
if (filters.length === 0) {
dimension.filter(null);
} else {
var filter = dc.filters.RangedFilter(filters[0][0], filters[0][1]);
dimension.filterFunction(function(k) {
return filter.isFiltered(k[1]);
});
console.log('all',all.value());
}
return filters;
}
chart
.chart(c => dc.lineChart(c).curve(d3.curveCardinal).filterHandler(filterHandler))
.filterHandler(filterHandler);
fiddle 的新版本,dataCount
表明它现在可以正常工作:https://jsfiddle.net/gordonwoodhull/qga6z1yu/39/
我们确实需要一个通用版本的 https://github.com/dc-js/dc.js/pull/682 以仅在共享相同维度的多个图表之间以合作方式应用过滤器一次。
现在,每次更改画笔时,这将应用滤镜四次!
我有 1 个饼图和 1 个带画笔的系列折线图。当前,当我刷饼图更新时,无论选择的范围如何,都显示相同的结果。如何使笔刷正常工作?
const pieChart = dc.pieChart('#piechart');
const chart = dc.seriesChart('#chart');
const groupParameter = 'markdown';
const data = d3.csvParse(d3.select('pre#data').text());
data.forEach(d => {
d.week = +d.week;
d.markdown = +d.markdown;
});
const ndx = crossfilter(data);
const pieDimension = ndx.dimension(d => d.itemCategory);
const dimension = ndx.dimension(d => [d.itemCategory, d.week]);
const pieGroup = pieDimension.group().reduceSum(d => d[groupParameter]);
const group = dimension.group().reduceSum(d => d[groupParameter]);
pieChart
.width(768)
.height(480)
.dimension(pieDimension)
.group(pieGroup)
.legend(dc.legend());
chart
.width(768)
.height(480)
.chart(c => dc.lineChart(c).curve(d3.curveCardinal))
.x(d3.scaleLinear().domain([27, 38]))
.brushOn(true)
.yAxisLabel(groupParameter)
.yAxisPadding('5%')
.xAxisLabel('Week')
.elasticY(true)
.dimension(dimension)
.group(group)
.mouseZoomable(true)
.seriesAccessor(d => d.key[0])
.keyAccessor(d => d.key[1])
.valueAccessor(d => d.value)
.legend(
dc
.legend()
.itemHeight(13)
.gap(5)
.horizontal(1)
.legendWidth(140)
.itemWidth(70)
);
chart.margins().left += 100;
dc.renderAll();
https://jsfiddle.net/qwertypomy/L37d01e5/#&togetherjs=HF15j0M5pH
似乎没有为系列图表正确实施刷亮。
问题是系列图表的维度键是二维数组,但应用了正常的RangedFilter,不理解这些键。
您可以手动应用一个过滤器处理程序,它会查看密钥的右侧部分:
chart.filterHandler(function(dimensions, filters) {
if (filters.length === 0) {
dimension.filter(null);
} else {
var filter = dc.filters.RangedFilter(filters[0][0], filters[0][1]);
dimension.filterFunction(function(k) {
return filter.isFiltered(k[1]);
});
}
return filters;
});
实际上,我不确定是否有解决此问题的优雅方法。我已经开始一个问题来跟踪它:https://github.com/dc-js/dc.js/issues/1471
编辑: 这不起作用,除非它同时应用于系列图表 及其所有子图表 。效率极低,但像这样:
function filterHandler(dimensions, filters) {
if (filters.length === 0) {
dimension.filter(null);
} else {
var filter = dc.filters.RangedFilter(filters[0][0], filters[0][1]);
dimension.filterFunction(function(k) {
return filter.isFiltered(k[1]);
});
console.log('all',all.value());
}
return filters;
}
chart
.chart(c => dc.lineChart(c).curve(d3.curveCardinal).filterHandler(filterHandler))
.filterHandler(filterHandler);
fiddle 的新版本,dataCount
表明它现在可以正常工作:https://jsfiddle.net/gordonwoodhull/qga6z1yu/39/
我们确实需要一个通用版本的 https://github.com/dc-js/dc.js/pull/682 以仅在共享相同维度的多个图表之间以合作方式应用过滤器一次。
现在,每次更改画笔时,这将应用滤镜四次!