JavaScript - Use Cytoscape Web Library to display network graph

由於工作上的需求,有利用到Cytoscape Web Library去畫node之間的關係呈現,方便研究者去

瞭解它們之間的關聯,所以在此就大概說明一下這套Library的功用。

官網上有提到,它是一套我們可以利用其JavaScript API並將資料組合成其自訂的資料格式,

如官網上提到的GraphML是其中一個,有點像XML格式的資料型態,最後它將透過一個

.swf檔案去畫出graph,而我們開發者只要去控制JavaScript Code即可。

JavaScript code配置如下:

  1. var div_id = "cytoscapeweb";
  2. // initialization options
  3. var options = {
  4. swfPath: "./swf/CytoscapeWeb",
  5. flashInstallerPath: "./swf/playerProductInstall"
  6. };
  7. var visual_style = {
  8. global: {
  9. backgroundColor: "#FFFFFF"
  10. },
  11. nodes: {
  12. shape: "ELLIPSE",
  13. borderWidth: 2,
  14. borderColor: {
  15. defaultValue:"#157DEC"
  16. },
  17. size: { passthroughMapper: { attrName: "weight" } },
  18. color: {
  19. defaultValue: "#FFFF00",//#fff999
  20. discreteMapper: {
  21. attrName: "nodecolor",
  22. entries: [
  23. { attrValue: "node1", value: "#008000" }
  24. ]
  25. }
  26. },
  27. selectionBorderColor:"#000000",
  28. hoverGlowOpacity:1,
  29. hoverBorderColor:"#000000",
  30. hoverGlowColor:"#B0E2FF",
  31. labelHorizontalAnchor: "center",
  32. labelFontColor:"#000000",
  33. labelGlowOpacity:1,
  34. labelGlowColor:"#FCFCFC",
  35. labelVerticalAnchor:"top",
  36. labelFontWeight:"bold",
  37. labelFontSize:12,
  38. selectionColor:"#AB8EC6",
  39. opacity:1.0
  40. },
  41. edges: {
  42. width: 3,
  43. color: "#1E669B"
  44. }
  45. };
  46. vis = new org.cytoscapeweb.Visualization(div_id, options);
  47. // callback when Cytoscape Web has finished drawing
  48. vis.ready(function() {
  49. // add a listener for when nodes and edges are clicked
  50. });
  51. // draw options
  52. var draw_options = {
  53. // your data goes here
  54. network: xml,
  55. // hide pan zoom
  56. layout: 'ForceDirected',
  57. panZoomControlVisible: true,
  58. visualStyle: visual_style
  59. };
  60. vis.draw(draw_options);

請注意visual_style的部分,裡面會有您自訂的一些屬性名稱,如:
  1. defaultValue: "#FFFF00",//#fff999
  2. discreteMapper: {
  3. attrName: "nodecolor",
  4. entries: [
  5. { attrValue: "node1", value: "#008000" }
  6. ]
  7. }

這段是定義color的部分,裡面的nodecolor表示當您帶入的GraphML的資料格式有定義如下

<data key='type3'>node1</data>,表示graph就會去帶出這個node顯示#008000的顏色

若是data 非node1則會顯示default預設的顏色來呈現。

而如上之network: xml之xml變數所帶的data,在這裡就是組織的GraphML形式的資料。

而我在這段js code內有獨自定義的一些屬性,剛剛有提到nodecolor了,表示node的顏色,還有

node size =>  size: { passthroughMapper: { attrName: "weight" } },

對映GraphML為<data key='weight'>20</data>

所以您在GraphML定義的東西,在JavaScript基本配置內如果沒有特別定義的話,就無法呈現

出您要的效果囉!

而GraphML定義如下:

  1. var xml = '\
  2. <graphml>\
  3.   <key id="label" for="all" attr.name="label" attr.type="string"/>\
  4. <key id="nodecolor" for="node" attr.name="nodecolor" attr.type="string" />\
  5. <key id="weight" for="node" attr.name="weight" attr.type="double"/>\
  6. <graph edgedefault="directed">\
  7. <node id="1">\
  8. <data key="label">A</data>\
  9. <data key="nodecolor">node1</data>\
  10. <data key="weight">22.0</data>\
  11. </node>\
  12. <node id="2">\
  13. <data key="label">B</data>\
  14. <data key="nodecolor">defaultNode</data>\
  15. <data key="weight">10.5</data>\
  16. </node>\
  17. <node id="3">\
  18. <data key="label">C</data>\
  19. <data key="nodecolor">node1</data>\
  20. <data key="weight">31.0</data>\
  21. </node>\
  22. <edge source="1" target="2">\
  23. <data key="label">A to B</data>\
  24. </edge>\
  25.       <edge source="1" target="3">\
  26.           <data key="label">A to C</data>\
  27.       </edge>\
  28. </graph>\
  29. </graphml>\
  30. ';

這邊的GraphML data是定義在JavaScript內,您也可以在server端產生並且回傳給client端。

之後可以得到如下的畫面:


畫面內您可以去調整放大縮小、移動的效果,當然您也可以去撰寫node、edge的event處理。

基本上, Cytoscape Web在呈現graph還蠻容易的,我想在做研究上會很有用!

留言