Cytoscape选择器使用问题:如何根据节点度动态设置节点大小
你可以直接使用Cytoscape内置的mapData()数据映射函数实现需求,无需为每个度区间编写单独的选择器规则。mapData()可以将节点/边的指定数据属性值,线性映射到你设定的样式值区间,自动适配所有节点的属性值。
你之前写的mapData(weight)不生效是因为缺少必要参数,mapData完整传参格式为:mapData(属性名, 输入最小值, 输入最大值, 输出最小值, 输出最大值)。
修改后的完整样式代码如下:
cytoscapeobj.set_style( [ { 'selector': 'node', 'style': { 'font-family': 'helvetica', 'font-size': '20px', 'label': 'data(id)', // 这里把Degree从1到100的区间映射到20px到200px的尺寸,你可以按需调整数值 'width': 'mapData(Degree, 1, 100, 20, 200)', 'height': 'mapData(Degree, 1, 100, 20, 200)' } }, { 'selector': 'edge', 'style': { 'font-family': 'helvetica', 'font-size': '20px', // 补全参数后edge宽度映射即可生效,假设weight范围是1到10,映射到1px到10px的宽度 'width' : 'mapData(weight, 1, 10, 1, 10)' } } ] )
额外说明:
- 如果你不确定节点Degree的最大最小值,可以先遍历所有节点的
data('Degree')属性,计算出最大和最小值后再动态填充到mapData的参数中,避免硬编码数值适配性差的问题。 - 如果你需要非线性的映射规则(比如对数映射),可以使用Cytoscape的
scale()方法自定义映射逻辑,普通场景下线性的mapData完全可以满足需求。
内容的提问来源于stack exchange,提问作者V_sqrt
相关产品推荐
相关产品推荐

