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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:45:46