4

私は最近、Cytoscape.js について知り、強制指向のレイアウトである arbor と springy を試してみたいと思います。

ここで、いくつか質問があります。

  1. ノードの配置が何らかのアルゴリズムに基づいており、ノードの座標が不要なレイアウトの 1 つを使用して、グラフを実現することは可能ですか? たとえば、VivaGraphJS では、接続されたノードがグループを形成し、孤立したノードが周辺に移動するようにグラフが収束します。これが力指向のレイアウトで実行できる場合、ノードを選択してキャンバス上で自由にドラッグできるように、力をオフにすることはできますか?

  2. Cytoscape が実際に処理できるグラフのサイズ (ノード/エッジの数) はどれくらいですか?

  3. すべてのノードとエッジには 5 つの属性があり、マウスオーバーでこれらを表示するテキスト ボックスが必要だとします。これを行う最も簡単な方法は何ですか?

  4. Wiki には、以下のように単一のノードを追加できるとありますが、cy にはノード機能がありません。これはエラーですか?var n0 = cy.node("n1"); cy.add(n0); // 単一の要素 n0 を追加します

  5. Arbor/Springy を使用して自明なランダム データ グラフを作成しようとしました。以下のコードでは、「return data.cy」で「data is undefined」というエラーが発生します。レイアウトが「ランダム」の場合、コードは機能します。私は何を間違っていますか?

<!DOCTYPE html>
<html>
<head>
    <title>Test</title>
    <style type="text/css">
    .full-height { height: 600px; margin: 0 0; padding: 0 0; }
    </style>

    <script src="jquery-1.7.2.js"></script>
    <script src="demo/cytoscape.all.js"></script>
    <script src="demo/extensions/cytoscape.layout.arbor.js"></script>
    <script src="demo/extensions/cytoscape.layout.springy.js"></script>


    <script src="demo/arbor.js"></script>
    <script src="demo/arbor-tween.js"></script>
    <script src="demo/springy.js"></script>


    <script type='text/javascript'>
        function onLoad() {

             // create a mapper for node size
            var nodeSizeMapper = {
                continuousMapper: {
                    attr: {
                        name: "weight",
                        min: 0,
                        max: 40
                    },
                    mapped: {
                        min: 5,
                        max: 25
                    }
                }
            };

            $("#cy").cytoscape( {
                layout: { name: "arbor" }, // works when "random"
                style: {
                    selectors: {
                        "node":{
                            shape: "ellipse",
                            fillColor: "#3366FF",
                            height: nodeSizeMapper,
                            width: nodeSizeMapper,
                            labelText: {
                                passthroughMapper: "id"
                            }
                        },
                        "edge": {
                            lineColor: "#CCFF33",//"#ccc",
                            targetArrowColor: "#CCFF33", //"#ccc",
                            width: {
                                continuousMapper: {
                                    attr: {
                                        name: "weight",
                                        min: 20,
                                        max: 35
                                    },
                                    mapped: {
                                        min: 1,
                                        max: 3
                                    }
                                }
                            },
                            targetArrowShape: "triangle",
                            // labelText: {
                            //     passthroughMapper: "weight"
                            // }
                        },
                        "node:selected": {
                            fillColor: "#333"
                        },
                        "edge:selected":{
                            lineColor: "#666",
                            targetArrowColor: "#666"
                        }
                    }
                },                    
                ready: function(cy) { },
            });
            window.cy = $("#cy").cytoscape("get");

            $.getJSON('edges_nodes.json', function(elements) {
                //console.log(elements);
                window.elements = elements;
                cy.load( elements );
            });
        }
    </script>
</head>

<body onload="onLoad()">
        <div class="full-height" id="cy">
        </div>
</body>
</html>

JSON ファイルの内容は次のとおりです。

{"nodes": [{"classes": "b", "data": {"id": "n0", "weight": 40}}, {"classes": "b", "data": {"id": "n1", "weight": 19}}, {"classes": "c", "data": {"id": "n2", "weight": 0}}, {"classes": "d", "data": {"id": "n3", "weight": 19}}, {"classes": "e", "data": {"id": "n4", "weight": 4}}, {"classes": "a", "data": {"id": "n5", "weight": 21}}, {"classes": "e", "data": {"id": "n6", "weight": 13}}, {"classes": "a", "data": {"id": "n7", "weight": 6}}, {"classes": "a", "data": {"id": "n8", "weight": 10}}, {"classes": "b", "data": {"id": "n9", "weight": 6}}, {"classes": "c", "data": {"id": "n10", "weight": 24}}, {"classes": "c", "data": {"id": "n11", "weight": 14}}, {"classes": "e", "data": {"id": "n12", "weight": 11}}, {"classes": "b", "data": {"id": "n13", "weight": 6}}, {"classes": "e", "data": {"id": "n14", "weight": 24}}, {"classes": "b", "data": {"id": "n15", "weight": 26}}, {"classes": "b", "data": {"id": "n16", "weight": 6}}, {"classes": "c", "data": {"id": "n17", "weight": 36}}, {"classes": "a", "data": {"id": "n18", "weight": 7}}, {"classes": "b", "data": {"id": "n19", "weight": 37}}, {"classes": "c", "data": {"id": "n20", "weight": 28}}, {"classes": "d", "data": {"id": "n21", "weight": 11}}, {"classes": "d", "data": {"id": "n22", "weight": 20}}, {"classes": "e", "data": {"id": "n23", "weight": 7}}, {"classes": "b", "data": {"id": "n24", "weight": 31}}, {"classes": "b", "data": {"id": "n25", "weight": 1}}, {"classes": "e", "data": {"id": "n26", "weight": 29}}, {"classes": "d", "data": {"id": "n27", "weight": 31}}, {"classes": "d", "data": {"id": "n28", "weight": 34}}, {"classes": "b", "data": {"id": "n29", "weight": 40}}, {"classes": "d", "data": {"id": "n30", "weight": 38}}, {"classes": "b", "data": {"id": "n31", "weight": 17}}, {"classes": "a", "data": {"id": "n32", "weight": 39}}, {"classes": "d", "data": {"id": "n33", "weight": 4}}, {"classes": "c", "data": {"id": "n34", "weight": 38}}, {"classes": "d", "data": {"id": "n35", "weight": 13}}, {"classes": "b", "data": {"id": "n36", "weight": 15}}, {"classes": "a", "data": {"id": "n37", "weight": 29}}, {"classes": "a", "data": {"id": "n38", "weight": 2}}, {"classes": "d", "data": {"id": "n39", "weight": 35}}, {"classes": "c", "data": {"id": "n40", "weight": 24}}, {"classes": "c", "data": {"id": "n41", "weight": 7}}, {"classes": "e", "data": {"id": "n42", "weight": 24}}, {"classes": "c", "data": {"id": "n43", "weight": 4}}, {"classes": "d", "data": {"id": "n44", "weight": 40}}, {"classes": "a", "data": {"id": "n45", "weight": 19}}, {"classes": "b", "data": {"id": "n46", "weight": 17}}, {"classes": "b", "data": {"id": "n47", "weight": 36}}, {"classes": "b", "data": {"id": "n48", "weight": 26}}, {"classes": "a", "data": {"id": "n49", "weight": 18}}], "edges": [{"data": {"source": "n5", "id": "e0", "weight": 31, "target": "n19"}}, {"data": {"source": "n37", "id": "e1", "weight": 31, "target": "n25"}}, {"data": {"source": "n19", "id": "e2", "weight": 31, "target": "n2"}}, {"data": {"source": "n16", "id": "e3", "weight": 23, "target": "n27"}}, {"data": {"source": "n29", "id": "e4", "weight": 17, "target": "n4"}}, {"data": {"source": "n1", "id": "e5", "weight": 33, "target": "n12"}}, {"data": {"source": "n13", "id": "e6", "weight": 38, "target": "n33"}}, {"data": {"source": "n12", "id": "e7", "weight": 34, "target": "n4"}}, {"data": {"source": "n32", "id": "e8", "weight": 34, "target": "n13"}}, {"data": {"source": "n44", "id": "e9", "weight": 32, "target": "n19"}}, {"data": {"source": "n31", "id": "e10", "weight": 24, "target": "n19"}}, {"data": {"source": "n35", "id": "e11", "weight": 18, "target": "n48"}}, {"data": {"source": "n25", "id": "e12", "weight": 19, "target": "n15"}}, {"data": {"source": "n31", "id": "e13", "weight": 18, "target": "n16"}}, {"data": {"source": "n24", "id": "e14", "weight": 39, "target": "n27"}}, {"data": {"source": "n47", "id": "e15", "weight": 22, "target": "n3"}}, {"data": {"source": "n1", "id": "e16", "weight": 34, "target": "n35"}}, {"data": {"source": "n22", "id": "e17", "weight": 15, "target": "n5"}}, {"data": {"source": "n37", "id": "e18", "weight": 40, "target": "n10"}}, {"data": {"source": "n37", "id": "e19", "weight": 21, "target": "n29"}}]}
4

1 に答える 1

5

(1)はい、initオプションでレイアウトを指定すると、最初にノードを配置するために使用され、ノードの場所を指定する必要はありません。アーバーレイアウトオプションは、ungrabifyWhileSimulatingアーバー中の双方向性に関してあなたが求めていることを実行すると思います。

(2)SVGレンダラーを使用すると、古いバージョンとほぼ同じになりますが、それほど多くはありません。現在、コアを高速化し、より多くの要素を処理するために多くのリファクタリングを行っています。現在取り組んでいる新しいキャンバスレンダラーでは、10万個の要素(または1,000,000個の要素)を処理できるようになることを願っています。

(3)qtipのようなものを使用し、cytoscape.js API(つまりeles.data())を介して通常どおりプロパティ値を読み取ります。

(4)残念ながら、APIをWikiで維持するのは困難であり、プレリリースビルドの進化する性質を考えると、読んだものは古くなっていました。私はより良いソリューションを構築しています、そしてそれはすぐにアップするでしょう。

(5)グラフが空の場合、アーバーレイアウトのバグである可能性があります。結局のところ、あなたは空のグラフから始めています。おそらく、コールバックでcytoscape.jsを初期化することで、今のところ回避します$.getJSON()か?

于 2012-06-20T19:35:05.350 に答える