svg - d3.js 中堆积圆的散点图?

标签 svg d3.js visualization scatter-plot circle-pack

有没有办法创建稀疏散点图可视化,其中绘图上的每个“点”都是一个级别 packed circle ?我一直在尝试用 d3 来做到这一点,但我不知道是否可以在同一个 svg 中制作多个不同的包布局...(或者如果这就是我应该如何处理它)。任何帮助将不胜感激!

我希望它最终看起来像下面的草图: enter image description here

最佳答案

只是把它放在一起。它采用 d3 耀斑数据,并将散点图绘制出第一级子级及其子级。

数据结构:

var flareData = {
  "name": "root",
  "children": [{
    "name": "pointOne",
    "scatX": 10,
    "scatY": 20,
    "children": [{
      "name": "pointOneA",
      "children": [{
        "name": "A",
        "size": 40
      }, {
        "name": "B",
        "size": 50
      }]
    }, {
      "name": "pointOneB",
      "children": [{
        "name": "C",
        "size": 10
      }, {
        "name": "D",
        "size": 23
      }]
    }]
  }, {
    "name": "pointTwo",
...

用于创建绘图和坐标轴的典​​型 d3 代码:

var
 WIDTH = 600,
  HEIGHT = 600,
  DIAMETER = 200;

var vis = d3.select('body')
  .append('svg')
  .attr('width', WIDTH)
  .attr('height', HEIGHT);

var MARGINS = {
  top: 20,
  right: 20,
  bottom: 20,
  left: 50
},
  xRange = d3.scale
    .linear()
    .range([MARGINS.left, WIDTH - MARGINS.right])
    .domain([d3.min(flareData.children, function(d) {
      return d.scatX;
    }) - 10, d3.max(flareData.children, function(d) {
      return d.scatX;
    }) + 10]),
  yRange = d3.scale
    .linear()
    .range([HEIGHT - MARGINS.top, MARGINS.bottom])
    .domain([d3.min(flareData.children, function(d) {
      return d.scatY;
    }) - 10, d3.max(flareData.children, function(d) {
      return d.scatY;
    }) + 10]),
  xAxis = d3.svg.axis()
    .scale(xRange)
    .tickSize(5)
    .tickSubdivide(true),
  yAxis = d3.svg.axis()
    .scale(yRange)
    .tickSize(5)
    .orient('left')
    .tickSubdivide(true);

vis.append('svg:g')
  .attr('class', 'x axis')
  .attr('transform', 'translate(0,' + (HEIGHT - MARGINS.bottom) + ')')
  .call(xAxis);

vis.append('svg:g')
  .attr('class', 'y axis')
  .attr('transform', 'translate(' + (MARGINS.left) + ',0)')
  .call(yAxis);

开始滥用打包布局:

// normal packed layout
var pack = d3.layout.pack()
  .size([DIAMETER - 4, DIAMETER - 4])
  .value(function(d) {
    return d.size;
  });

// classify each level
var node = vis.datum(flareData).selectAll(".node")
  .data(pack.nodes)
  .enter().append("g")
  .attr("class", function(d) {        
    // root level
    if (!d.parent) {
      return "node rootNode";
    // first level children, these are our scatter points
    } else if (d.children && !d.parent.parent) {
      return "node pointNode";
    // an intermediate circle
    } else if (d.children) {
      return "node innerNode";
    // last level packing
    } else {
      return "node innerNode packedNode";
    }
  });

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

// we don't care about root circle, move off page
node.filter(".rootNode")
  .attr("transform", "translate(" + -100 + "," + -100 + ")");

// this is our scatter point
node.filter(".pointNode")
  .attr("transform", function(d) {
    return "translate(" + xRange(d.scatX) + "," + yRange(d.scatY) + ")";
  });

// any circle in a scatter point
node.filter(".innerNode")
  .attr("transform", function(d) {
    var iter = d;
    while(!iter.scatX){
      iter = iter.parent;
    }
    // diff from scatter point...
    var difX = iter.x - d.x,
        difY = iter.y - d.y;
    return "translate(" + (xRange(iter.scatX) + difX) + "," + (yRange(iter.scatY) + difY) + ")";
  })

// finally label our last level
node.filter(".packedNode")
  .append("text")
  .attr("dy", ".3em")
  .style("text-anchor", "middle")
  .text(function(d) {
    return d.name;
  });

示例 here .

产品:

enter image description here

关于svg - d3.js 中堆积圆的散点图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27978202/

相关文章:

html - 将 svg 嵌入到 html 中的可重用性

html - 为什么溢出可见意味着 svgs 高度在 100% 时计算不正确 - 在 FireFox 中?

javascript - 根据内部数组值跳过 JSON 数据记录 - D3

c# - C# 的算法可视化

3d - 如何在 Paraview 中可视化存储在简单表格中的 XYZ+Field 体积数据?

javascript - D3 过渡不起作用

javascript - 为什么 Twitter Bootstrap 弹出窗口不能与 SVG 元素一起使用?

javascript - 单节点图对 forceCenter 没有反应?

javascript - 放大水平条形图中的画笔

javascript - d3 将颜色映射到值以外的其他内容,因为当值相等时颜色会重复