dc.js 禁用调整画笔大小
dc.js disable brush resizing
我正在尝试禁用折线图上的画笔范围并设置固定宽度。
我知道这个话题已经讨论过好几次了。我已经尝试解决这个问题但没有成功: 但我找不到符合我的情况的解决方案。
如果有什么不同,我正在扩展这个问题中讨论的可刷序表:
下面是图表初始化代码:
line
.width(950)
.height(350)
.margins({top: 10, right: 50, bottom: 35, left: 30})
.dimension(graphDim)
.keyAccessor(function(kv) { return graphGroup.ord2int(kv.key); })
.group(graphGroup)
.x(d3.scaleLinear().domain(linear_domain))
.xAxisLabel("Chronologie")
.yAxisLabel("Effectif")
.brushOn(true)
.renderArea(true)
.renderHorizontalGridLines(true)
.renderVerticalGridLines(true)
.elasticY(true)
.filter(dc.filters.RangedFilter(0,0.9));
line.yAxis().ticks(4);
line.xAxis()
.tickValues(d3.range(data.length))
.tickFormat(function(d) { return graphGroup.int2ord(d); });
line.filterHandler(function(dimension, filters) {
if(!filters || !filters.length) {
dimension.filter(null);
return filters;
}
console.assert(filters.length === 1);
console.assert(filters[0].filterType === 'RangedFilter');
var inside = graphGroup.all().filter(function(kv) {
var i = graphGroup.ord2int(kv.key);
return filters[0][0] <= i && i < filters[0][1];
}).map(function(kv) { return kv.key; });
dimension.filterFunction(function(d) {
return inside.indexOf(d) >= 0;
});
return filters;
})
和 fiddle:https://jsfiddle.net/bob_magnus_1/sr7hmnvf/9/`
有没有一种简单的方法可以覆盖此类图表中的 coordinateGridMixin.extendBrush
函数?
上一个问题是针对 DCv2 的。固定宽度的画笔在 DCv3+ 中更容易(因为 D3v4 中对 d3-brush 的改进)。
和以前一样的技巧:看extendBrush
是怎么实现的,然后替换掉。这是它在 DCv3 中的样子:
_chart.extendBrush = function (brushSelection) {
if (brushSelection && _chart.round()) {
brushSelection[0] = _chart.round()(brushSelection[0]);
brushSelection[1] = _chart.round()(brushSelection[1]);
}
return brushSelection;
};
(source)
它需要一个 selection – 一个包含两个元素的数组 – 和 returns 一个新的 selection。
在你的情况下,你的数据是有序的,但为了启用刷亮,比例是线性的。笔刷要和刻度相匹配。
要保持 0.9 宽度:
line.extendBrush = function(brushSelection) {
brushSelection[1] = brushSelection[0] + 0.9;
return brushSelection;
};
用 CSS 隐藏笔刷手柄(有奇怪的行为):
.brush .custom-brush-handle {
display: none;
}
带捕捉的顺序画笔
我意识到(看着你的 0.9 宽度画笔)你可能需要适当的顺序刷,它捕捉到一个 selected 点周围的区域。
您可以通过设置 selection 的开始和结束来做到这一点:
line.extendBrush = function(brushSelection) {
brushSelection[0] = Math.round(brushSelection[0]) - 0.5;
brushSelection[1] = brushSelection[0] + 1;
return brushSelection;
};
我们通过四舍五入找到当前悬停的点,然后把它前面的begin设为0.5,后面的end设为0.5。
初始化过滤器以包围零点:
line
.filter(dc.filters.RangedFilter(-0.5,0.5));
浮点错误修复
我注意到如果你select上面的20/30(线性值3),brushSelection[0]
会从2.5变成2.49999999,导致刷机往回跳一个。有些数字不能正确表示为浮点数。
使用开始和结束的平均值更安全:
line.extendBrush = function(brushSelection) {
const point = Math.round((brushSelection[0] + brushSelection[1])/2);
return [
point - 0.5,
point + 0.5
];
};
我正在尝试禁用折线图上的画笔范围并设置固定宽度。
我知道这个话题已经讨论过好几次了。我已经尝试解决这个问题但没有成功:
如果有什么不同,我正在扩展这个问题中讨论的可刷序表:
下面是图表初始化代码:
line
.width(950)
.height(350)
.margins({top: 10, right: 50, bottom: 35, left: 30})
.dimension(graphDim)
.keyAccessor(function(kv) { return graphGroup.ord2int(kv.key); })
.group(graphGroup)
.x(d3.scaleLinear().domain(linear_domain))
.xAxisLabel("Chronologie")
.yAxisLabel("Effectif")
.brushOn(true)
.renderArea(true)
.renderHorizontalGridLines(true)
.renderVerticalGridLines(true)
.elasticY(true)
.filter(dc.filters.RangedFilter(0,0.9));
line.yAxis().ticks(4);
line.xAxis()
.tickValues(d3.range(data.length))
.tickFormat(function(d) { return graphGroup.int2ord(d); });
line.filterHandler(function(dimension, filters) {
if(!filters || !filters.length) {
dimension.filter(null);
return filters;
}
console.assert(filters.length === 1);
console.assert(filters[0].filterType === 'RangedFilter');
var inside = graphGroup.all().filter(function(kv) {
var i = graphGroup.ord2int(kv.key);
return filters[0][0] <= i && i < filters[0][1];
}).map(function(kv) { return kv.key; });
dimension.filterFunction(function(d) {
return inside.indexOf(d) >= 0;
});
return filters;
})
和 fiddle:https://jsfiddle.net/bob_magnus_1/sr7hmnvf/9/`
有没有一种简单的方法可以覆盖此类图表中的 coordinateGridMixin.extendBrush
函数?
上一个问题是针对 DCv2 的。固定宽度的画笔在 DCv3+ 中更容易(因为 D3v4 中对 d3-brush 的改进)。
和以前一样的技巧:看extendBrush
是怎么实现的,然后替换掉。这是它在 DCv3 中的样子:
_chart.extendBrush = function (brushSelection) {
if (brushSelection && _chart.round()) {
brushSelection[0] = _chart.round()(brushSelection[0]);
brushSelection[1] = _chart.round()(brushSelection[1]);
}
return brushSelection;
};
(source)
它需要一个 selection – 一个包含两个元素的数组 – 和 returns 一个新的 selection。
在你的情况下,你的数据是有序的,但为了启用刷亮,比例是线性的。笔刷要和刻度相匹配。
要保持 0.9 宽度:
line.extendBrush = function(brushSelection) {
brushSelection[1] = brushSelection[0] + 0.9;
return brushSelection;
};
用 CSS 隐藏笔刷手柄(有奇怪的行为):
.brush .custom-brush-handle {
display: none;
}
带捕捉的顺序画笔
我意识到(看着你的 0.9 宽度画笔)你可能需要适当的顺序刷,它捕捉到一个 selected 点周围的区域。
您可以通过设置 selection 的开始和结束来做到这一点:
line.extendBrush = function(brushSelection) {
brushSelection[0] = Math.round(brushSelection[0]) - 0.5;
brushSelection[1] = brushSelection[0] + 1;
return brushSelection;
};
我们通过四舍五入找到当前悬停的点,然后把它前面的begin设为0.5,后面的end设为0.5。
初始化过滤器以包围零点:
line
.filter(dc.filters.RangedFilter(-0.5,0.5));
浮点错误修复
我注意到如果你select上面的20/30(线性值3),brushSelection[0]
会从2.5变成2.49999999,导致刷机往回跳一个。有些数字不能正确表示为浮点数。
使用开始和结束的平均值更安全:
line.extendBrush = function(brushSelection) {
const point = Math.round((brushSelection[0] + brushSelection[1])/2);
return [
point - 0.5,
point + 0.5
];
};