как установить позицию сверху вниз в графе networkx - PullRequest
0 голосов
/ 30 мая 2020

Это моя расширенная работа из здесь . Я хотел бы, чтобы последний элемент 'm' в unique_liss появлялся в верхней позиции остальных узлов, например enter image description here. Однако большая часть сгенерированного изображения будет выглядеть так: enter image description here

это мои коды:

Unique_liss= ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm']

edgesList= [('a', 'b'), ('b', 'c '), ('c ', 'd'), ('d', 'e'), ('d', 'f'), ('e', 'g'), ('f', 'g'), ('g', 'h'), ('h', 'i '), ('i ', 'j'), ('j', 'k'), ('j', 'l'), ('k', 'm'), ('l', 'm')]

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
for node in edgesList:
    print('node-', node)
    G.add_edge(*node,sep=',')

A = nx.adjacency_matrix(G).A
import numpy as np
seed = 31
pos = nx.spring_layout(G)
plt.figure(figsize=(15,8))
nx.draw(G, pos=pos, with_labels=True, node_size = 1500,
        seed=seed, node_color = 'skyblue')

Хотя я меняю для ..l oop в перевернутый l oop, как показано ниже:

for node in reversed(edgesList):
    print('node-', node)
    G.add_edge(*node,sep=',')

, это не гарантирует, что последний элемент узла 'm' будет считан в верхней позиции остальных. Оцените, может ли кто-нибудь помочь в том, как сделать так, чтобы последний узел постоянно отображался в верхней позиции?

1 Ответ

1 голос
/ 30 мая 2020

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

def get_graph_centroid(pos):
    return np.mean(np.array([a for a in pos.values()]), axis=0)

def find_flip(node_of_interest, pos):

    node_x, node_y = pos[node_of_interest]
    cx, cy = get_graph_centroid(pos)

    flip = [1,1]

    if node_x < cx:
        flip[0] = -1
    if node_y < cy:
        flip[1] = -1

    return flip

def make_flip(pos, flip):

    x,y = flip
    pos = {key: (x*a,y*b) for key, (a,b) in pos.items()}

    return pos



pos = nx.spring_layout(G)
plt.subplot(121)
nx.draw(G, pos=pos, with_labels=True, node_size = 500,
        seed=seed, node_color = 'skyblue')
plt.title('normal layout')

plt.subplot(122)
flip = find_flip('m', pos)
pos = make_flip(pos, flip)
nx.draw(G, pos=pos, with_labels=True, node_size = 500,
        seed=seed, node_color = 'skyblue')
plt.title('flipped layout')

enter image description here

Обратите внимание, что этот код гарантирует только то, что узел находится справа вверху по отношению к центру, а не это ближайший узел к верхнему правому углу

...