dc-js 图表上的 d3-tip 在过滤 0 值组时消失
d3-tip on dc-js chart disappears upon filtering over 0-valued group
我有很多图表,为简单起见,以 this example on jsfiddle 为例,其中有一个刷图,一个按时间键入的条形图和一个按某些类别键入的行图。此外,我将 d3-tip
库用于工具提示(在上面的 link 中,我的提示的一个非常简化的版本)。
为了避免在 rowChart
中创建栏行,我使用了 dc-js
(以及 here 的常见问题解答中概述的假组).
假组效果很好,没有在行图上显示 C
类别。
但是,如果我刷了一些0数据的月份,当我重置过滤器时(只需点击刷子图表上过滤区域以外的任何地方),行图上的d3-tip
消失。
请注意,如果在没有 fake-grouping-function 的情况下创建组,则不会出现此问题。
- 任何解释为什么会发生这种情况?
- 如何避免这种情况(不丢失
remove_empty_bins
)?
尽管您可以互换使用 dc.js 和 d3.js,并且 dc.js 是有意使用的 "leaky abstraction",但如果您按照惯用的方式使用 [=],有些事情会变得更好37=] 方式。
我有两个建议:
- 应用您的工具提示以响应 dc.js 事件,以便在创建(或重新创建)新图形对象时重新应用它们。
- 修改图表时使用 chart.selectAll 而不是
d3.selectAll
。
好吧,#2 实际上与这个问题无关,但它确实有助于更好地确定选择范围,这样他们就不会错过图表或不小心修改页面其他地方的内容。
实施 #1 看起来像这样:
month_chart.on('pretransition', function(chart) {
chart.selectAll('rect.bar').call(month_tip)
.on('mouseover', month_tip.show).on('mouseout', month_tip.hide);
});
loc_chart1.on('pretransition', function(chart) {
chart.selectAll('g.row').call(loc_tip)
.on('mouseover', loc_tip.show).on('mouseout', loc_tip.hide);
});
pretransition 事件在渲染或重绘后立即触发,因此通常是操作 dc 元素的最佳时机。比 运行 全局代码要好得多。我喜欢设置所有内容,然后调用 dc.renderAll()
,然后让渲染和重绘稍后自行处理。
特别是,当 remove_empty_bins
停止删除它们时这些条重新添加时,这些事件将拾取它们并重新提示它们。
你的 fiddle 的分支:https://jsfiddle.net/gordonwoodhull/5feL3gko/4/
我有很多图表,为简单起见,以 this example on jsfiddle 为例,其中有一个刷图,一个按时间键入的条形图和一个按某些类别键入的行图。此外,我将 d3-tip
库用于工具提示(在上面的 link 中,我的提示的一个非常简化的版本)。
为了避免在 rowChart
中创建栏行,我使用了 dc-js
(以及 here 的常见问题解答中概述的假组).
假组效果很好,没有在行图上显示 C
类别。
但是,如果我刷了一些0数据的月份,当我重置过滤器时(只需点击刷子图表上过滤区域以外的任何地方),行图上的d3-tip
消失。
请注意,如果在没有 fake-grouping-function 的情况下创建组,则不会出现此问题。
- 任何解释为什么会发生这种情况?
- 如何避免这种情况(不丢失
remove_empty_bins
)?
尽管您可以互换使用 dc.js 和 d3.js,并且 dc.js 是有意使用的 "leaky abstraction",但如果您按照惯用的方式使用 [=],有些事情会变得更好37=] 方式。
我有两个建议:
- 应用您的工具提示以响应 dc.js 事件,以便在创建(或重新创建)新图形对象时重新应用它们。
- 修改图表时使用 chart.selectAll 而不是
d3.selectAll
。
好吧,#2 实际上与这个问题无关,但它确实有助于更好地确定选择范围,这样他们就不会错过图表或不小心修改页面其他地方的内容。
实施 #1 看起来像这样:
month_chart.on('pretransition', function(chart) {
chart.selectAll('rect.bar').call(month_tip)
.on('mouseover', month_tip.show).on('mouseout', month_tip.hide);
});
loc_chart1.on('pretransition', function(chart) {
chart.selectAll('g.row').call(loc_tip)
.on('mouseover', loc_tip.show).on('mouseout', loc_tip.hide);
});
pretransition 事件在渲染或重绘后立即触发,因此通常是操作 dc 元素的最佳时机。比 运行 全局代码要好得多。我喜欢设置所有内容,然后调用 dc.renderAll()
,然后让渲染和重绘稍后自行处理。
特别是,当 remove_empty_bins
停止删除它们时这些条重新添加时,这些事件将拾取它们并重新提示它们。
你的 fiddle 的分支:https://jsfiddle.net/gordonwoodhull/5feL3gko/4/