d3圆形包装 - 打印多行标签

时间:2018-04-23 20:01:37

标签: javascript d3.js

我是d3(以及JavaScript一般的新手),我正试图弄清楚如何更改this example,以便每个圈子都有相应的大小字段印在名字下面。我尝试改变JSON,因此名称字段类似"MergeEdge\n743",但这不起作用(它似乎只是忽略换行符并在一行上打印)。有什么提示吗?

1 个答案:

答案 0 :(得分:1)

一个小小的提示,通常使用d3,你更喜欢为不同的目标设置单独的代码。当您阅读文件时,它使维护更容易,并使整体更容易理解。 在您的情况下,我们需要添加一个新的文本字段,其坐标将文本放在当前文本下方。所以我们需要添加:

node.filter(function(d) { return !d.children; }).append("text")
  .attr("dy", "1.2em")
  .text(function(d) { return Math.round(d.r).toString(); });

所以整个javaScript代码将是:

var svg = d3.select("svg"),
    diameter = +svg.attr("width"),
    g = svg.append("g").attr("transform", "translate(2,2)"),
    format = d3.format(",d");

var pack = d3.pack()
    .size([diameter - 4, diameter - 4]);

d3.json("flare.json", function(error, root) {
  if (error) throw error;

  root = d3.hierarchy(root)
      .sum(function(d) { return d.size; })
      .sort(function(a, b) { return b.value - a.value; });

  var node = g.selectAll(".node")
    .data(pack(root).descendants())
    .enter().append("g")
      .attr("class", function(d) { return d.children ? "node" : "leaf node"; })
      .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

  node.append("title")
      .text(function(d) { return d.data.name + "\n" + format(d.value); });

  node.append("circle")
      .attr("r", function(d) { return d.r; });

  node.filter(function(d) { return !d.children; }).append("text")
      .attr("dy", "0.3em")
      .text(function(d) { return d.data.name.substring(0, d.r / 3); });

  node.filter(function(d) { return !d.children; }).append("text")
      .attr("dy", "1.2em")
      .text(function(d) { return Math.round(d.r).toString(); });
});