如何根据注释属性对networkx python图中的节点进行分组?
Posted
技术标签:
【中文标题】如何根据注释属性对networkx python图中的节点进行分组?【英文标题】:How to group nodes in a networkx python graph based on note attributes? 【发布时间】:2020-09-09 09:15:45 【问题描述】:我试图以图表的形式可视化我的 Linkedin 网络,其中节点是我所连接的人,这些节点将聚集到他们工作的公司中。我将我的 Linkedin 网络下载为 csv 文件并设法将图形可视化,但它看起来像一个巨大的地球。如果我可以按公司对姓名进行分组,当我单击节点时,可以获取该人的联系方式,那将是一个惊人的视觉效果。我正在使用 pyvis 和 networkx。
这是我的代码:
from pyvis.network import Network
import networkx as nx
df = pd.read_csv("Connections.csv")
# The dataframe consists of columns First Name, Last Name, #Company, Position and Connected On.
# I added a column called Name which is concat of first and #last names
G_weighted = nx.Graph()
G_weighted.add_edges_from(zip(df["My Network"], df["Name"]))
nx.set_node_attributes(G_weighted, df["Company"], 'Company')
g = Network(height=1080,width=1080, notebook=True)
g.toggle_hide_edges_on_drag(True)
g.barnes_hut()
g.from_nx(G_weighted)
g.show_buttons()
g.show('graph.html')
有没有办法根据公司将名称分组?如果是这样,我该怎么做?
由于交互选项,我非常喜欢将 pyvis 与 networkx 一起使用。
【问题讨论】:
【参考方案1】:我知道这有点晚了,但这里是你可以实现它的方法。
请注意,pyvis 可以从节点数据框中获取 group
属性并为每个组指定不同的颜色,以及 title
属性,以便当您将鼠标悬停在节点上时可以查看详细信息。
import networkx as nx
import pandas as pd
from pyvis.network import Network
# creating test data
node_data =
"id": [1, 2, 3, 4],
"Name": ["Me", "Batman", "Superman", "IronMan"],
"Company": ["Marvel", "DC", "DC", "Marvel"],
edge_data = "source": [1, 1, 2], "target": [4, 2, 3]
nodes = pd.DataFrame(node_data)
edges = pd.DataFrame(edge_data)
# getting a group id for each company
groups = nodes.groupby("Company")["id"].apply(list).reset_index()
groups["group"] = groups.index
# finding group id for each node from groups dataframe
nodes = nodes.merge(groups, how="inner", on=["Company"])
nodes["title"] = nodes[["Name", "Company"]].apply(lambda x: f"Name:x[0] , Company:x[1]", axis=1)
nodes = nodes.drop("id_y", axis=1).set_index("id_x")
# collecting node attributes for network x
node_attrs = nodes.to_dict("index")
# creating a network x graph from dataframes
graph = nx.from_pandas_edgelist(edge_data)
nx.set_node_attributes(graph, node_attrs)
pyvis_nt = Network("1000px", "1000px", heading="Graph")
pyvis_nt.from_nx(graph)
pyvis_nt.show('test_graph.html')
输出:
【讨论】:
以上是关于如何根据注释属性对networkx python图中的节点进行分组?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 Networkx 和 Python 根据节点属性获取度中心性值?