如何利用Pandas DataFrame在NetworkX中构建以CEO为中心且部门节点相连的自我图(Ego Graph)
实现以CEO为中心的自我图(NetworkX + Pandas)
我来帮你一步步完成这个需求,确保CEO节点处于图的中心位置,且所有部门节点直接与CEO相连:
给定数据
首先把你提供的员工数据整理成清晰的表格格式:
| BaseRate | DepartmentName | Title |
|---|---|---|
| 80 | Production | Vice President |
| 140 | Executive | CEO |
| 30 | Maintenance | Engineer |
| 70 | Production | Assistant |
现有代码片段
你已经完成了部分绘图逻辑:
D = nx.ego_graph(B, n = 'CEO') nx.draw(D,node_color=color, with_labels=True, node_size=1500, arrowsize=20)
完整解决方案
步骤1:导入所需库
首先导入实现功能必备的三个库:import pandas as pd import networkx as nx import matplotlib.pyplot as plt步骤2:创建DataFrame并构建关系图
我们需要先搭建完整的节点关系,确保CEO与每个部门直接相连,再提取CEO的自我图:# 将原始数据转为Pandas DataFrame data = [ [80, 'Production', 'Vice President'], [140, 'Executive', 'CEO'], [30, 'Maintenance', 'Engineer'], [70, 'Production', 'Assistant'] ] df = pd.DataFrame(data, columns=['BaseRate', 'DepartmentName', 'Title']) # 初始化有向图(用有向图更能体现层级关系,无向图可换成nx.Graph()) B = nx.DiGraph() # 添加所有节点:CEO、各部门、各职位 B.add_node('CEO') B.add_nodes_from(df['DepartmentName'].unique()) B.add_nodes_from(df['Title'].unique()) # 建立CEO与各部门的直接连接(满足需求核心要求) for dept in df['DepartmentName'].unique(): B.add_edge('CEO', dept) B.add_edge(dept, 'CEO') # 无向图只需添加一次,有向图双向添加更直观 # 建立各职位与所属部门的连接 for _, row in df.iterrows(): B.add_edge(row['DepartmentName'], row['Title']) B.add_edge(row['Title'], row['DepartmentName'])步骤3:提取自我图并固定CEO中心位置
为了让CEO稳定处于图的中心,我们可以手动指定其坐标:# 提取CEO的自我图,radius=2确保包含部门及下属职位节点 D = nx.ego_graph(B, n='CEO', radius=2) # 用弹簧布局生成其他节点位置,强制CEO位于中心(0,0) pos = nx.spring_layout(D) pos['CEO'] = (0, 0) # 自定义样式绘图 color = ['#ff9999' if node == 'CEO' else '#66b3ff' for node in D.nodes()] nx.draw(D, pos=pos, node_color=color, with_labels=True, node_size=1500, arrowsize=20) plt.show()代码细节说明
- 选择
DiGraph是为了体现管理层级的方向感,若不需要方向可替换为nx.Graph() radius=2参数确保自我图不仅包含CEO直接连接的部门,还包含部门下的所有职位节点- 通过
pos['CEO'] = (0,0)强制CEO处于中心,避免布局算法随机偏移 - 节点颜色做了区分,你可以根据喜好修改配色、节点大小等样式参数
- 选择
内容的提问来源于stack exchange,提问作者Neha Bose
相关产品推荐
相关产品推荐

