Gephi可视化(一)——使用Gephi Toolkit创建Gephi应用

  在Prefuse上摸打滚爬了一段时间,发现其和蔼可亲,容易上手。但是每每在打开gephi,导入数据再运行时,总还是在心里暗自赞叹gephi的绚烂之极,无与匹敌,当然,gephi也有自己的缺陷,但是gephi是一个在发展的、进步的、不断壮大的开源软件。纵使她曾经那般伤我,我仍是对其恋恋不舍,好吧,我已经病入膏肓。。。。。

  言归正传,Gephi是一款开源免费跨平台基于JVM的复杂网络分析软件, 其主要用于各种网络和复杂系统,动态和分层图的交互可视化与探测开源工具。可用作:探索性数据分析,链接分析,社交网络分析,生物网络分析等。因为Gephi是开源软件,所以可以获取其源码,允许开发者去扩展和重复使用。

Gephi开发平台:Netbeans平台(因为之前对于这句话理解不深,在eclipse环境下浪费了不少时间)

开发语言:Java

可视化引擎:OpenGL

Gephi官网: http://gephi.github.io/

Gephi的视频介绍:   http://v.youku.com/v_show/id_XMjU5MDUwMjg4.html

Gephi API帮助文档:https://gephi.org/docs/api/

Gephi Toolkit: http://gephi.github.io/toolkit/

Gephi 论坛: https://forum.gephi.org/

  贴上gephi做的两张图:

现在,我们就深入Gephi,好好了解下这个strong visual tool,这次我们不走源码,作为过来人,我还是想提醒下,如果java功底不是很扎实或是不太熟悉Netbeans开发平台以及Swing编程知识的可以走曲线,接近Gephi,否则会让自己焦头烂额,越陷越深,不可自拔^_^。下面通过一个实例,讲解如果新建一个Gephi实例,进行可视化展示:

(1)创建一个project、一个workspace,这是必做的工作,是进行后续操作的前提:

//Init a project - and therefore a workspace
ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);
pc.newProject();
Workspace workspace = pc.getCurrentWorkspace();

(2)得到该空间的各个模型以及控制器,方便后面使用:

//Get models and controllers for this new workspace - will be useful later
AttributeModel attributeModel = Lookup.getDefault().lookup(AttributeController.class).getModel();
GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel();
PreviewModel model = Lookup.getDefault().lookup(PreviewController.class).getModel();
ImportController importController = Lookup.getDefault().lookup(ImportController.class);
FilterController filterController = Lookup.getDefault().lookup(FilterController.class);
RankingController rankingController = Lookup.getDefault().lookup(RankingController.class);

(3)导入数据,使用Container接收,并将数据导入到空间中:

//Import file       
Container container;
try {
    File file = new File(getClass().getResource("/org/gephi/toolkit/demos/resources/polblogs.gml").toURI());
    container = importController.importFile(file);
    container.getLoader().setEdgeDefault(EdgeDefault.DIRECTED);   //Force DIRECTED
} catch (Exception ex) {
    ex.printStackTrace();
    return;
}		 
//Append imported data to GraphAPI
importController.process(container, new DefaultProcessor(), workspace);

(4)通过打印信息,验证图形数据是否导入成功:

//See if graph is well imported
DirectedGraph graph = graphModel.getDirectedGraph();
System.out.println("Nodes: " + graph.getNodeCount());
System.out.println("Edges: " + graph.getEdgeCount());

(5)对图形数据进行过滤操作:

//Filter      
DegreeRangeFilter degreeFilter = new DegreeRangeFilter();
degreeFilter.init(graph);
degreeFilter.setRange(new Range(30, Integer.MAX_VALUE));     //Remove nodes with degree < 30
Query query = filterController.createQuery(degreeFilter);
GraphView view = filterController.filter(query);
graphModel.setVisibleView(view);    //Set the filter result as the visible view

(6)通过打印信息,验证过滤操作是否起作用:

//See visible graph stats
UndirectedGraph graphVisible = graphModel.getUndirectedGraphVisible();
System.out.println("Nodes: " + graphVisible.getNodeCount());
System.out.println("Edges: " + graphVisible.getEdgeCount());

 (7)执行YifanHuLayout布局算法:

//Run YifanHuLayout for 100 passes - The layout always takes the current visible view
YifanHuLayout layout = new YifanHuLayout(null, new StepDisplacement(1f));
layout.setGraphModel(graphModel);
layout.resetPropertiesValues();
layout.setOptimalDistance(200f);
layout.initAlgo();
 
for (int i = 0; i < 100 && layout.canAlgo(); i++) {
    layout.goAlgo();
}
layout.endAlgo();

(8)根据节点度值分配节点颜色:

//Rank color by Degree
Ranking degreeRanking = rankingController.getModel().getRanking(Ranking.NODE_ELEMENT, Ranking.DEGREE_RANKING);
AbstractColorTransformer colorTransformer = (AbstractColorTransformer) rankingController.getModel().getTransformer(Ranking.NODE_ELEMENT, Transformer.RENDERABLE_COLOR);
colorTransformer.setColors(new Color[]{new Color(0xFEF0D9), new Color(0xB30000)});
rankingController.transform(degreeRanking,colorTransformer);

(9)分配节点大小:

//Rank size by centrality
AttributeColumn centralityColumn = attributeModel.getNodeTable().getColumn(GraphDistance.BETWEENNESS);
Ranking centralityRanking = rankingController.getModel().getRanking(Ranking.NODE_ELEMENT, centralityColumn.getId());
AbstractSizeTransformer sizeTransformer = (AbstractSizeTransformer) rankingController.getModel().getTransformer(Ranking.NODE_ELEMENT, Transformer.RENDERABLE_SIZE);
sizeTransformer.setMinSize(3);
sizeTransformer.setMaxSize(10);
rankingController.transform(centralityRanking,sizeTransformer);

(10)预览效果配置,并呈现到Display上,添加到JFrame,进行界面话展示:

//Preview
PreviewController previewController = Lookup.getDefault().lookup(PreviewController.class);
		model.getProperties().putValue(PreviewProperty.SHOW_NODE_LABELS, Boolean.TRUE);
model.getProperties().putValue(PreviewProperty.EDGE_COLOR, new EdgeColor(Color.GRAY));
model.getProperties().putValue(PreviewProperty.EDGE_THICKNESS, new Float(0.1f));
model.getProperties().putValue(PreviewProperty.NODE_LABEL_FONT, model.getProperties().getFontValue(PreviewProperty.NODE_LABEL_FONT).deriveFont(8));
previewController.refreshPreview();
		 
//New Processing target, get the PApplet
ProcessingTarget target = (ProcessingTarget) previewController.getRenderTarget(RenderTarget.PROCESSING_TARGET);
PApplet applet = target.getApplet();
applet.init();

//Refresh the preview and reset the zoom
previewController.render(target);
target.refresh();
target.resetZoom();

//Add the applet to a JFrame and display
JFrame frame = new JFrame("Test Preview");
frame.setLayout(new BorderLayout());
        
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(applet, BorderLayout.CENTER);
        
frame.pack();
frame.setVisible(true);

  控制台打印信息为:

# Nodes loaded: 1490
# Edges loaded: 19025
Nodes: 1490
Edges: 19025
Nodes: 397
Edges: 10599

  执行的结果如下图所示:

了解Prefuse的API以及创建一个Prefuse应用的思路详见《漫谈可视化Prefuse(二)---一分钟学会Prefuse》,再回首看Gephi Toolkit创建gephi应用的思路也是如出一辙,后续有时间将继续Gephi Toolkit之旅!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云社区全球资讯抢先看

GitHub上11月份最热门的Java项目

链接:www.itcodemonkey.com/article/1424.html 2017年11月GitHub上最热门的Java项目新鲜出炉~ 一起来看看这些...

25600
来自专栏编程

盘点·GitHub最著名的20个Python机器学习项目

摘要 摘要:开源是技术创新和快速发展的核心。这篇文章向你展示Python机器学习开源项目以及在分析过程中发现的非常有趣的见解和趋势。 我们分析了GitHub上的...

30300
来自专栏维C果糖

关于 GitHub 的若干补充

在通读「史上最简单的 GitHub 教程」的系列博文之后,相信大家已经初步了解以及会使用 GitHub 进行常见的操作啦!为了大家玩的更好,在此给出 GitHu...

22780
来自专栏PingCAP的专栏

实录 | 黄东旭:开源与基础软件创业在中国

10 月 23 日,EGO 北京分会会员、PingCAP 联合创始人兼 CTO 黄东旭作为 EGO 线上分享第二季嘉宾,与超过 400 位 EGO 会员交流了自...

20100
来自专栏51CTO技术栈的专栏

放弃 Dubbo,选择最流行的 Spring Cloud 微服务架构实践与经验总结

在使用 Spring Cloud 之前,我们对微服务实践是没有太多的体会和经验的。从最初的开源软件云收藏来熟悉 Spring Boot,到项目中的慢慢使用,再到...

5K10
来自专栏腾讯开源的专栏

开源项目无人问津?不妨拆读腾讯开源大神的“锦囊妙计”!

WeFlow是WeChat团队为web开发人员提供跨平台支持和环境准备的前端工作流开发工具,目前已支持微信游戏、微信·朋友圈广告、微信·城市服务等第三方合作团队...

67210
来自专栏HaHack的专栏

dingdang-robot:一个开源的中文智能音箱项目

本文介绍我在业余时间开发的一个开源的智能音箱项目 dingdang-robot ,分享一下我在开发这个项目过程中的心得。

5.5K50
来自专栏西安-晁州

oAuth2.0及jwt介绍

oAuth2.0流程示意如下: ? 关于jwt介绍: ? 说明: 关于jwt简单说明一下,jwt即为json web token,是用来和服务端建立加密通信所使...

21300
来自专栏西安-晁州

github无法访问?试试修改hosts

github国内无法访问时,可以试试如下修改hosts,亲测有效: 204.232.175.78 http://documentcloud.github.com...

26900
来自专栏编程

GitHub上11 月份最热门的开源项目

链接:www.itcodemonkey.com/article/1468.html 转载请注明来源作者 2017 年 11 月份 GitHub 上最热门的开源项...

23000

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励