2016-03-31 13 views
0

Ich habe ein Topologiediagramm unter Verwendung javascript gezeichnet, aber das Problem ist, wie man die Diagrammanzeige hübsch macht.
ich sogar Kraft gerichtete Daten zufällig meine Knoten Position verwenden,
aber, wenn die Knoten mehr bekommen, die Grafik sieht schlecht aus
enter image description here Wie kann es wie unten sein: enter image description hereWie zu hübschem Topologiediagramm

Wie kann ich tun? Kann mir jemand sagen, wonach ich suchen kann?

+0

Jeder Vorschlag? – Awakening

+2

Der erste Schritt besteht in der Regel in der Bereitstellung des gleichen Datasets oder der Netzwerktopologie, um festzustellen, ob das Layout ähnliche Ergebnisse liefert. In Ihrem Fall haben Sie zwei verschiedene Topologien in den zwei Bildern. – MarcoL

+0

Verwandte Antwort s/o http://stackoverflow.com/a/33199117/1494833 – r0hitsharma

Antwort

6

Siehe 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}, 
    }) 
} 
+2

Das ist * sehr * schön – WearyWanderer

+0

hei, Entschuldigung für die Antwort nicht wenige Tage. Ich werde versuchen, Ihre Demo, vielen Dank – Awakening

+0

@Awakening Cool. Danke für die Punkte !! – meetamit