Изменить порядок / положение узлов на графике сетиx - PullRequest
2 голосов
/ 19 июня 2019

У меня есть фрейм данных pandas, и я хочу построить сеть на основе фрейма данных. Текущий сюжет выглядит так: enter image description here

Он начинается в правом верхнем углу и идет в левый. Если я планирую в следующий раз, у него может быть другая стартовая позиция, как я могу избежать этого? И, кроме того, как я могу установить начальный узел в левом верхнем углу, а конечный узел (который я также могу отклонить заранее) установить всегда в правом нижнем углу?

Мой код до сих пор:

###make the graph based on my dataframe
G3 = nx.from_pandas_edgelist(df2, 'Activity description', 'Activity followed', create_using=nx.DiGraph(), edge_attr='weight')

#plot the figure and decide about the layout
plt.figure(3, figsize=(18,18))
pos = nx.spring_layout(G3, scale=2)

#draw the graph based on the labels
nx.draw(G3, pos, node_size=500, alpha=0.9, labels={node:node for node in G3.nodes()})

#make weights with labels to the edges
edge_labels = nx.get_edge_attributes(G3,'weight')
nx.draw_networkx_edge_labels(G3, pos, edge_labels = edge_labels)
plt.title('Main Processes')

#save and plot the ifgure
plt.savefig('StandardProcessflow.png')
plt.show() 

пакеты, которые я использую - это networkx и matlotlib

1 Ответ

2 голосов
/ 19 июня 2019

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

seed

(int, RandomState instance or None optional (default=None)) - Установить случайное состояние для детерминированных макетов узлов.Если int, seed - это начальное число, используемое генератором случайных чисел, если numpy.random.RandomState instance, seed - генератор случайных чисел, если None, генератор случайных чисел - это экземпляр RandomState, используемый numpy.random.

Или укажите макет самостоятельно, например:

pos = {
    1: [0, 1],
    2: [2, 4]
    ...
}

Вы можете комбинировать оба метода:

G3 = nx.Graph()
G3.add_weighted_edges_from([
    (1,2,1),
    (2,3,2),
    (3,4,3),
    (3,6,1),
    (4,5,4)
])

pos = nx.spring_layout(G3, scale=2, seed=84)
pos[1] = [-20, 0]
pos[5] = [20, 0]

nx.draw(
    G3,
    pos,
    node_size=500,
    alpha=0.9,
    labels={node:node for node in G3.nodes()}
)

edge_labels = nx.get_edge_attributes(G3,'weight')
nx.draw_networkx_edge_labels(G3, pos, edge_labels = edge_labels)

enter image description here

Вы можете использовать его, если хотите установить определенные узлы в специальных местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...