Визуализация данных графиков

Мне нужно визуализировать графики, где каждая пара узлов, соединенных запятой, представляет ребро, а числовое значение представляет интенсивность этого ребра. Например, ('A', 'B'): 0,71 означает, что узел A соединен с узлом B с интенсивностью края 0,71. Теперь мне нужно визуализировать эти графики в Python. Вот данные графиков.

График 1

('A', 'B'): 0.71
('M', 'B'): 0.67
('N', 'B'): 0.64
('A', 'O'): 0.62
('O', 'B'): 0.60
('N', 'O'): 0.53
('M', 'O'): 0.46
('A', 'N'): 0.18
('M', 'N'): 0.11

График 2

('ABC', 'ADC'): 0.53

График 3

('CDE', 'CFH'): 0.28

График 4

('GHI', 'GMI'): 0.20

График5

('XYZ', 'XWZ'): 0.17

Может ли кто-нибудь помочь мне наглядно представить эти графики?

Я протестировал ваш код и столкнулся с той же проблемой перекрытия узлов, что и в моем собственном коде. Для справки я прикрепил выходное изображение, созданное вашим кодом. Для сохранения файла я использовал следующую команду: plt.savefig('graph_image.png')

🤔 А знаете ли вы, что...
Python активно используется в научных и инженерных вычислениях.


50
1

Ответ:

Решено

Просто используйте networkx:

import matplotlib.pyplot as plt
import networkx as nx

data = {
    ('A', 'B'): 0.71,
    ('M', 'B'): 0.67,
    ('N', 'B'): 0.64,
    ('A', 'O'): 0.62,
    ('O', 'B'): 0.60,
    ('N', 'O'): 0.53,
    ('M', 'O'): 0.46,
    ('A', 'N'): 0.18,
    ('M', 'N'): 0.11
}

Создайте график из вашего набора данных:

G = nx.Graph()
for key, value in data.items():
    G.add_edge(*key, weight=value)

И визуализируйте компоненты по своему желанию:

fig, axe = plt.subplots()
pos = nx.spring_layout(G, seed=123456)
nx.draw_networkx_nodes(G, pos, ax=axe)
nx.draw_networkx_edges(G, pos, ax=axe)
nx.draw_networkx_labels(G, pos, font_size=12, ax=axe)
nx.draw_networkx_edge_labels(G, pos, nx.get_edge_attributes(G, "weight"), ax=axe)

Обновлять

Чтобы управлять цветом края на основе веса, вы можете использовать следующий фрагмент:

fig, axe = plt.subplots()
pos = nx.spring_layout(G, seed=123456)
nx.draw_networkx_nodes(G, pos, ax=axe)
nx.draw_networkx_edges(G, pos, ax=axe, edge_color=data.values(), edge_cmap=plt.cm.jet)
nx.draw_networkx_labels(G, pos, font_size=12, ax=axe)
nx.draw_networkx_edge_labels(G, pos, nx.get_edge_attributes(G, "weight"), ax=axe)
nx.draw_networkx_edge_labels(G, pos, nx.get_edge_attributes(G, "weight"), ax=axe)