NetworkX平行列节点布局求助:两类关联节点可视化实现
嘿,我懂你想要的那种双列平行排布的二分图效果!NetworkX 默认的布局算法(比如spring_layout)确实会把节点挤成一团网状,不过咱们完全可以手动指定节点坐标,轻松实现你要的平行列布局,下面直接上解决方案:
实现思路与代码示例
核心思路就是手动控制节点的x轴坐标:把客户/公司节点固定在左侧一列(x=0),产品节点固定在右侧一列(x=1),y轴坐标按顺序分配避免重叠,再把边连起来就行。
import networkx as nx import matplotlib.pyplot as plt # 替换成你的客户-产品映射字典 client_product_map = { "客户A": ["产品X", "产品Y"], "公司B": ["产品Z"], "客户C": ["产品X", "产品Z"] } # 1. 创建二分图结构 G = nx.Graph() # 拆分两组节点,并用bipartite属性标记区分 clients = list(client_product_map.keys()) products = list({prod for prods in client_product_map.values() for prod in prods}) G.add_nodes_from(clients, bipartite=0) G.add_nodes_from(products, bipartite=1) # 2. 添加客户与产品的连接边 for client, prods in client_product_map.items(): for prod in prods: G.add_edge(client, prod) # 3. 手动设置节点位置:核心步骤! pos = {} # 客户节点全部放在x=0的列,y轴按顺序分配 for idx, client in enumerate(clients): pos[client] = (0, idx) # 产品节点全部放在x=1的列,y轴按顺序分配 for idx, prod in enumerate(products): pos[prod] = (1, idx) # 4. 绘制可视化图形 plt.figure(figsize=(8, 5)) # 分别绘制两组节点(用颜色区分) nx.draw_networkx_nodes(G, pos, nodelist=clients, node_color='lightblue', node_size=1600) nx.draw_networkx_nodes(G, pos, nodelist=products, node_color='coral', node_size=1600) # 绘制连接边 nx.draw_networkx_edges(G, pos, edge_color='gray', width=2) # 添加节点标签 nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold') plt.title("客户/公司-产品平行列连接图") plt.axis('off') # 隐藏坐标轴 plt.tight_layout() plt.show()
额外优化小技巧
如果节点数量多导致y轴重叠,可以调整y轴的间距,比如把pos[client] = (0, idx)改成pos[client] = (0, idx * 1.2),给节点留出更多垂直空间;要是想让同一客户连接的产品y坐标对齐,也可以根据客户的连接关系来分配产品的y轴位置,这个可以根据你的需求灵活调整。
内容的提问来源于stack exchange,提问作者James Gregorie
相关产品推荐
相关产品推荐

