Eine JavaScript-Bibliothek zum Darstellen von Graphen

layouted graphAuf der Suche nach einem einfachen Weg, generische Graphen und Netze im Browser hübsch darzustellen, ohne jedoch auf Plugins wie Java oder Flash angewiesen zu sein, stieß ich auf diesen Code mit dem Namen „Graph JavaScript framework, version 0.0.1“. Es erlaubt das einfache Erstellen eines Graphenmodells, verteilt die Knoten dann schön und zeigt das Modell im Browser an. Leider war der Code so etwas von 2006 und verlangte zudem nach PrototypeJS.
Außerdem war seither nichts mehr damit geschehen.

Also nahm ich ein Raphael-JS-Beispiel zum verbinden geometrischer Formen und kombinierte es mit dem eben gefundenen Code. Der Layout-Algorithmus erzielte ganz ordentliche Ergebnisse. Nun kann man sogar Spaß haben und die Knoten mit der Maus umherziehen.

Hier ist ein Beispiel zur Veranschaulichung der Einfachheit der Benutzung (es unterscheidet sich im Grunde gar nicht viel von dem ursprünglichen Beispiel, enthält aber eine Reihe an Verbesserungen):

var redraw;
var height = 300;
var width = 400;
 
/* only do all this when document has finished loading (needed for RaphaelJS) */
window.onload = function() {
 
    var g = new Graph();
    /* add simple nodes */
    g.addNode("strawberry");
    g.addNode("cherry");
 
    /* add a node with a customized label */
    g.addNode("id34", { label : "Tomato" });
 
    /* add a node with a customized shape
       (the Raphael graph drawing implementation can draw this shape, please
       consult the RaphaelJS reference for details http://raphaeljs.com/) */
    g.addNode("id35", {
        label : "Meat" ,
        /* filling the shape with a color makes it easier to be dragged */
        getShape : function(r,x,y) {
            return r.rect(x-30, y-13, 62, 33).attr({"fill": "#f00", "stroke-width": 2});
        }
    });
 
    /* connect nodes with edges */
    g.addEdge("strawberry", "cherry");
    g.addEdge("cherry", "apple");
    g.addEdge("id34", "cherry");
 
    /* customize the colors of that edge */
    g.addEdge("id35", "apple", { color : "#38a" , colorbg : "#bdf" });
 
    /* add an unknown node implicitly by adding an edge */
    g.addEdge("strawberry", "apple");
 
    /* layout the graph using the Spring layout implementation */
    var layouter = new Graph.Layout.Spring(g);
    layouter.layout();
 
    /* draw the graph using the RaphaelJS draw implementation */
    var renderer = new Graph.Renderer.Raphael('canvas', g, width, height);
    renderer.draw();
 
    redraw = function() {
        layouter.layout();
        renderer.draw();
    };

Das Ergebnis sieht dann folgendermaßen aus:

Probier es aus unter dracula.ameisenbar.de, hol Dir den Code via launchpad oder lade das zip-Archiv herunter. Es sind noch einige Optimierungen am Algorithmus notwendig, sowie die Programmstruktur zu ordnen. Vieles im Code habe ich bereits kommentiert und es ist eine Beispiel-HTML-Seite im Archiv, welche die Anwendungsmöglichkeiten demonstriert. Viel Spaß!

Für Kommentare bin ich sehr dankbar!

Update: Es gibt eine neue Version zum Probieren!

Schlagworte: , , , , , ,

Kommentieren

Comment Spam Protection by WP-SpamFree