cytoscape:用于分析和可视化的图论/网络库。
var cy = cytoscape({
// 非常常用的选项
container: undefined,//应该呈现图形的HTML DOM元素。
elements: [ /* ... */ ],//指定节点和路径数据的选项。
style: style: cytoscape.stylesheet()
.selector('node')
.css( /*nodes options*/ )
.selector('edge')
.css( /*edges options*/ ),//指定样式的选项。
layout: { name: 'grid' /* , ... */ },//指定布局的选项。
// 初始化视口状态:
zoom: 1,//图的初始缩放级别。
pan: { x: 0, y: 0 },//图的初始平移位置。
// 交互选项:
minZoom: 1e-50,//图的缩放级别的最小界限。视口不能缩放比这个缩放级别小。
maxZoom: 1e50,//在图的缩放级别上的最大界限。视口不能缩放比这个缩放级别大。
zoomingEnabled: true,//定义是否可缩放
userZoomingEnabled: true,//是否使用事件(如鼠标轮)
panningEnabled: true,//无论是通过用户事件还是以编程方式来定义是否启用对图表的平移。
userPanningEnabled: true,//是否允许用户事件(例如拖动图形背景)来平移图表。程序更改对PAN不受此选项的影响。
boxSelectionEnabled: false,//是否启用了框选择(即,拖动框覆盖并释放它以进行选择)。 如果启用,则用户必须点击以平移图表。
selectionType: 'single',
touchTapThreshold: 8,//一种非负整数,它指示用户在触摸设备上轻击手势时可移动的最大允许距离。
desktopTapThreshold: 4,//一种非负整数,它指示用户在桌面设备上轻击手势时可移动的最大允许距离。
autolock: false,//定义节点是否可拖动
autoungrabify: false,
autounselectify: false,//默认情况下节点是否应该是未分类的(不可变选择状态)(如果为true,则覆盖单个元素状态)。
// rendering options:
headless: false,
styleEnabled: true,
hideEdgesOnViewport: false,
hideLabelsOnViewport: false,
textureOnViewport: false,
motionBlur: false,
motionBlurOpacity: 0.2,
wheelSensitivity: 1,
pixelRatio: 'auto'
});
var cy = cytoscape({
container: document.getElementById('cy') // 定义需要渲染的容器
});
或
var cy = cytoscape({
container: $('#cy')
});
除了直接指定属性的值之外,开发人员还可以使用映射器动态指定属性值。如果定义了映射,则定义所有元素的映射数据,或使用选择器将映射限制为已定义映射数据的元素。例如,选择器[foo]将仅应用于定义了数据字段foo的元素。
data() 指定直接映射到元素的数据字段。例如,data(descr)会将属性映射到其数据中元素的descr字段中的值(即ele.data(“descr”))。这对于映射到标签文本内容(content属性)等属性很有用。例如以下代码:
cytoscape({
container: document.getElementById('cy'),
style: cytoscape.stylesheet()
.selector('node')
.css({
'content': 'data(id)'
})
elements: {
nodes: [
{ data: { id: 'a' } },
{ data: { id: 'b' } },
{ data: { id: 'c' } },
{ data: { id: 'd' } },
{ data: { id: 'e' } }
]
}
});
这样就把elements的nodes里的id值映射到了节点上,content属性也可以用label属性替代,效果图如下:
content属性也可以用到edge边缘线的参数里,比如下面的代码:
cytoscape({
container: document.getElementById(‘cy’),
style: cytoscape.stylesheet()
.selector(‘edge’)
.css({
‘content’: ‘data(name)’,
‘width’: 8,
‘line-color’: ‘#888’,
‘target-arrow-color’: ‘#888’,
‘source-arrow-color’: ‘#888’,
‘target-arrow-shape’: ‘triangle’
})
效果如图:
Shape:
语法:
cytoscape({
container: document.getElementById('cy'),
style: cytoscape.stylesheet()
.selector('node')
.css({
...
})
});
label
,因此宽度自动基于节点的标签。label
,因此高度自动基于节点的标签。width
和height
,因此如果您需要等边形状(即width !== height
几个等边的形状),您可能需要调整width
和height
。化合物仅支持*矩形形状,因为化合物的尺寸由子项的边界框定义。接受以下值:ellipse(椭圆)、triangle(三角形)、rectangle(矩形)、roundrectangle(圆角矩形)、bottomroundrectangle(底角矩形)、cutrectangle(矩形截面)、barrel(桶)、rhomboid(菱形)、diamond(钻石)、pentagon(五角形)、hexagon(六角形)、concavehexagon(凹面六边形)、heptagon(七边形)、octagon(八角形)、star(星形)、tag(标签)、vee(V字形)、polygon(多边形,需配合shape-polygon-points属性)Background:
语法:
cytoscape({
container: document.getElementById('cy'),
style: cytoscape.stylesheet()
.selector('.highlighted')
.css({
...
})
});
Padding:
填充定义了节点维度的附加内容。例如,padding
会增加节点的外部(即总)宽度和高度。这可用于在width: label; height: label
的标签周围添加间距; 节点,或者它可以用于在复合节点父节点及其子节点之间添加间距。
这些属性会影响边线的样式:
语法:
cytoscape({
container: document.getElementById('cy'),
style: cytoscape.stylesheet()
.selector('edge')
.css({
...
})
});
width : 边缘线的宽度,可接受百分比和像素。
代码:
'width':10
curve-style : 用于分离两个节点之间的两个或多个边缘的弯曲方法;可能是:
haystack(默认的,非常快的,捆绑直边,其中不支持环和化合物)
代码:
'curve-style': 'haystack'
bezier (捆绑弯曲边),单独使用该属性和haystack属性没有太大差别,如果配合Edge arrow标题里的属性可以显示不同款式的边缘线。
代码:
'curve-style': 'bezier',
'target-arrow-shape': 'triangle',
'target-arrow-color': 'red'
unbundled-bezier(用于手动控制点的弯曲边)
代码:
'curve-style': 'unbundled-bezier'
segments(一系列直线)。
代码:
'curve-style': 'segments'
line-color : 边缘线条的颜色。
代码:
'line-color': 'red'
line-style : 边缘线条的样式;可以是solid, dotted, or dashed.
适用于自动捆绑贝塞尔边缘(curve-style: bezier):
control-point-step-size
的单个值.0对于由多条直线构成的边适用(curve-style: segments):
-arrow-color :边缘的源箭头的颜色。
代码:
'curve-style': 'bezier',
'target-arrow-shape': 'triangle',
'target-arrow-color': 'red'
-arrow-shape : 边缘源箭头的形状可以是:
-arrow-fill : 边缘源箭头的填充状态可以是填充的或空心的。对于上面的每个边箭头属性,用一个来替换
只有中部箭头支持在haystack边缘。
语法:
cytoscape({
container: document.getElementById('cy'),
style: cytoscape.stylesheet()
.selector('node')
.css({
...
})
});
Label text(标签文字):
Basic font styling(基本的字体样式):
Wrapping text(包装文字):
text-wrap
被设置为wrap
或ellipsis
时应用。For only manual newlines (i.e. \n), set a very large value like 1000px such that only your newline characters would apply.Node label alignment(节点标签对齐):
Edge label alignment(边缘标签对齐):
Margins(边距):
Rotating text(旋转文字):
autorotate
将标签与边缘对齐。none
可用于表示0deg
。Outline(轮廓):
text-outline-color : 元素标签文本周围轮廓的颜色。
text-outline-opacity : 标签文本上轮廓的不透明度。
text-outline-width : 标签文本上的轮廓大小。
代码:
'text-outline-width': 5,
'text-outline-color': '#888',
语法:
cytoscape({
container: document.getElementById('cy'),
style: cytoscape.stylesheet()
.selector('.highlighted')
.css({
...
})
});
transition-property : 以逗号分隔的样式属性列表,用于在此状态下设置动画。
代码:
'transition-property': 'background-color, line-color, target-arrow-color'
效果:http://js.cytoscape.org/demos/animated-bfs/
transition-duration : 以秒为单位的过渡时间(例如0.5秒)。
代码:
'transition-duration': '0.5s'
transition-delay : 转换发生之前的延迟时间(例如250ms)。
代码:
'transition-delay': '0.5s'
transition-timing-function :一个缓动函数,用于控制动画进度曲线;可能是以下值之一。这里有篇文章可供参考。
linear (default),
spring( tension, friction ) (the demo has details for parameter values),
cubic-bezier( x1, y1, x2, y2 ) (the demo has details for parameter values),
这些属性会影响图表的UI全局,并仅适用于核心。您可以使用特殊核心选择器字符串来设置这些属性。
语法:
cytoscape({
container: document.getElementById('truecy'),
style: cytoscape.stylesheet()
.selector('core')
.css({
...
})
})
Indicator:
active-bg-color : 当用户抓住背景时显示的指示符的颜色。
实例代码:
active-bg-opacity : 活动背景指示符的不透明度。
active-bg-size : 活动背景指示符的大小。
Selection box:
Options
var options = {
name: 'grid',//布局名称
padding: 30, // 画布内边距
boundingBox: undefined, // 布局约束界限;如: { x1, y1, x2, y2 } or { x1, y1, w, h }
rows: undefined, // 网格中的行数
cols: undefined, // 网格中的列数
sort: undefined, // 排序函数来排序节点;例如:function(a, b){ return a.data('weight') - b.data('weight') }
};
cy.layout( options );
breadthfirst布局基于图的第一个遍历来将节点放在层次结构中。
语法:
cytoscape({
container: document.getElementById('cy'),
style: cytoscape.stylesheet()
layout: {
**...**
}
});
Options
var options = {
name: 'breadthfirst',//布局名称
fit: true, // 是否使视口适合图形,设置为false时图形会超出视口,所以一般默认就好
directed: false, //树是否向下(或者如果为假,边缘可以指向任何方向)
padding: 30, // 填充适合
circle: false, // 如果为真,则将深度放在同心圆中,从中间向外发散节点,如果为假,则将深度置于顶部
spacingFactor: 1.75, // 正间隔系数,更大=>节点之间的空间更大(如果导致重叠,则为N.B.n / a)
boundingBox: undefined, // 约束布局边界; {x1,y1,x2,y2}和{x1,y1,w,h}
avoidOverlap: true, // 防止节点重叠,如果没有足够的空间可能会溢出boundingBox
nodeDimensionsIncludeLabels: false, // 在计算布局算法的节点边界框时排除标签
roots: undefined, //树的根
maximalAdjustments: 0, // 尝试以最大方式定位节点的次数(即没有回溯)
animate: false, //是否转换节点位置
animationDuration: 500, // 动画持续时间(如果启用)
animationEasing: undefined, // 如果启用,则放宽动画
animateFilter: function ( node, i ){ return true; }, // 确定节点是否应设置动画的函数。默认情况下在动画上启用动画的所有节点。布局开始时,非动画节点立即定位。
ready: undefined, //在layoutready上回调
stop: undefined, //在 layoutstop上的回调
transform: function (node, position ){ return position; } // 变换给定的节点位置。用于改变离散布局中的流向
};
cy.layout( options );
Options
var options = {
//布局名称
name: 'cose',
// 画布内边距
padding: 30,
// 节点间间距
componentSpacing: 40,
};
cy.layout( options );
Details
请注意,此函数仅对调用集合中的图形子集执行广度优先搜索。
此函数返回一个对象,该对象包含两个集合({path:eles,found:node}),搜索找到的节点和搜索路径:
found
为空。Examples
var bfs = cy.elements().bfs('#a', function(){}, true);
var i = 0;
var highlightNextEle = function(){
if( i < bfs.path.length ){
bfs.path[i].addClass('highlighted');
i++;
setTimeout(highlightNextEle, 1000);
}
};
// kick off first highlight
highlightNextEle();
效果图1(获取到的是节点信息):
效果图2(获取到的是路经信息):
然后依次交替获取下一个节点和路径的信息。