javascript - 如何漂亮的拓扑图

标签 javascript d3.js topology topological-sort

我使用javascript绘制了一个拓扑图,但问题是如何漂亮地显示图形。
我什至使用强制定向数据来随机我的节点位置,
但当节点增多时,图表看起来就很糟糕
enter image description here 怎么会像下面这样: enter image description here

我该怎么办?有人可以告诉我我可以寻找什么吗?

最佳答案

参见working jsFiddle

var root = { name: "root" };
var hosts = [
  { name: "host1", type: "host" },
  { name: "host2", type: "host" },
  { name: "host3", type: "host" }
];

var nodes = [root].concat(hosts);
var links = hosts.map(function(host) {
  return { source: root, target: host }
});

hosts.forEach(function(host) {
  var hostNum = host.name.substr(4);
  for(var i = 0; i <= 5; i++) {
    var vm = {
      name: "vm-" + hostNum + "-" + i,
      type: 'vm'
    }
    nodes.push(vm);
    links.push({
      source: host,
      target: vm
    })
  }
});

var force = d3.layout.force()
  .size([window.innerWidth, window.innerHeight])
  .nodes(nodes)
  .links(links)
  .charge(-1500)
  .gravity(0.1)
  .on('tick', update)
  .start();

var svg = d3.select('body')
  .append('svg')
  .attr({
    width:  window.innerWidth,
    height: window.innerHeight
  })

var circles = svg.selectAll('circle')
  .data(force.nodes())
circles.enter()
  .append('circle')
  .attr({
    r: function(d) { return d.type == 'vm' ? 14 : 20; },
    fill: '#1661FE'
  });

var lines = svg.selectAll('line')
  .data(force.links())
lines.enter()
  .append('line')
  .attr({
    fill: 'none',
    stroke: '#1661FE',
    'stroke-width': 3
  });

var texts = svg.selectAll('text')
  .data(force.nodes())
texts.enter()
  .append('text')
  .text(function(d) { return d.name; })
  .attr({
    fill: 'white',
    'text-anchor': 'middle',
    dy: '30'
  })
  .style({
    'font-family': "Verdana, Helvetica, Sans-Serif",
    'font-size': 12
  });

function update() {
  circles.attr({
    cx: function(d) { return d.x; },
    cy: function(d) { return d.y; }
  });

  texts.attr({
    x: function(d) { return d.x; },
    y: function(d) { return d.y; }
  })

  lines.attr({
    x1: function(d) { return d.source.x},
    y1: function(d) { return d.source.y},
    x2: function(d) { return d.target.x},
    y2: function(d) { return d.target.y},
  })
}

关于javascript - 如何漂亮的拓扑图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36328737/

相关文章:

architecture - 推送事件的缩放 - 最佳拓扑?

r - 解读phom R包-持久同源-数据拓扑分析-聚类分析

javascript - 从其他数组中的多个对象创建对象数组

javascript - 使用javascript在HTML SELECT OPTION中突出显示 "text"的子字符串

javascript - d3 : Existing elements are invisible

javascript - Angularjs 未知提供商 nvd3

javascript - latLng 返回空对象 - Google map javascript API

javascript - 为什么 $(this).attr 不起作用?他们带回 'undefined'

javascript - d3词云指定个别词颜色

用于重新配置 Linux 集群网络拓扑的 Python 脚本