You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用NetworkX从DataFrame生成美观无重叠的径向组织结构图?

解决组织结构图节点重叠与姓名显示问题

针对你遇到的节点重叠、姓名显示不全问题,给你几个可行的解决办法:

方法1:优化Graphviz twopi布局参数

Graphviz的twopi布局支持通过附加参数直接控制节点间距、重叠处理,这是最直接的调整方式。你可以在graphviz_layout的prog参数里加入Graphviz的配置选项,配合Matplotlib调整画布、节点和字体参数,确保姓名完整显示:

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
from networkx.drawing.nx_pydot import graphviz_layout

# 加载数据
df = pd.read_excel('input/testing_data.xlsx')

# 创建有向图
G = nx.from_pandas_edgelist(df, source='Supervisor', target='Employee', create_using=nx.DiGraph)

# 调整画布大小,预留足够显示空间
plt.figure(figsize=(12, 12))

# 带参数的twopi布局:自动缩放避免重叠、增大节点/层级间距
pos = graphviz_layout(G, prog="twopi -Goverlap=scale -Gnodesep=0.8 -Granksep=1")

# 绘制图形,调整节点和字体适配姓名显示
nx.draw(G, pos, 
        with_labels=True, 
        font_size=8, 
        font_family='sans-serif',
        node_size=2000,  # 增大节点避免文字溢出
        node_color='lightblue',
        edge_color='gray',
        arrowsize=10)

plt.tight_layout()
plt.show()

方法2:使用交互式可视化库PyVis(推荐)

如果静态图仍有重叠问题,PyVis生成的交互式图表是更好的选择——它支持拖拽节点、自动布局调整,姓名可完整显示,还能缩放查看细节:

首先安装PyVis:

pip install pyvis

然后生成交互式网页:

import pandas as pd
from pyvis.network import Network

# 加载数据
df = pd.read_excel('input/testing_data.xlsx')

# 创建交互式有向图
net = Network(directed=True, height="800px", width="100%", bgcolor="#222222", font_color="white")

# 添加节点与关联边(自动去重节点)
for _, row in df.iterrows():
    net.add_node(row['Supervisor'], label=row['Supervisor'], size=20)
    net.add_node(row['Employee'], label=row['Employee'], size=15)
    net.add_edge(row['Supervisor'], row['Employee'])

# 设置径向布局参数,控制节点间距
net.repulsion(node_distance=200, central_gravity=0.2, spring_length=200)
# 也可改用层级布局更贴合组织结构:net.hierarchy(direction="UD", sort=False)

# 保存为HTML文件,打开即可交互查看
net.write_html('org_chart.html')

打开生成的org_chart.html,可自由拖拽节点调整位置、缩放查看所有姓名,完全避免重叠问题。

方法3:调整NetworkX绘图基础参数

如果不想依赖Graphviz额外参数,也可通过调整NetworkX绘图参数缓解问题:

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
from networkx.drawing.nx_pydot import graphviz_layout

df = pd.read_excel('input/testing_data.xlsx')
G = nx.from_pandas_edgelist(df, source='Supervisor', target='Employee', create_using=nx.DiGraph)

fig, ax = plt.subplots(figsize=(14,14))
pos = graphviz_layout(G, prog="twopi")

# 拆分绘图步骤,单独处理标签避免截断
nx.draw_networkx_nodes(G, pos, node_size=3000, node_color='lightgreen', ax=ax)
nx.draw_networkx_edges(G, pos, edge_color='gray', arrowsize=12, ax=ax)
# 用bbox参数确保标签完整显示
nx.draw_networkx_labels(G, pos, font_size=9, font_family='sans-serif', 
                        bbox=dict(facecolor='white', edgecolor='none', pad=1), ax=ax)

plt.axis('off')
plt.tight_layout()
plt.show()

内容的提问来源于stack exchange,提问作者Bijan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:57:36