使用NetworkX,如何绘制一个有图例的有向、无权图,给定一组边?

3

我目前正在处理一个项目,需要涉及贝叶斯网络。由于这些概率模型的图形特性,将它们可视化为图形非常重要。我正在使用pgmpy进行我的项目。

我正在处理的模型具有大量变量,经常具有作为数据标识符的长名称。因此,我考虑使用图例来说明图形,每个节点都有一个'代码'或'编号',与数据标识符相对应(可能可以使用字典进行映射)。

我拥有的边缘格式如下:

[('A','B'), ('B', 'C'), ('C','A')]

换句话说,一个由字符串二元组组成的数组。

如果有人能帮我解决这个问题就太好了。


1
这个链接可能会回答你的一些问题:https://dev59.com/814b5IYBdhLWcg3w7FYv#28533293 - Joel
1个回答

0

pgmpy 模型(至少是 BayesianNetwork)继承自 nx.Digraph,可以使用 nx.draw> 进行可视化,该函数接受一个 Matplotlib Axes 对象作为可选参数。 因此,可以创建一个 axes 对象,手动添加图例, 隐藏句柄, 重新标记节点 并绘制模型。

以下是使用 dict(建议使用)进行标识符映射的示例:

import networkx as nx
from pgmpy.models import BayesianNetwork
import matplotlib.pyplot as plt
from matplotlib import patches

identifier_mapping = {'long_identifier_for_A': 'A',
                      'long_identifier_for_B': 'B',
                      'long_identifier_for_C': 'C'}
model = BayesianNetwork([('long_identifier_for_A', 'long_identifier_for_B'),
                           ('long_identifier_for_C', 'long_identifier_for_B')])

# add identifier mappings to legend
ax = plt.subplot()
handles = [patches.Patch(label=f'{identifier_mapping[node]}: {node}') for node in model.nodes()]
ax.legend(handles=handles, handlelength=0, handletextpad=0, fancybox=True)

# draw model
nx_graph = nx.relabel_nodes(model, identifier_mapping)
nx.draw(nx_graph, ax=ax, with_labels=True, pos=nx.random_layout(nx_graph))
plt.show()

bayesian network


附:

  • 为了避免重新标记的步骤,可以直接使用短标识符创建模型并存储到长标识符的映射。
  • 问题的边缘([('A','B'), ('B', 'C'), ('C','A')])形成一个循环(贝叶斯网络无环)。
  • 如果nx.draw引发了StopIteration异常,请查看this question

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接