Другой график с Networkx в Python, когда используются стрелки

#python #plot #networkx

Вопрос:

Я написал код, который строит сеть с Networkx помощью lib на Python. Мой код работает хорошо, но меня смущает одна вещь. Я получаю совершенно другой вид графиков, когда использую .Graph() и .DiGraph() .

 import networkx as nx
import matplotlib.pyplot as plt

# defining graph
analysis_graph = nx.Graph()
#analysis_graph = nx.DiGraph()

# defining relations
relation_list = [['A', 'B'], ['A', 'C'], ['A', 'D'], ['A', 'E'], ['C', 'F'], ['F', 'I'], ['F', 'H'], ['F', 'G'], ['F', 'J']]

# adding relations to the graph
analysis_graph.add_edges_from(relation_list)

# extracting nodes from relations
node_list = nx.nodes(analysis_graph)


# ADDING COLORS TO GRAPH

# defining colors for each node
colors = {"red": ["A", "B", "C"], "green": ["D", "E", "F"], "yellow": ["G", "H", "I", 'J']}
# Create a mapping of node -> color from `colors`:
node_color_map = {}
for color, nodes in colors.items():
    node_color_map.update(dict.fromkeys(nodes, color))
node_color_list = [node_color_map.get(node) for node in node_list]
print(node_color_map)
print(node_color_list)

# For getting node sizes
dict_of_node_sizes = dict(analysis_graph.degree) # for getting node sizes
print(dict_of_node_sizes)

# for giving same graph each time
my_pos = nx.spring_layout(analysis_graph, seed = 0) 

print(nx.info(analysis_graph))
plt.figure(figsize=(25,17))
nx.draw(analysis_graph, 
        pos = my_pos, 
        with_labels = True, 
        arrowsize=20, 
        font_size=12, 
        node_size=[(v 1) * 150 for v in dict_of_node_sizes.values()],
        node_color=node_color_list)
 

Вот результаты, со стрелками есть .DiGraph() и без них .Graph() :

введите описание изображения здесь

введите описание изображения здесь

Есть ли шанс получить одинаковую форму графика со стрелками и без них?

Комментарии:

1. Начальное nx.spring_layout значение работает не так, как предполагалось, поэтому ваш самый простой вариант-сохранить позиции, а затем загрузить и повторно использовать их при построении второго графика. Причина, по которой начальное значение, вероятно, не работает, заключается в том, что в неориентированном Graph объекте ребра учитываются дважды при вычислении притяжения между подключенными узлами, тогда как в DiGraph ребрах учитываются только один раз. Таким образом, семя потенциально работает (не на 100%, так как раньше были проблемы), но силы определенно разные, и, следовательно, результат компоновки пружины другой.

2. Хорошо, но как я могу решить эту проблему? Можете ли вы опубликовать ответ с примером кода?

3. Что бы вы сочли решением этой проблемы? Предложение о том, чтобы рассчитать позиции один раз и использовать их для обоих участков, кажется разумным. Если это не решение, можете ли вы объяснить, каким было бы решение?

4. мои узлы и отношения между узлами будут меняться каждый час, поэтому я не думаю, что расчет сработает. К вашему сведению, я не знаю, как это рассчитать. Есть ли способ обновить мой код, чтобы я мог получить график со стрелками, который будет выглядеть так же, как график без стрелок? Так что не имеет значения, пользуюсь ли я . График() или .орграф(), форма моего графика должна оставаться прежней