是否可以滚动 div 以适应 dc.js 行图中的柱数
Is it possible to have a scrolling div that adjusts to the number of bars in a dc.js rowchart
我有几个行图,它们通过 dc.js 相互连接。
正如 . However these rowcharts also implement filtering and removing 所解释的那样,这些行图在不同 div 的顶部有 x 轴,因此,每当我在一个行图中过滤时,其他行图中的条形数量就会减少,但它会保持大小可滚动 div,即使显示的内容下方没有栏。此外,我很确定这很容易,但我还没有想出如何将重置按钮放在图表下方,因为它显示在图表 div 和轴 div 之间,如图所示下面。
有没有办法解决这些问题?
这是我在每个行图中的内容 div:
<div id='axis'></div>
<div id="chart" style="overflow-y:auto; height:200px;">
<div>
<span class="reset" style="display: none;">Phylum seleccionado(s):
<span class="filter"></span>
<a class="reset" href="javascript:Chart.filterAll();dc.redrawAll();" style="display">Reset</a>
</span>
</div>
</div>
这就是我在 main.js 的每个行图中所拥有的:
Chart
.fixedBarHeight(20)
.height(nonEmpty.all().length * 20 + 1)
.margins({top: 0, right: 20, bottom: 0, left: 20})
.width(600)
.xAxis(d3.axisTop())
.elasticX(true)
.ordinalColors(['#e41a1c'])
.gap(1)
.dimension(Dim)
.group(nonEmpty) //this removes the ones that don't match the filter of the other rowchart
.on('pretransition', function () {
Chart.select('g.axis').attr('transform', 'translate(0,0)');
Chart.selectAll('line.grid-line').attr('y2', Chart.effectiveHeight());
});
部分答案在这里。好吧,它回答了您的问题,但没有回答我期望的下一个问题。 :(
您目前正在根据柱数调整图表的大小,当柱数发生变化时您需要调整图表的大小。
这应该在 preRedraw
处理程序中完成,但不幸的是 preRedraw is currently fired after resizing is done。所以目前你必须覆盖 .redraw()
:
dc.override(chart, 'redraw', function() {
chart.height(chart.group().all().length * 21);
return chart._redraw();
})
关于将信息和控件放在图表之后,有两个问题,我只能解决其中一个。
dc.js 会将 svg
元素附加到图表 div。对此有更多控制会很好,但我不确定该怎么做。目前,最简单的解决方法是重新附加信息 div:
chart.on('postRender', function() {
chart.root().node().appendChild(chart.select('div.info').node())
})
但是,您真正想要的可能是从滚动 div 中提取信息 div,我目前无法弄清楚。问题是图表期望 controls/info 位于图表 div 内,而这与需要滚动的图表相同。
我试着在图表 div 中添加另一个滚动 div,然后将 svg 移动到它下面。这可行,但它会产生一些烦人的闪烁。
Here's what I got so far。如果我想到更好的解决方案,我可能会 return 稍后再解决这个问题。
更新:滚动条外的控件
为了解决这个问题,我们需要图表外的控件div。
我们可以将 baseMixin.turnOnControls 移植到 filtered
事件处理程序,并执行与图表相同的显示和填充操作:
function turnOnControls(_chart, controls) {
var attribute = _chart.controlsUseVisibility() ? 'visibility' : 'display';
controls.selectAll('.reset').style(attribute, null);
controls.selectAll('.filter').text(dc.printers.filters(_chart.filters())).style(attribute, null);
}
function turnOffControls(_chart, controls) {
var attribute = _chart.controlsUseVisibility() ? 'visibility' : 'display';
var value = _chart.controlsUseVisibility() ? 'hidden' : 'none';
controls.selectAll('.reset').style(attribute, value);
controls.selectAll('.filter').style(attribute, value).text(_chart.filter());
}
function filter_function(controls) {
return chart => {
chart.hasFilter() ?
turnOnControls(chart, controls) :
turnOffControls(chart, controls);
}
}
chart.on('filtered', filter_function(d3.select('#info')));
此外,controlsUseVisibility 和 visibility: hidden
更好,因为 shown/hidden 时控件会影响布局。
我有几个行图,它们通过 dc.js 相互连接。
有没有办法解决这些问题?
这是我在每个行图中的内容 div:
<div id='axis'></div>
<div id="chart" style="overflow-y:auto; height:200px;">
<div>
<span class="reset" style="display: none;">Phylum seleccionado(s):
<span class="filter"></span>
<a class="reset" href="javascript:Chart.filterAll();dc.redrawAll();" style="display">Reset</a>
</span>
</div>
</div>
这就是我在 main.js 的每个行图中所拥有的:
Chart
.fixedBarHeight(20)
.height(nonEmpty.all().length * 20 + 1)
.margins({top: 0, right: 20, bottom: 0, left: 20})
.width(600)
.xAxis(d3.axisTop())
.elasticX(true)
.ordinalColors(['#e41a1c'])
.gap(1)
.dimension(Dim)
.group(nonEmpty) //this removes the ones that don't match the filter of the other rowchart
.on('pretransition', function () {
Chart.select('g.axis').attr('transform', 'translate(0,0)');
Chart.selectAll('line.grid-line').attr('y2', Chart.effectiveHeight());
});
部分答案在这里。好吧,它回答了您的问题,但没有回答我期望的下一个问题。 :(
您目前正在根据柱数调整图表的大小,当柱数发生变化时您需要调整图表的大小。
这应该在 preRedraw
处理程序中完成,但不幸的是 preRedraw is currently fired after resizing is done。所以目前你必须覆盖 .redraw()
:
dc.override(chart, 'redraw', function() {
chart.height(chart.group().all().length * 21);
return chart._redraw();
})
关于将信息和控件放在图表之后,有两个问题,我只能解决其中一个。
dc.js 会将 svg
元素附加到图表 div。对此有更多控制会很好,但我不确定该怎么做。目前,最简单的解决方法是重新附加信息 div:
chart.on('postRender', function() {
chart.root().node().appendChild(chart.select('div.info').node())
})
但是,您真正想要的可能是从滚动 div 中提取信息 div,我目前无法弄清楚。问题是图表期望 controls/info 位于图表 div 内,而这与需要滚动的图表相同。
我试着在图表 div 中添加另一个滚动 div,然后将 svg 移动到它下面。这可行,但它会产生一些烦人的闪烁。
Here's what I got so far。如果我想到更好的解决方案,我可能会 return 稍后再解决这个问题。
更新:滚动条外的控件
为了解决这个问题,我们需要图表外的控件div。
我们可以将 baseMixin.turnOnControls 移植到 filtered
事件处理程序,并执行与图表相同的显示和填充操作:
function turnOnControls(_chart, controls) {
var attribute = _chart.controlsUseVisibility() ? 'visibility' : 'display';
controls.selectAll('.reset').style(attribute, null);
controls.selectAll('.filter').text(dc.printers.filters(_chart.filters())).style(attribute, null);
}
function turnOffControls(_chart, controls) {
var attribute = _chart.controlsUseVisibility() ? 'visibility' : 'display';
var value = _chart.controlsUseVisibility() ? 'hidden' : 'none';
controls.selectAll('.reset').style(attribute, value);
controls.selectAll('.filter').style(attribute, value).text(_chart.filter());
}
function filter_function(controls) {
return chart => {
chart.hasFilter() ?
turnOnControls(chart, controls) :
turnOffControls(chart, controls);
}
}
chart.on('filtered', filter_function(d3.select('#info')));
此外,controlsUseVisibility 和 visibility: hidden
更好,因为 shown/hidden 时控件会影响布局。