私はd3.jsとjqueryをPHPのバックエンド(yiiフレームワークに基づいています)で使用して、ネットワーク上のホストとサービスの現在の状態を表す動的強制有向グラフを作成していますNagiosを使って監視しています。D3 Force Directed Graph Ajaxの更新
このグラフは、root - > hostgroups - > hosts - >サービスを示しています。私は、ノードは、ノードの状態を表示するためのリンクや色に使用されるオブジェクトID(OK =緑、警告を含む次の形式でJSONオブジェクトを返すために
{
"nodes": [
{
"name": "MaaS",
"object_id": 0
},
{
"name": "Convergence",
"object_id": "531",
"colour": "#999900"
},
{
"name": "maas-servers",
"object_id": "719",
"colour": "#999900"
},
{
"name": "hrg-cube",
"object_id": "400",
"colour": "#660033"
}
],
"links": [
{
"source": 0,
"target": "531"
},
{
"source": 0,
"target": "719"
},
{
"source": "719",
"target": "400"
}
]
}
をサーバ側の機能を作成しました=黄色など)リンクには、ノードのソースオブジェクトIDとターゲットオブジェクトIDがあります。新しいホストが監視システムから追加または削除されるノードおよびリンクは
Iは
- 現在のJSONオブジェクトを初期SVG、その後10秒ごとにセットアップ次のコードを取得した変更してもよい
- リンク
- のマップは、現在のノードとリンクを選択作成し、
- 入力リンクが追加されるJSONデータにそれらを結合し、出リンクが
- を除去されます
フォースが
$ .ajaxSetup({キャッシュ:偽})が開始され追加の日付とノードがその塗りつぶしの色を変更し、自分の名前で ツールチップを持っています追加。 幅= 960, 高さ= 500; node = []; link = []; force = d3.layout.force() 。charge(-1000) .linkDistance(1) .size([width、height]);
svg = d3.select("body").append("svg") .attr("width", width) .attr("height", height) .append("g"); setInterval(function(){ $.ajax({ url: "<?php echo $url;?>", type: "post", async: false, datatype: "json", success: function(json, textStatus, XMLHttpRequest) { json = $.parseJSON(json); var nodeMap = {}; json.nodes.forEach(function(x) { nodeMap[x.object_id] = x; }); json.links = json.links.map(function(x) { return { source: nodeMap[x.source], target: nodeMap[x.target], }; }); link = svg.selectAll("line") .data(json.links); node = svg.selectAll("circle") .data(json.nodes,function(d){return d.object_id}) link.enter().append("line").attr("stroke-width",1).attr('stroke','#999'); link.exit().remove(); node.enter().append("circle").attr("r",5); node.exit().remove(); node.attr("fill",function(d){return d.colour}); node.append("title") .text(function(d) { return d.name; }); node.call(force.drag); force .nodes(node.data()) .links(link.data()) .start() force.on("tick", function() { link.attr("x1", function(d) { return d.source.x; }) .attr("y1", function(d) { return d.source.y; }) .attr("x2", function(d) { return d.target.x; }) .attr("y2", function(d) { return d.target.y; }); node.attr("cx", function(d) { return d.x = Math.max(5, Math.min(width - 5, d.x)); }) .attr("cy", function(d) { return d.y = Math.max(5, Math.min(height - 5, d.y)); }); }); } }); },10000);
出力の例が正しくコードがループするたびにそれを再起動するように可視化を引き起こすことを例外とノードのすべてのバウンスでNetwork Visualization
で上記の作品のすべてを見ることができます彼らが決着するまで私が必要とするのは、現在のアイテムをそのまま維持することですが、新しいノードやリンクが視覚化に追加され、クリック可能でドラッグ可能なものなどです。
誰でも助けてもらえると永遠に感謝します。 サーバー側は、あなたが生成されているnodes
とlinks
新しいものを伝えることができている、と
を使用しているコードがあります。毎回新しいJSONをリロードするのではなく、サーバー側の変更を確認し、更新時のものとそれらを接続する方法を見つける方法を見つけるべきだと思います。たとえば、_new_ノードとリンクだけを持つJSONを作成し、 'force.on(" tick "、function())を呼び出すと、それらのオブジェクトを' .nodes'と '.links'にプッシュします。 – Joum
私は本当に現在の視覚化オブジェクトをサーバーに戻すことに対処する必要性を避ける方法を望んでいるため、ソリューション全体がはるかに複雑になります。私がd3.jsを見始めたのは、データをd3に渡して、データを入力して終了して、手動でこれを行う必要がなくなりました。代わりの方法はありませんか? – d9705996
実際には、私はあなたのコメントを再読していました.d3.js **は、データに入力されたものと出て来たものを取り除いていません。あなたが提供するデータを使って、あなたがそれを伝えるものを計算します。使用しているデータを変更したい場合は、自分で変更する必要があります。 :) – Joum