如何使用pyviz或其他库绘制左右节点分离的美观二分图
美观无重叠二分图绘制方案
PyViz 生态实现方法
PyViz 栈默认的自动力导向布局不会主动区分二分图节点类型,要实现左右分列效果,核心是跳过自动布局,手动为两类节点指定固定坐标,同时配置标签偏移规则避免重叠,具体实现步骤:
- 先标记二分图的两类节点集合
- 为左侧节点统一设置固定x坐标(比如0),y坐标按节点序号均匀排布,保证节点间距足够容纳标签;右侧节点统一设置固定x坐标(比如1),y坐标做同样的均匀排布
- 配置节点标签、边标签的偏移参数,预留足够的画布左右边距,避免内容溢出重叠
示例代码:
import networkx as nx import holoviews as hv from holoviews import opts hv.extension('bokeh') # 构建二分图,可替换为自己的业务图数据 G = nx.bipartite.random_graph(10, 8, 0.4) left_nodes = {n for n, d in G.nodes(data=True) if d["bipartite"] == 0} right_nodes = set(G.nodes) - left_nodes # 手动指定节点位置,从根源避免布局混乱 pos = {} for idx, node in enumerate(sorted(left_nodes)): pos[node] = (0, idx) for idx, node in enumerate(sorted(right_nodes)): pos[node] = (1, idx) # 配置绘图参数,开启标签避让 node_layer = hv.Nodes(pos, vdims='index').opts(size=16, cmap='Category20') graph_layer = hv.Graph.from_networkx(G, pos).opts( edge_line_width=1.2, edge_alpha=0.7, edge_label_text_font_size='9pt', edge_label_position=0.5, node_text='index', node_text_offset=0.06, width=650, height=550, xlim=(-0.25, 1.25) ) final_graph = graph_layer * node_layer final_graph
运行后即可得到左右节点严格分列、无元素重叠的交互式二分图。
其他高可用实现方案
如果需要更省心的出图效果,不需要手动计算坐标,可以选择以下成熟方案:
- Graphviz 静态图方案
Graphviz的dot布局引擎原生支持层次类图的自动排布,指定从左到右的排布方向后,会自动将二分图节点分到左右两列,同时自动计算节点间距避免标签重叠,非常适合生成报告、论文用的静态图,示例代码:import networkx as nx from networkx.drawing.nx_agraph import graphviz_layout import matplotlib.pyplot as plt G = nx.bipartite.random_graph(10, 8, 0.4) left_nodes = {n for n, d in G.nodes(data=True) if d["bipartite"] == 0} right_nodes = set(G.nodes) - left_nodes # 调用dot引擎自动生成左右分栏布局 pos = graphviz_layout(G, prog='dot', args='-Grankdir=LR') plt.figure(figsize=(10, 7)) nx.draw_networkx_nodes(G, pos, nodelist=left_nodes, node_color='#2563eb', node_size=550) nx.draw_networkx_nodes(G, pos, nodelist=right_nodes, node_color='#f97316', node_size=550) nx.draw_networkx_edges(G, pos, width=1, alpha=0.6) nx.draw_networkx_labels(G, pos, font_size=10) nx.draw_networkx_edge_labels(G, pos, font_size=8, label_pos=0.5) plt.axis('off') plt.tight_layout() plt.show() - Plotly 交互图方案
如果需要支持缩放、悬停查看详情的网页端交互图,可以使用Plotly绘制,逻辑和PyViz方案一致:手动固定两类节点的x坐标,y轴均匀排布,Plotly自带的文本避让功能会自动调整标签位置,避免元素重叠。
注意:二分图不要直接使用通用力导向布局(比如spring_layout),这类布局算法没有二分结构约束,无法保证节点分列,也很容易出现元素重叠。
内容的提问来源于stack exchange,提问作者Eshan Jain
相关产品推荐
相关产品推荐

