Используя NetworkX, как можно построить ориентированный невзвешенный граф с заданным набором ребер с легендой?
В настоящее время я работаю над проектом, в котором мне приходится иметь дело с байесовскими сетями, и учитывая графическую природу этих вероятностных моделей, очень важно представить их в виде графика. Я использую pgmpy для своего проекта.
Модель, с которой я имею дело, имеет большое количество переменных, часто имеющих длинные имена в качестве идентификаторов данных. Поэтому я размышлял над тем, чтобы проиллюстрировать граф с легендой, а каждый узел имел "код" или "число", сопоставляя их с идентификатором данных (возможно, можно использовать dict).
Края у меня в следующем формате:
[('A','B'), ('B', 'C'), ('C','A')]
Другими словами, массив из 2-х кортежей строк.
Было бы здорово, если бы кто-то мог помочь мне в решении этой конкретной проблемы.
1 ответ
pgmpy
модели (минимумBayesianNetwork
с) наследовать от nx.Digraph
s и может быть визуализирован с помощью , который принимает объект Matplotlib 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()
PS:
- Чтобы избежать шага перемаркировки, можно напрямую создать модель с короткими идентификаторами и сохранить сопоставление с длинными.
- Края от вопроса (
[('A','B'), ('B', 'C'), ('C','A')]
) образуют цикл (Байесовские сети ацикличны). - В случае
nx.draw
поднимаетStopIteration
исключение проверить этот вопрос .