Javascript Dc.js和D3.js图表更新

Javascript Dc.js和D3.js图表更新,javascript,d3.js,dc.js,crossfilter,Javascript,D3.js,Dc.js,Crossfilter,我正在使用dc.js绘制一些图表 在d3代码中,我动态计算了几列的总和,然后将它们添加到我用d3.js绘制的饼图中 这是计算列总数的代码: var pieChart = []; classesJson.forEach(function(classJson){ var memDegree = ndx.groupAll().reduceSum(function(d){ return d[classJson.name]; }).value(); //consol

我正在使用dc.js绘制一些图表

在d3代码中,我动态计算了几列的总和,然后将它们添加到我用d3.js绘制的饼图中

这是计算列总数的代码:

var pieChart = [];
classesJson.forEach(function(classJson){
    var memDegree = ndx.groupAll().reduceSum(function(d){
        return d[classJson.name];
    }).value();
    //console.log(memDegree);
    pieChart.push({name:classJson.name, memDegree:memDegree});
});
这幅画第一次画得很好。但是当我点击dc.js条形图上的元素时,d3.js饼图没有更新。如何实现上述代码中的GroupAll值也在d3.js饼图中更新

这是饼图的d3总代码:

radius = Math.min(300, 234) / 2;

var color = d3.scale.ordinal()
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

var arc = d3.svg.arc()
    .outerRadius(radius - 10)
    .innerRadius(0);

var pie = d3.layout.pie()
    .sort(null)
    .value(function(d) { return d.memDegree; });

var svg = d3.select("#membership-degree-pie-chart").append("svg")
    .attr("width", 300)
    .attr("height", 234)
  .append("g")
    .attr("transform", "translate(" + 300 / 2 + "," + 234 / 2 + ")");

var pieChart = [];
classesJson.forEach(function(classJson){
    var memDegree = ndx.groupAll().reduceSum(function(d){
        return d[classJson.name];
    }).value();
    //console.log(memDegree);
    pieChart.push({name:classJson.name, memDegree:memDegree});
});

pieChart.forEach(function(d) {
    d.memDegree = +d.memDegree;
  });

  var g = svg.selectAll(".arc")
      .data(pie(pieChart))
    .enter().append("g")
      .attr("class", "arc");

  g.append("path")
      .attr("d", arc)
      .style("fill", function(d) { return color(d.data.name); });

  g.append("text")
      .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
      .attr("dy", ".35em")
      .style("text-anchor", "middle")
      .text(function(d) { return d.data.name; });

没有小提琴或plnkr,很难分辨。 但是我没有测试就编辑了你的代码。请检查是否有帮助,我已经创建了更改函数来更新图表。您可以在要更新图形的位置调用change函数。希望能有帮助

      var g = svg.selectAll(".arc")
          .data(pie(pieChart))
        .enter().append("g")
          .attr("class", "arc")
        .append("path")
        .attr("d", arc)
        .style("fill", function (d) { return color(d.data.name); })
.each(function(d) { this._current = d; }); // store the initial angles;

    g.append("text")
        .attr("transform", function (d) { return "translate(" + arc.centroid(d) + ")"; })
        .attr("dy", ".35em")
        .style("text-anchor", "middle")
        .text(function (d) { return d.data.name; });

    //For updating change in data
     function change() {


        pie.value(function(d) { return d.memDegree; }); // change the value function
        g = g.data(pie); // compute the new angles
        g.transition().duration(750).attrTween("d", function (a) {
            var i = d3.interpolate(this._current, a);
            this._current = i(0);
            return function (t) {
                return arc(i(t));
            };
        }); // redraw the arcs
    }
您可以使用dc图表上的来检测已过滤的,然后调用d3图表的更新函数

yourDCChart.on("filtered", function (chart, filter) {
    // update function for d3
    updateD3Chart();
});

我将用于自定义可视化的D3绘图功能附加到dc图表,每次图表更新/渲染时,D3图表都会再次绘制:

dcTable
.on("renderlet.<renderletKey>", function (d3ChartData) {
  drawD3(d3ChartData)
}
dcTable
.on(“renderlet.”,函数(d3ChartData){
图纸3(D3图表数据)
}

Hi感谢您的回复。如果我单击dc.js图表,我如何告诉dc.js使用groupAll值更新d3.js图表?我应该在哪里调用更改函数?Hi Ganesh,现在我在JSFIDLE上创建了一个工作示例,其中有一个按钮调用更改方法。但是图表没有更新,日志中也没有错误。N现在,它与按钮一起工作,但我有dc.js图表,并希望将crossfitler值添加到d3.js图表中。当我在dc.js图表中更改某些内容时,crossfilter值不会更新,因此d3图表始终保持不变。请看这个问题,了解如何将外部图表连接到dc.js:。另外,因为dc.js确实有一个pIE图表,您只需要指定自定义数据,您可以考虑使用A来提供数据,而不是在D3中从头开始。嗨,贾斯廷,我已经试过了,函数调用也起作用了,但是我的问题是,当我点击DCJS线图时,CouthFieldGROMPALALL函数的值没有更新,因此D3图表没有更新。但是如果我将grouAll函数中的值绑定到dc.js number元素(),则值会更新。如果我不将交叉筛选值添加到dc.js图表中,是否也应该更新这些值?我在这里创建了一个工作示例,您可以在其中看到我的问题:。