【问题标题】:Changing colour of bar on selecting and unselecting bar in composite chart在复合图表中选择和取消选择条形时更改条形的颜色
【发布时间】:2020-04-17 05:48:04
【问题描述】:

https://blockbuilder.org/ninjakx/63295ea0a8052716644738d37d390e52

1)

当我点击焦点序号栏((复合图表的c2)时,它应该将选定的一个保持为红色,另一个保持为灰色,但事实并非如此。

2)

当我单击饼图时,我会看到红色条以及未过滤的条(灰色)。在这里单击红色条应该过滤其他图表,因为您可以看到我的表格和饼图正在更新,但是当我单击灰色条时,数据也被过滤,但对于饼图,它只添加灰色切片。

行号284-324:

chart_11.fadeDeselectedArea = function (brushSelection) {
    var _chart = this;
    var bars = _chart.chartBodyG().selectAll('rect.bar');
    if (chart_11Filter.length) {
        bars.classed(dc.constants.SELECTED_CLASS, function (d) {
            return chart_11Filter.includes(d.data.key);
        });
        bars.classed(dc.constants.DESELECTED_CLASS, function (d) {
            return !chart_11Filter.includes(d.data.key);
        });
    } else {
        bars.classed(dc.constants.SELECTED_CLASS, false);
        bars.classed(dc.constants.DESELECTED_CLASS, false);
    }
};
chart_11.on('pretransition', function(chart) {
    chart.selectAll('rect.bar').on('click.ordinal-select', function(d) {
        var i = chart_11Filter.indexOf(d.data.key);
        if(i >= 0)
            chart_11Filter.splice(i, 1);
        else
            chart_11Filter.push(d.data.key);
        chart.applyFilter();
        chart.redrawGroup();
    });
});

如果我使用上面的代码,那么我会得到这些东西所以我可以想到这些解决方案。 我可以通过使用上面的代码并将其应用于 c2 来更改 c2 条的颜色。 同样对于第二张图,我可以使用 css 在单击它们时禁用它们,或者我 可以使过滤器返回无。

但是当我尝试上述解决方案时,它不起作用。问题还是一样。

如果我通过将 chart_11 替换为 c2 来使此功能仅适用于 c2:

chart_11.fadeDeselectedArea = function (brushSelection) {
.
.
.
.
chart_11.on('pretransition', function(chart) {
.
.
.

我明白了:

编辑:

    chart_11.on('pretransition', function(chart) {
        chart.selectAll('rect.bar').on('click', null);

如果我添加它,我将能够禁用单击所有栏。我必须只为 C1 制作它。

    chart_11.on('pretransition', function(chart) {
        // chart.selectAll('rect.bar').on('click', null);
        chart.selectAll('rect.bar').on('click.ordinal-select', function(d) {

我猜在这个函数中我的第二个问题可以解决。此功能必须自定义。访问子 C2 并选择其 rect.bar 和过滤器。 但无法为其编写代码。

【问题讨论】:

  • 很抱歉问了很多问题。最初的仪表板是使用 power bi 构建的,由 4-5 页和许多图表组成。那时正处于试用期。所以现在我必须从头开始创建所有图表,并使其看起来类似于 power bi 仪表板。我在 python 和 python 库的可视化方面效率很高。因此,使用 dc.js 实现单个图形面临着许多挑战。 javascript不太好。如果我得到了示例,我可以用 javscript 编写函数,但如果没有,我会感到震惊。
  • 当然,没问题。我从帮助人们使用 dc.js 中学到了很多东西,当我与一个优秀的编码人员一起工作并且我们扩大了 dc.js 的功能范围时,这尤其有趣。
  • 我快速浏览了一下 - 现在没有时间深入研究代码。我想你想修改 c1c2 而不是持有它们的复合材料?子图表的工作方式与往常一样,复合图表只是将一个放在另一个前面,并采用轴和画笔等常见元素的图表。
  • 是的,我只想从 c2 添加选择和删除栏。我希望 c1 在没有交互性的背景下。并且为了创建一个点击事件,我必须修改它以使其适用于 c2。
  • 也许我误解了 - 看起来您的代码正在尝试修改 chart_11,它是复合父级,什么时候应该修改 c2

标签: d3.js dc.js


【解决方案1】:

这将成为一个非常老套的解决方案,结合了两个已经老套的 dc.js 自定义。

然而,你离得并不远;这只是将行为限制在c2 并清除一些不相关的代码的问题。

我删除了hide_second_chart,因为这里没有必要,并且出于同样的原因删除了filterHandler

正如你所指出的,fadeDeselectedArea 必须被父级覆盖;由于某种原因,它不会对孩子们开火。

但是这个选择是空的,所以什么也没发生:

        var bars = _chart.chartBodyG().selectAll('rect.bar');

我改成

        var bars = c2.selectAll('rect.bar');

此外,点击处理程序应该特定于第二个孩子,所以这个

    chart_11.on('pretransition', function(chart) {
        chart.selectAll('rect.bar').on('click.ordinal-select', function(d) {

变成

    c2.on('pretransition.click-handler', function(chart) {
        chart.selectAll('.sub._1 rect.bar').on('click.ordinal-select', function(d) {

.sub._1 是只选择第二个子图表的 CSS。

我们可以使用类似的 CSS 来禁用第一个子图表上的悬停行为:

  .dc-chart .sub._0 rect.bar:hover {
      fill-opacity: 1;
  }

  .dc-chart .sub._0 rect.bar {
      cursor: pointer;
  }

启用filterAll,如Unable to reset the focus ordinal bar chart 中所述:

    chart_11.filterAll = function() {
        chart_11Filter = [];
        chart_11.filter(null);
    };

最后,如果未过滤的图表与取消选择的条形图颜色不同,则会令人困惑,因此我们将grey更改为#ccc

  .colors('#ccc')

Working fork of your block.

希望范围/焦点部分仍然有效,否则这会使事情变得比需要的复杂得多!

【讨论】:

  • 感谢您的详细解释。我想禁用像这样的chart_11.<child graph>selectAll('rect.bar <having fill=grey>') 标签这样的灰色条形图。我不知道我可以直接从子图中选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 2017-01-14
  • 2011-08-03
  • 2012-01-19
相关资源
最近更新 更多