2016-08-03 16 views
5

Tôi đang tìm cách để hình dung đồ thị được xây dựng trong Graphx của Spark. Theo như tôi biết Graphx không có bất kỳ phương pháp trực quan nào vì vậy tôi cần xuất dữ liệu từ Graphx sang một thư viện biểu đồ khác, nhưng tôi bị kẹt ở đây. Tôi đã truy cập vào trang web này: https://lintool.github.io/warcbase-docs/Spark-Network-Analysis/ nhưng không hiệu quả. Tôi nên sử dụng thư viện nào và cách xuất đồ thị.Visualx Visualization

+0

Bạn cần chuyển đổi từ đỉnh và cạnh đồ thị để định dạng mà bạn cần. Đây là một repo chuyển đổi DataFrame sang định dạng Higcharts. https://github.com/knockdata/zeppelin-highcharts –

+0

Tùy chọn khác sẽ là lưu biểu đồ của bạn sang định dạng 'GEXF' và tải chúng vào hệ thống hiển thị' Gephi' (https://gephi.org/). Thật không may GraphX ​​không hỗ trợ định dạng đó một cách tự nhiên, nhưng bạn có thể tự mình thực hiện nó. –

Trả lời

6

Vì vậy, bạn có thể làm một cái gì đó như thế này

  1. Lưu để gexf (định dạng trao đổi đồ thị) Mã từ Manning | Spark GraphX in Action
def toGexf[VD,ED](g:Graph[VD,ED]) : String = { 
    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
    "<gexf xmlns=\"http://www.gexf.net/1.2draft\" version=\"1.2\">\n" + 
    " <graph mode=\"static\" defaultedgetype=\"directed\">\n" + 
    " <nodes>\n" + 
    g.vertices.map(v => "  <node id=\"" + v._1 + "\" label=\"" + 
         v._2 + "\" />\n").collect.mkString + 
    " </nodes>\n" + 
    " <edges>\n" + 
    g.edges.map(e => "  <edge source=\"" + e.srcId + 
        "\" target=\"" + e.dstId + "\" label=\"" + e.attr + 
        "\" />\n").collect.mkString + 
    " </edges>\n" + 
    " </graph>\n" + 
    "</gexf>" 
} 
  1. Sử dụng plugin GEXF trong linkurious.js để tải tệp

Ví dụ: http://gregroberts.github.io

enter image description here

1

bạn có thể sử dụng một trong hai Gephi hoặc d3 từ zeppelin. Kiểm tra D3.js In Action by Elijah MeeksSpark GraphX in Action by Michael S. Malak

Cho nó một đi như dưới đây từ khí cầu zeppelin trong scalajs mượn từ grapxInAction:

import org.apache.spark.graphx._ 
import scala.reflect.ClassTag 

def drawGraph[VD:ClassTag,ED:ClassTag](g:Graph[VD,ED]) = { 

val u = java.util.UUID.randomUUID 
val v = g.vertices.collect.map(_._1) 
println("""%html 
<div id='a""" + u + """' style='width:960px; height:500px'></div> 
<style> 
.node circle { fill: gray; } 
.node text { font: 10px sans-serif; 
    text-anchor: middle; 
    fill: white; } 
line.link { stroke: gray; 
    stroke-width: 1.5px; } 
</style> 
<script src="//d3js.org/d3.v3.min.js"></script> 
<script> 
.var width = 960, height = 500; 
var svg = d3.select("#a""" + u + """").append("svg") 
.attr("width", width).attr("height", height); 
var nodes = [""" + v.map("{id:" + _ + "}").mkString(",") + """]; 
var links = [""" + g.edges.collect.map(
e => "{source:nodes[" + v.indexWhere(_ == e.srcId) + 
"],target:nodes[" + 
v.indexWhere(_ == e.dstId) + "]}").mkString(",") + """]; 
var link = svg.selectAll(".link").data(links); 
link.enter().insert("line", ".node").attr("class", "link"); 
var node = svg.selectAll(".node").data(nodes); 
var nodeEnter = node.enter().append("g").attr("class", "node") 
nodeEnter.append("circle").attr("r", 8); 
nodeEnter.append("text").attr("dy", "0.35em") 
.text(function(d) { return d.id; }); 
d3.layout.force().linkDistance(50).charge(-200).chargeDistance(300) 
.friction(0.95).linkStrength(0.5).size([width, height]) 
.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("transform", function(d) { 
return "translate(" + d.x + "," + d.y + ")"; 
}); 
}).nodes(nodes).links(links).start(); 
</script> 
""") 
} 
Các vấn đề liên quan