1

我正在使用 ipycytoscape 构建网络,但我不清楚如何让节点大小取决于节点的度数并向每个节点添加标签。我的网络有两列,一列用于节点,一列用于目标。

Data
Nodes      Target
A           B
B           C
B           D
C           B
E          nan


G = nx.from_pandas_edgelist(df, source='Nodes', target='Target') 

目前我正在构建图表如下:

cytoscapeobj = ipycytoscape.CytoscapeWidget()
cytoscapeobj.graph.add_graph_from_networkx(G, labels) # labels however is not adding any label to the node, so probably the location is wrong
cytoscapeobj

我知道使用设置样式进行自定义:

cytoscapeobj.set_style(my_style)

但我不知道如何更改它以根据节点的程度可视化标签和节点的大小。有没有人有过 ipycytoscape 的经验?

4

1 回答 1

1

为了能够可视化标签,您需要将节点属性添加到您的 networkx 图中并设置适当的样式。对于样式,您可以为所有节点定义一个以显示标签。要根据度数控制节点的大小,您需要向节点数据框添加度数列。您可以使用 networkx degree API 来做到这一点。您首先需要创建图形,然后基于 networkx degree API 重新创建节点数据框,并添加包含 degree 属性的节点属性,以便能够在考虑度数信息的情况下呈现图形。

这是完整的解决方案:

import ipycytoscape as cy
import networkx as nx
import pandas as pd

edge_data = {
    'source': ['A', 'B', 'B', 'C'],
    'target': ['B', 'C', 'D', 'B'],
}
link_df = pd.DataFrame.from_dict(edge_data)
node_data = {
    'id': ['A', 'B', 'C', 'D', 'E']
}
node_df = pd.DataFrame.from_dict(node_data)

G = nx.from_pandas_edgelist(link_df)
node_df = pd.DataFrame(G.degree(), columns=['id', 'degree'])
nx.set_node_attributes(G, node_df.set_index('id').to_dict('index'))
cytoscapeobj = cy.CytoscapeWidget()
cytoscapeobj.graph.add_graph_from_networkx(G)

cytoscapeobj.set_style(
    [
        {
             'selector': 'node',
             'style': {
                 'font-family': 'helvetica',
                 'font-size': '20px',
                 'label': 'data(id)'
             }
        },
        {
             'selector': 'edge',
             'style': {
                 'font-family': 'helvetica',
                 'font-size': '20px'
             }
        },
        {
             'selector': 'node[degree>0]',
             'style': {
                 'width': '100px',
                 'height': '100px'
             }
        },
        {
             'selector': 'node[degree>1]',
             'style': {
                 'width': '150px',
                 'height': '150px'
             }
        },
        {
             'selector': 'node[degree>2]',
             'style': {
                 'width': '200px',
                 'height': '200px'
             }
        }
    ]
)
cytoscapeobj

如果您想要相对值而不是绝对值,则可以在宽度和高度中使用 % 而不是 px。

于 2021-08-19T17:42:18.773 回答