如何在NetworkX组织图中添加职位、照片并修改节点形状
构建带职位与照片的方形节点组织架构图
我正尝试构建组织架构图,需在图表中添加多类信息并插入员工照片,当前实现代码如下:
import sqlite3, pandas as pd, networkx as nx con = sqlite3.connect('people.db') qry=""" SELECT a1.id, a1.name as a1, a2.name as a2, a1.position as a3 FROM people a1 INNER JOIN people a2 ON a1.manager_id = a2.id """ emps=pd.read_sql(qry, con) emps.rename( columns={'a2' :'manager', 'a1' :'person', 'a3':'position'}, inplace=True ) edgelist=emps[['person', 'manager',]] print(edgelist) orgchart=nx.from_pandas_edgelist(edgelist, source='manager', target='person') p=nx.drawing.nx_pydot.to_pydot(orgchart) p.write_png('orgchart.png')
需求:
- 每个节点显示姓名,下方添加职位与照片
- 将节点从圆形改为方形
解决方案
要实现这些效果,需要在networkx转pydot的过程中为节点添加自定义属性,包括形状、复合标签和图片路径。以下是修改后的完整实现:
1. 扩展数据查询与准备
首先修改SQL查询,获取员工的照片路径(假设people表包含photo_path字段),然后通过遍历数据为每个节点设置属性。
2. 修改后的完整代码
import sqlite3 import pandas as pd import networkx as nx con = sqlite3.connect('people.db') # 扩展查询,取出姓名、经理、职位和照片路径 qry = """ SELECT a1.name as person, a2.name as manager, a1.position as position, a1.photo_path as photo FROM people a1 INNER JOIN people a2 ON a1.manager_id = a2.id """ emps = pd.read_sql(qry, con) con.close() # 构建边列表并创建networkx图 edgelist = emps[['person', 'manager']] orgchart = nx.from_pandas_edgelist(edgelist, source='manager', target='person') # 转为pydot对象并配置节点属性 p = nx.drawing.nx_pydot.to_pydot(orgchart) for _, row in emps.iterrows(): node = p.get_node(row['person'])[0] # 设置节点为方形 node.set_shape("square") # 使用HTML表格实现姓名+职位的多行显示 node.set_label(f'<<TABLE BORDER="0"><TR><TD>{row["person"]}</TD></TR><TR><TD><FONT POINT-SIZE="10">{row["position"]}</FONT></TD></TR></TABLE>>') # 嵌入员工照片,确保路径正确 node.set_image(row['photo']) # 可选:调整节点尺寸适配照片 node.set_height("2.0") node.set_width("2.0") # 保存最终架构图 p.write_png('orgchart_with_details.png')
关键说明
- 方形节点:通过
node.set_shape("square")直接修改节点形状。 - 多行标签:利用Graphviz的HTML表格语法,实现姓名和职位的分行展示,通过
FONT POINT-SIZE调整职位文字的大小,让层级更清晰。 - 嵌入照片:
node.set_image()指定照片的本地路径,需确保图片格式为Graphviz支持的PNG/JPG,且路径正确(绝对路径或相对路径均可)。 - 环境依赖:需确保已安装
graphviz库(pip install graphviz),同时系统需安装Graphviz二进制程序(可通过官网下载或包管理器安装),否则无法渲染图片和自定义形状。
内容的提问来源于stack exchange,提问作者Pedro H C Miguez
相关产品推荐
相关产品推荐

