dc.js 条形图从右到左
dc.js rowChart with bars going from right to left
整个问题都在标题中。
对于 dc.js
库中的 rowChart
如何使条形图从右向左移动而不是相反的默认行为?
默认行为:
我还创建了一个jsFiddle。
如果绘制负值,零轴将在右侧,条形图将向左增长。
speedSumGroup = runDimension.group().reduceSum(function(d) {
return -d.Speed * d.Run / 1000;
});
编辑:最好更改 valueAccessor
:
.valueAccessor(kv => -kv.value)
这会单独保留值,因此您不必更改标签函数,它会保留从大到小的顺序:
至于右对齐标签,这并不像听起来那么容易,因为在 SVG 中,所有位置都是从右上角开始测量的。要完美地做到这一点需要对图书馆做出贡献(如果你愿意的话;),但如果你不介意在条形动画后显示标签,你可以通过观察图表上的事件来做到这一点:
var first = true;
chart.on('pretransition', function(chart) {
if(first)
chart.selectAll('text.row')
.attr('visibility', 'hidden');
else
chart.selectAll('text.row')
.attr('x', function(d) {
return +d3.select(this.parentNode)
.select('rect').attr('width')-10;
})
.attr('text-anchor', 'end')
first = false;
});
chart.on('renderlet', function(chart) {
chart.selectAll('text.row')
.attr('x', function(d) {
return +d3.select(this.parentNode)
.select('rect').attr('width')-10;
})
.attr('text-anchor', 'end')
.attr('visibility', 'visible');
});
这隐藏了第一次对条形图进行动画处理,然后当它们完成时,它会将它们移动到根据 rect
的宽度确定的位置,该元素是同一 [=15= 中的同级元素],并将它们锚定在最后。 (即它右对齐它们。这可能会破坏 RTL 语言,但我怀疑标签已经在这些语言中破坏了。)
它还设置了每次后续重绘开始时的位置,以擦除图表要放置它们的位置。
我怀疑数据变化时仍然会有伪影。为了正确地做到这一点,标签必须是动画的,以便在变化时始终匹配条形宽度!否则它们必须从父级 g
中移出,这样它们的位置是绝对的并且不受条形宽度的影响。
整个问题都在标题中。
对于 dc.js
库中的 rowChart
如何使条形图从右向左移动而不是相反的默认行为?
默认行为:
我还创建了一个jsFiddle。
如果绘制负值,零轴将在右侧,条形图将向左增长。
speedSumGroup = runDimension.group().reduceSum(function(d) {
return -d.Speed * d.Run / 1000;
});
编辑:最好更改 valueAccessor
:
.valueAccessor(kv => -kv.value)
这会单独保留值,因此您不必更改标签函数,它会保留从大到小的顺序:
至于右对齐标签,这并不像听起来那么容易,因为在 SVG 中,所有位置都是从右上角开始测量的。要完美地做到这一点需要对图书馆做出贡献(如果你愿意的话;),但如果你不介意在条形动画后显示标签,你可以通过观察图表上的事件来做到这一点:
var first = true;
chart.on('pretransition', function(chart) {
if(first)
chart.selectAll('text.row')
.attr('visibility', 'hidden');
else
chart.selectAll('text.row')
.attr('x', function(d) {
return +d3.select(this.parentNode)
.select('rect').attr('width')-10;
})
.attr('text-anchor', 'end')
first = false;
});
chart.on('renderlet', function(chart) {
chart.selectAll('text.row')
.attr('x', function(d) {
return +d3.select(this.parentNode)
.select('rect').attr('width')-10;
})
.attr('text-anchor', 'end')
.attr('visibility', 'visible');
});
这隐藏了第一次对条形图进行动画处理,然后当它们完成时,它会将它们移动到根据 rect
的宽度确定的位置,该元素是同一 [=15= 中的同级元素],并将它们锚定在最后。 (即它右对齐它们。这可能会破坏 RTL 语言,但我怀疑标签已经在这些语言中破坏了。)
它还设置了每次后续重绘开始时的位置,以擦除图表要放置它们的位置。
我怀疑数据变化时仍然会有伪影。为了正确地做到这一点,标签必须是动画的,以便在变化时始终匹配条形宽度!否则它们必须从父级 g
中移出,这样它们的位置是绝对的并且不受条形宽度的影响。