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

如何用NetworkX绘制含三类节点的单幅三分无向图?

解决User-Review-Product三分图可视化问题

嘿,我来帮你搞定这个三分图的绘制!你说的没错,nx.from_pandas_edgelist确实只能直接处理两列节点的边表,但我们完全可以通过把两组边(User-Review和Review-Product)添加到同一个图中的方式,轻松构建出完整的三分图,不用分开画两个图再合并。

下面是具体的步骤和完整代码,我会把每一步的逻辑讲得明明白白:

核心思路

  1. 分别准备User-Review、Review-Product两组边的数据表
  2. 创建一个空的NetworkX图,依次把两组边都添加进去
  3. 可视化时给三种类型的节点设置不同样式(颜色、大小等),让图的结构一目了然

完整代码示例

import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd

# ---------------------- 1. 准备你的数据 ----------------------
# 替换成你实际的userId、reviewIds、productIds列表
# 注意:reviewIds要同时对应到用户和产品(每个评论属于一个用户,关联一个产品)
userId = ['user_001', 'user_002', 'user_003', 'user_004']
reviewIds = ['review_101', 'review_102', 'review_103', 'review_104']
productIds = ['prod_A', 'prod_B', 'prod_A', 'prod_C']

# 构建两组边的DataFrame
user_review_edges = pd.DataFrame({'user': userId, 'review': reviewIds})
review_product_edges = pd.DataFrame({'review': reviewIds, 'product': productIds})

# ---------------------- 2. 构建三分图 ----------------------
# 创建空的无向图
G = nx.Graph()

# 添加User-Review的边:用itertuples把每行转成(user, review)的元组
G.add_edges_from(user_review_edges.itertuples(index=False, name=None))
# 添加Review-Product的边:同理转成(review, product)的元组
G.add_edges_from(review_product_edges.itertuples(index=False, name=None))

# ---------------------- 3. 可视化(区分节点类型) ----------------------
# 给不同类型的节点分配颜色
node_colors = []
for node in G.nodes():
    if node in userId:
        node_colors.append('#A0CBE2')  # 用户节点:浅蓝色
    elif node in reviewIds:
        node_colors.append('#FFD700')  # 评论节点:金色
    elif node in productIds:
        node_colors.append('#FF6B6B')  # 产品节点:珊瑚红

# 生成布局:k参数调整节点间距,值越小节点越分散,避免标签重叠
pos = nx.spring_layout(G, k=0.2)

# 绘制图
nx.draw(G, pos,
        node_color=node_colors,
        edge_color='#BB0000',
        width=2,
        with_labels=True,
        font_weight=500,
        font_size=7,
        node_size=1000)  # 节点大小可以根据数据量调整

# 添加图例(可选,让读者快速识别节点类型)
from matplotlib.patches import Patch
legend_elements = [
    Patch(facecolor='#A0CBE2', label='User'),
    Patch(facecolor='#FFD700', label='Review'),
    Patch(facecolor='#FF6B6B', label='Product')
]
plt.legend(handles=legend_elements, loc='upper right', fontsize=8)

# 保存图片(参数和你原来的一致,调整了bbox_inches避免标签被截断)
plt.savefig("tripartite_graph.png", dpi=500, facecolor='w', edgecolor='w',
            orientation='portrait', bbox_inches='tight', pad_inches=0.1)
plt.show()

关键细节说明

  • 不用纠结nx.from_pandas_edgelist的限制:add_edges_from方法可以直接接收元组列表,我们用itertuples把DataFrame的每行转成边的元组,灵活度拉满。
  • 节点样式区分是核心:三分图如果不区分节点类型,看起来会一团乱,除了颜色,你还可以给不同节点设置不同形状(比如产品用方形,用户用圆形)或者大小,进一步强化区分。
  • 布局参数按需调整:如果你的节点数量多,试试调大k值(比如0.3)让节点更紧凑;如果标签重叠严重,调小k值让节点分散开。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:48:32