12

Ich möchte eine Sankey diagram mit Javascript zeichnen. Kann irgendjemand eine Richtung in Bezug auf die Algorithmen oder Bibliotheken geben, die dafür verfügbar sind?Sankey Diagramm in Javascript

+0

Verwandte Frage: http://stats.stackexchange.com/questions/24074/whats-a-good-tool-to-create-sankey-diagrams/24114# 24114 – Thilo

Antwort

11

Dies ist ein einfaches Diagramm Sankey raphaeljs

function Sankey(x0, y0, height, losses) { 
    var initialcolor = Raphael.getColor(); 
    var start = x0 + 200; 
    var level = y0 + height; 
    var heightunit = height/100; 
    var remaining = 100 * heightunit; 

    function drawloss(start, level, loss) { 
     var thecolor = Raphael.getColor(); 
     paper.path("M" + (start - 100) + "," + (level - loss) + "L" + start + "," + (level - loss)).attr({stroke: thecolor}); 
     paper.path("M" + (start - 100) + "," + level + "L" + start + "," + level).attr({stroke: thecolor}); 
     paper.path("M " + start + "," + level + " Q" + (start + 100) + "," + level + " " + (start + 100) + "," + (level + 100)).attr({stroke: thecolor}); 
     paper.path("M " + start + "," + (level - loss) + " Q" + (start + 100 + loss) + "," + (level - loss) + " " + (start + 100 + loss) + "," + (level + 100)).attr({stroke: thecolor}); 
     paper.path("M " + (start + 100) + "," + (level + 100) + " L " + (start - 10 + 100) + "," + (level + 100) + " L " + (start + loss/2 + 100) + "," + (level + 110) + " L " + (start + loss + 10 + 100) + "," + (level + 100) + " L " + (start + loss + 100) + ", " + (level + 100)).attr({stroke: thecolor}); 
    } 

    function drawremaining(start, level, loss) { 
     paper.path("M 100," + y0 + "L" + (start + 100) + "," + y0).attr({stroke: initialcolor}); 
     paper.path("M" + (start - 100) + "," + level + "L" + (start + 100) + "," + level).attr({stroke: initialcolor}); 
     paper.path("M " + (start + 100) + " " + y0 + " L " + (start + 100) + " " + (y0 - 10) + " L " + (start + 110) + " " + (y0 + loss/2) + " L " + (start + 100) + " " + (level + 10) + " L " + (start + 100) + " " + level).attr({stroke: initialcolor}); 
    } 

    function drawstart(x0, y0, width, height) { 
     paper.path("M " + x0 + "," + y0 + "L" + (x0 + width) + "," + y0).attr({stroke: initialcolor}); 
     paper.path("M " + x0 + "," + (y0 + height) + "L" + (x0 + width) + "," + y0 + height)).attr({stroke: initialcolor}); 
     paper.path("M " + x0 + "," + y0 + "L" + x0 + "," + (y0 + height)).attr({stroke: initialcolor}); 
    } 

    drawstart(x0, y0, 100, height); 

    for (var i in losses) { 
     drawloss(start, level, losses[i] * heightunit); 
     remaining -= losses[i] * heightunit; 
     level -= losses[i] * heightunit; 
     start += 100; 
    } 
} 

Und ich benutze es wie folgt aus:

<div id="notepad" style="height:1000px; width:1000px; background: #eee"></div> 
<script type="text/javascript"> 
    var paper = Raphael(document.getElementById("notepad"), 1020, 1000); 
    var losses=[50, 30, 5]; 
    Sankey(10, 100, 200, losses); 
</script> 
+1

Aktualisierter Link: https://dmitrybaranovskiy.github.io/raphael/ – u01jmg3

1

Dank für das Starten mich auf dem Weg zu zenify, hatte ich einige der verfeinern Code oben kopiert, um es zur Arbeit zu bringen, aber es gibt definitiv einen guten Ausgangspunkt. Der folgende Code kann in eine HTM-Datei kopiert werden und Sie müssen raphael-min.js nur im selben Verzeichnis haben, damit es funktioniert.

Grüße/Colm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" class="JS"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
<title>Raphael makes Sankey</title> 
<script type="text/javascript" src="raphael-min.js"></script> 
<script type="text/javascript"> 
function Sankey(x0,y0,height,losses){ 
    initialcolor= Raphael.getColor(); 
    var start=x0+200; 
    var level=y0+height;  
    var heightunit=height/100; 
    var remaining=100*heightunit; 

function drawloss(start,level,loss){ 
    var thecolor=Raphael.getColor(); 
    paper.path("M"+(start-100)+","+(level-loss)+"L"+start+","+(level-loss)).attr({stroke: thecolor}); 
    paper.path("M"+(start-100)+","+(level)+"L"+start+","+(level)).attr({stroke: thecolor}); 
    paper.path("M "+start+","+level+" Q"+(start+100)+","+level+" "+(start+100)+","+(level+100)).attr({stroke: thecolor}); 
    paper.path("M "+start+","+(level-loss)+" Q"+(start+100+loss)+","+(level-loss)+" "+(start+100+loss)+","+(level+100)).attr({stroke: thecolor}); 
    paper.path("M "+(start+100)+","+(level+100)+" L "+(start-10+100)+","+(level+100)+" L "+(start+(loss/2)+100)+","+(level+110)+" L "+(start+(loss)+10+100)+","+(level+100)+" L "+(start+(loss)+100)+", "+(level+100)).attr({stroke: thecolor}); 
} 

function drawremaining(start,level,loss){ 
    paper.path("M 100,"+y0+"L"+(start+100)+","+y0).attr({stroke: initialcolor}); 
    paper.path("M"+(start-100)+","+(level)+"L"+(start+100)+","+(level)).attr({stroke: initialcolor}); 
    paper.path("M "+(start+100)+" "+y0+" L "+(start+100)+" "+(y0-10)+" L "+(start+110)+" "+(y0+(loss/2))+" L "+(start+100)+" "+(level+10)+" L "+(start+100)+" "+(level)).attr({stroke: initialcolor}); 
} 

function drawstart(x0, y0, width, height){ 
    paper.path("M "+x0+","+y0+"L"+(x0+width)+","+y0+"").attr({stroke: initialcolor}); 
    paper.path("M "+x0+","+(y0+height)+"L"+(x0+width)+","+y0+height+"").attr({stroke: initialcolor}); 
    paper.path("M "+x0+","+y0+"L"+x0+","+(y0+height)+"").attr({stroke: initialcolor}); 
} 

    drawstart(x0,y0,100,height); 
    for (var i in losses){ 
     drawloss(start,level,losses[i]*heightunit); 
     remaining-=losses[i]*heightunit; 
     level-=losses[i]*heightunit; 
     start+=100; 
    } 
    drawremaining(start, level, remaining); 
} 
</script> 
</head> 
<body id="blog"> 
    <div id="notepad" style="height:1000px; width:1000px; background: #eee"></div> 
    <script type="text/javascript"> 
    var paper = Raphael(document.getElementById("notepad"), 1020, 1000); 
    var losses=[50, 30, 5]; 
    Sankey(10, 100, 200, losses); 
    </script> 
</body> 
</html> 
+0

Das ist großartig! Haben Sie jetzt eine Idee, wie die erstellten Diagramme in ein Bildformat exportiert werden könnten, das vom Benutzer gespeichert werden könnte? – 321zeno

+0

Hmm, das ist mir momentan überlegen. Im Moment denke ich über die Idee eines jquery-Plugins nach, das auf eine html-Tabelle von Daten einwirkt, bei der Sie die Tabellen-ID, die Datenspalte und die Titelspalte in das Plugin eingeben. Der Traum ist, dass er den sankey generiert und die Tabelle erweitert, damit Sie die verschiedenen Werte dynamisch neu anordnen, den Winkel/die Länge des Pfeils und eine Million anderer Dinge einstellen können. –