【问题标题】:d3.js packing bubble chart elementsd3.js 打包气泡图元素
【发布时间】:2015-04-09 07:24:21
【问题描述】:

我正在尝试使用气泡图示例作为模板来构建可视化。我将 JSON 作为平面层次结构,这样就有一个名为 children 的元素,它包含一组我想要可视化的对象。

JSON 看起来像这样:

{
  "children":[
    {
      "acc":"Q15019",
      "uid":"SEPT2_HUMAN",
      "sym":"SEPT2",
      "name":"Septin-2",
      "alt_ids":"",
      "ratio":0.5494271087884398,
      "pval":0.990804718
    },
    ...,
    {
      "acc":"Q16181",
      "uid":"SEPT7_HUMAN",
      "sym":"SEPT7",
      "name":"Septin-7",
      "alt_ids":"",
      "ratio":1.1949912048567823,
      "pval":0.511011887
    }
  ]
}

我将示例代码修改如下:

var diameter = 960,
    format = d3.format(",d"),
    color = d3.scale.quantile().range(colorbrewer.RdBu[9]);

var bubble = d3.layout.pack()
    .sort(null)
    .size([diameter, diameter])
    .padding(1.5);

var svg = d3.select("body").append("svg")
    .attr("width", diameter)
    .attr("height", diameter)
    .attr("class", "bubble");

d3.json("datagraph.json", function(datagraph) {
  var node = svg.selectAll(".node")
      .data(bubble.nodes(datagraph))
    .enter().append("g")
      .attr("class", "node")
      .attr("id", function(d) { return d.acc; })
      .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

  //node.append("title").text(function(d) { return d.className + ": " + format(d.value); });

  node.append("circle")
      .attr("r", function(d) { return 30; })
      .style("fill", function(d) { 
        if(d.ratio == null)
          return "#ffffff";
        else
          return color(d.ratio); 
      });

  node.append("text")
      .attr("dy", ".3em")
      .style("text-anchor", "middle")
      .text(function(d) { return d.acc; });
});

生成的 HTML 有大量的 <g> 标签来响应每个元素,除了它们从未被翻译到正确的位置,而是在左上角彼此重叠。通过在 Firebug 中进行调查,我认为这可能是因为 pack() 算法不会一次获取一个对象,而是将整个数组作为单个元素,因此单个元素不会获得 .x 和 .y 值。

如果我将.nodes() 参数更改为datagraph.children,我会在nodes() 迭代中一次得到一个元素,但奇怪的是我得到一个<g> 对象。由于我不需要展平层次结构,因此在示例中跳过了 classes(root) 函数。我想知道packageName 属性是否在节点()中起任何作用?

我该如何解决这个问题?

【问题讨论】:

  • 你能展示一下你的json是什么样子的吗?

标签: javascript layout d3.js


【解决方案1】:

您尚未指定value accessor

var bubble = d3.layout.pack()
  .sort(null)
  .size([diameter, diameter])
  .padding(1.5)
  .value(function(d) { return d.pval; }) //<- must return a number

例如here

【讨论】:

  • @posdef,默认是寻找你没有的value 属性。您链接到的代码在classes 函数中添加了value 属性。
猜你喜欢
  • 1970-01-01
  • 2018-12-08
  • 2016-03-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多