Gephi可视化(二)

  继在园子里写的《Gephi可视化(一)——使用Gephi Toolkit建立Gephi应用》介绍了如何使用Gephi Toolkit工具集进行可视化编程后,本篇对Gephi Toolkit进行一个详尽的介绍,了解其工做原理以及与Gephi应用程序之间的差别,Gephi Toolkit对于平台的要求使用方法,最后经过比较可视化工具集Prefuse,列举两种可视化工具之间的类似之处。html

  Gephi Toolkit是一个标准的java类库,任何java工程均可以引入使用(包括eclipse、netbeans等),该类库中包含了Gephi中必要的模块,如Graph、Layout、Filters、IO等。java

  该工具包只有一个jar文件,能够在java应用中使用,其保留了Gephi的绝大部分特性。git

  官网主页:           http://gephi.github.io/toolkit/github

  GitHub主页:      https://github.com/gephi/gephi-toolkit-demos算法

 

  工做原理:编程

  Gephi是基于模块化的思想设计的,其真正的体现了高内聚低耦合的思想。每一个模块负责不一样的职责,好比有专门负责图形结构的Graph,有专门用于布局的Layout。这里的Gephi Toolkit就是剥离了Gephi源码中的user interfaces modules(用户界面模块),并可以保证程序正常运行的工具集,这也正是该工具集存在的意义。经过下图咱们能够大体了解Gephi以及Gephi Toolkit之间的关系:微信

从图中看出,也正是剥离了与Netbeans的依赖模块,才使得Gephi Toolkit也能够在Eclipse或是MyEclipse中运行(Gephi是基于Netbeans平台开发的)。app

Gephi Toolkit从0.8版本开始就添加了预览功能,能够保证在编写可视化需求代码后经过PreviewController类进行可视化展示,并支持缩放。dom

 

  下面咱们仍是经过走代码的形式一探Gephi Toolkiteclipse

  1.建立项目是必不可少的环节,值得一提的是,Gephi支持多工做空间,这个相似于Linux的多个工做区(即桌面)的机制(据说Win10也支持这种多桌面的效果了)。Gephi中不一样的Workspace的同时进行不一样图形的展现与操做。

  代码以下:

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

  

  2.经过Lookup全局类,获得各个对象的操做模型或控制器(我的感受Lookup采用的是反射的原理得到类的对象,没有深究)

1
2
3
GraphModel graphModel = Lookup.getDefault().lookup(GraphController. class ).getModel();
PreviewModel model = Lookup.getDefault().lookup(PreviewController. class ).getModel();
PreviewController previewController = Lookup.getDefault().lookup(PreviewController. class );

  GraphModel比如存放整个图形元素的容器,包括节点、边、标签等信息;PreviewModel等于得到了一个如何进行预览展示的操做入口。

 

  3.在工做空间中导入数据,不一样于上篇中直接读取数据文件,这里采用生成随机图形的方法,定义随机生成节点个数500,边与边连线的几率为0.005,并用Container容器进行接收数据;使用导入接口控制器将Container加载到工做空间Workspace中。

1
2
3
4
5
6
7
8
9
10
//Generate a new random graph into a container
Container container = Lookup.getDefault().lookup(ContainerFactory. class ).newContainer();
RandomGraph randomGraph =  new  RandomGraph();
randomGraph.setNumberOfNodes( 500 );
randomGraph.setWiringProbability( 0.005 );
randomGraph.generate(container.getLoader());
          
//Append container to graph structure
ImportController importController = Lookup.getDefault().lookup(ImportController. class );
importController.process(container,  new  DefaultProcessor(), workspace);

  

  4.经过自动化布局类AutoLayout向其中添加各类布局算法。这里前后分别加入了ForceAtlasLayout布局以及YifanHuLayout布局,设置执行时间为一分钟。

1
2
3
4
5
6
7
8
9
AutoLayout autoLayout =  new  AutoLayout( 1 , TimeUnit.MINUTES);
autoLayout.setGraphModel(graphModel);
YifanHuLayout firstLayout =  new  YifanHuLayout( null new  StepDisplacement(1f));
ForceAtlasLayout secondLayout =  new  ForceAtlasLayout( null );
AutoLayout.DynamicProperty adjustBySizeProperty = AutoLayout.createDynamicProperty( "forceAtlas.adjustSizes.name" , Boolean.TRUE,  0 .1f); //True after 10% of layout time
AutoLayout.DynamicProperty repulsionProperty = AutoLayout.createDynamicProperty( "forceAtlas.repulsionStrength.name" , new  Double( 500 .), 0f); //500 for the complete period
autoLayout.addLayout(firstLayout,  0 .5f);
autoLayout.addLayout(secondLayout,  0 .5f,  new  AutoLayout.DynamicProperty[]{adjustBySizeProperty, repulsionProperty});
autoLayout.execute();

  经过查看AutoLayout类的源码,咱们发现autoLayout.addLayout()方法中的autoLayout其实就是一个List集合。

 

  5.说了这么多,咱们作可视化的仍是须要眼见为实,能够经过PreviewModel设置展现的参数,如是否显示节点上的标签、边的颜色粗细等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
model.getProperties().putValue(PreviewProperty.SHOW_NODE_LABELS, Boolean.TRUE);
model.getProperties().putValue(PreviewProperty.NODE_LABEL_COLOR,  new  DependantOriginalColor(Color.WHITE));
model.getProperties().putValue(PreviewProperty.EDGE_COLOR,  new  EdgeColor(Color.WHITE));
model.getProperties().putValue(PreviewProperty.EDGE_THICKNESS,  new  Float( 0 .1f));    model.getProperties().putValue(PreviewProperty.BACKGROUND_COLOR, Color.BLACK);
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 );

  

  全部须要的参数配置好后,将其添加到JFrame进行界面化展现。

  程序运行过程当中的图片:

         

         

         

  从图形能够看出分别执行了YifanHuLayout和ForceAtlasLayout布局。

 

  看完Gephi Toolkit在构建图形、添加布局效果、展示图形的过程,仍是忍不住拿来和Prefuse对比下,虽然有些类的名称不一样,可是在处理手法上都有殊途同归之妙,下面简单列出几点类似:

  1.Workspace(Gephi)和Visualization(Prefuse)

  Prefuse中的Visualization是一个数据中心,因此的数据最终要聚集到数据中心中,包括图形的结构、如何渲染、布局的添加等等;Gephi的Workspace也是一个内部顶级容器,与Visualizaiton做用类似,经过代码

1 previewController.refreshPreview();

  进入refreshPreview()方法能够发现也是更新Workspace对象,也就是更新其中的数据。

 

  2.GraphModel(Gephi)和VisualGraph(Prefuse)

  Prefuse中的VisualGraph是指完成了从Graph到数据中心中的Graph的过程,其在原始的Graph图形上添加了节点或边以及其余元素如何最终绘制出来,包含了不少关于最终绘制的配置元素;Gephi的GraphModel也是得到了对于Graph的操做对象,利用它能够对Graph进行想要的操做

 

  3.AutoLayout(Gephi)和ActionList(Prefuse)

  Prefuse中的ActionList是一个List集合,经过这个容器能够向其中添加许多的Action(即各类展现效果或约束);Gephi中的AutoLayout也是相似的数据接口,经过查找方法autoLayout.addLayout()的源码,发现也是将想要的布局添加到一个List集合中。

  固然,两款工具集的相同点不只限于于此,同时,二者之间也还有不少的差别,具体细节欢迎加入公告栏左侧群讨论。

  如觉有用,欢迎点赞,您的点赞与鼓励是我不断前行的动力!

  本文连接:《Gephi可视化(二)——Gephi Toolkit叫板Prefuse

 

友情赞助

 

若是你以为博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶忙扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章^^。

 

    1. 支付宝                          2. 微信

 

                      

相关文章
相关标签/搜索