#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. мои узлы и отношения между узлами будут меняться каждый час, поэтому я не думаю, что расчет сработает. К вашему сведению, я не знаю, как это рассчитать. Есть ли способ обновить мой код, чтобы я мог получить график со стрелками, который будет выглядеть так же, как график без стрелок? Так что не имеет значения, пользуюсь ли я . График() или .орграф(), форма моего графика должна оставаться прежней