如何根据注释属性对networkx python图中的节点进行分组?

2024-05-19 20:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将我的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')

是否有一种方法可以根据公司将名称分组?如果是,我该怎么做

我非常喜欢在networkx中使用pyvis,因为它具有交互性选项


Tags: csvnamefrom网络networkxdf节点图表
1条回答
网友
1楼 · 发布于 2024-05-19 20:26:50

我知道这有点晚了,但这里是你可以实现它的方法

请注意,pyvis可以从nodes dataframe中获取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')

输出:

enter image description here

相关问题 更多 >