3

我有一个包含大量数据的 D3 Js Sankey 图。数据的最后总是公司。公司节点是一个简单的圆圈。但是在那个圆圈周围,我想要一个带有 2 个值的甜甜圈图。这些值在公司节点内作为 numsms 和 nummid。您还可以在下图中看到。

图表示例: 在此处输入图像描述

所以我想围绕公司圈子做一个甜甜圈图。但我似乎无法让它发挥作用,我只找到了甜甜圈图的示例作为自己的 svg。

我的圈子代码:

svg.selectAll(".node.circle")
        .append("circle")
        .attr("r", function(d) {
            if(d.node.indexOf("company-") > -1) {
                return company_circle_size(d);
            } else {
                return page_circle_size(d);
            }
        })
        .attr("cy", function(d) { return d.dy/2;})
        .attr("cx", function(d) {
            var cx = sankey.nodeWidth() - 30;
            if(d.node.indexOf("company-") > -1) {
                cx = cx + 15;
            }
            return cx;
        })
        .style("fill", function (d) {
            if(d.node.indexOf("company-") > -1) {
                if(d.name.indexOf("No data") > -1) {
                    return "grey";
                }
                var color = '';
                switch(d.status) {
                    case 'Approved':
                        color = 'green';
                        break;
                    case 'inactive ':
                        color = 'red';
                        break;
                    case 'initial':
                        color = 'yellow';
                        break;
                    case 'review':
                        color = 'blue';
                        break;
                    default:
                        color = 'grey';
                        break;
                }
                return color;
            }
            return "grey";
            //return d.color = color(d.name.replace(/ .*/, ""));
        })
        .style("fill-opacity", ".9")
        .style("shape-rendering", "auto")
        .style("stroke", function (d) {
            return d3.rgb(d.color).darker(2);
        })
        .append("title")
        .text(function (d) {
            if(d.node.indexOf("company-") > -1) {
                if(d.cpId != null) {
                    return d.name + "\n cpId: " + d.cpId;
                }
                return d.name;
            }
            return d.name + "\n" + format(d.value);
        });

在 for 循环中,我将类名“node circle”替换为“node company”。

$(selector).attr("class", "node company")

我已经尝试了一些东西,我认为代码需要放在这里。

svg.selectAll('.company').each(function(companyNode) {
        var values = [[companyNode.numsms, companyNode.nummid]];
        var total = companyNode.numsms + companyNode.nummid;

        if(total > 0) {
            // create donut chart
        }
    });
4

3 回答 3

1

终于回到了这个问题。

这是一个结合包含圆环图的桑基图的快速示例。我不适合您的数据,这是一个通用示例。

// if no pie data, just use rects as normal
node.filter(function(d){
    return !d.pieData;
  })
  .append("rect")
  .attr("height", function(d) {
    return d.dy;
  })
  .attr("width", sankey.nodeWidth())
  .style("fill", function(d) {
    return d.color = color(d.name.replace(/ .*/, ""));
  })
  .style("stroke", function(d) {
    return d3.rgb(d.color).darker(2);
  })
  .append("title")
  .text(function(d) {
    return d.name + "\n" + format(d.value);
  });

// set up donut chart stuff
var pColor = d3.scale.ordinal()
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

var arc = d3.svg.arc()
    .outerRadius(50)
    .innerRadius(20);

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

// if we have pie data, draw the donut chart
var g = node.filter(function(d){
    return d.pieData;
  })
  .append("g")
  .attr('transform', function(d,i){
     return 'translate('+d.dx/2+','+d.dy/2+')'; // proper position
  })
  .attr("class","donut")
  .selectAll(".arc")
  .data(function(d){
    return pie(d.pieData); // nested selection to assign data
  })
  .enter().append("g")
  .attr("class", "arc");

g.append("path")
  .attr("d", arc)
  .style("fill", function(d,i) { return color(i); });
于 2015-04-18T13:18:24.627 回答
1

您可以使用 foriegnObject 将 div 附加到节点。在该 div 中,将您的值传递给内联 jquery 迷你图(折线、饼图等)。设置 div 的透明度,使其不会阻塞图表。将您的值添加到原始 sankey 数据数组(即源、目标、值、numsms、numid),然后在附加的 d.numsms 中调用它们)。

//sparkline plugin and setup...  http://omnipotent.net/jquery.sparkline/#s-docs
//something like the following, look at the fiddle for more info

node.append("foreignObject")
.attr("width", sankey.nodeWidth()*2)
.attr("height", function(d) { return d.dy/2 })
.attr("transform", function(d) { return "translate(" + (d.x+20) + "," + (d.y+10) + ")"; })
.append("xhtml:body")
.style("font", "14px 'Helvetica Neue'")
.html("<div>Inline Sparkline: <span class='inlinesparkline'>1,4,4,7,5,9,10</span></div>");

将 div 添加到每个节点后,调用插件来激活内联图表。

$('.inlinesparkline').sparkline(); 

看看我的小提琴。它不是一个 sankey,但它确实向您展示了如何实现 foriegnObject。

d3.js 图表与内联图表!

希望这可以帮助。

于 2015-04-16T20:08:40.563 回答
0

Sankey + Piechart 在这里实现:http://food.csaladen.es 虽然饼图驻留在静态 div 中,所以每次调用它时都将它移到节点上方)

于 2015-05-01T04:20:26.393 回答