Используя NetworkX, как можно построить ориентированный невзвешенный граф с заданным набором ребер с легендой?

В настоящее время я работаю над проектом, в котором мне приходится иметь дело с байесовскими сетями, и учитывая графическую природу этих вероятностных моделей, очень важно представить их в виде графика. Я использую pgmpy для своего проекта.

Модель, с которой я имею дело, имеет большое количество переменных, часто имеющих длинные имена в качестве идентификаторов данных. Поэтому я размышлял над тем, чтобы проиллюстрировать граф с легендой, а каждый узел имел "код" или "число", сопоставляя их с идентификатором данных (возможно, можно использовать dict).

Края у меня в следующем формате:

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

Другими словами, массив из 2-х кортежей строк.

Было бы здорово, если бы кто-то мог помочь мне в решении этой конкретной проблемы.

1 ответ

pgmpyмодели (минимумBayesianNetworkс) наследовать от nx.Digraphs и может быть визуализирован с помощью , который принимает объект 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исключение проверить этот вопрос .
Другие вопросы по тегам