Повернуть k-раздельный граф в сети - PullRequest
0 голосов
/ 11 апреля 2020

Я бы хотел повернуть следующий k-компонентный график вертикально или на 45 градусов. Я хочу показать следующий график в иерархической форме, где красные узлы находятся сверху, а зеленые узлы находятся внизу this

Документация сетей имеет только параметр поворота для shell_layout и для меток ребер networkx.drawing.nx_pylab.draw_networkx_edge_labels

Вот код программы:

G = nx.Graph()
G.add_nodes_from(emc["entity"], bipartite=0)
G.add_nodes_from(set(EMM_unique["keys"]).symmetric_difference(set(emc["entity"])), bipartite=1)
G.add_nodes_from(EMM["id"], bipartite=2)
G.add_edges_from(list(emc.itertuples(index=False)))
G.add_edges_from(list(EMM.itertuples(index=False)))

nodes = G.nodes()
# for each of the parts create a set
nodes_0  = set([n for n in nodes if  G.nodes[n]['bipartite']==0])
nodes_1  = set([n for n in nodes if  G.nodes[n]['bipartite']==1])
nodes_2  = set([n for n in nodes if  G.nodes[n]['bipartite']==2])


 # set the location of the nodes for each set
pos = dict()
pos.update( (n, (1, i)) for i, n in enumerate(nodes_0) ) # put nodes from X at x=1
pos.update( (n, (2, i)) for i, n in enumerate(nodes_1) ) # put nodes from Y at x=2
pos.update( (n, (3, i)) for i, n in enumerate(nodes_2) ) # put nodes from X at x=1


color_map = []
for node in G:
    if node in emc["entity"].values:
       color_map.append("red")
    elif node in EMM["id"].values:
        color_map.append("green")
    else:
        color_map.append("blue")

nx.draw(G, pos, node_color=color_map, width= 2, with_labels=True, with_arrows=True)

Это решение подходит только для переворачивания положение и не полезно для вращения. Поэтому, поскольку я не добавляю узлы один за другим, это решение также не очень полезно.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Я попытался изменить координаты в переменной position (pos), и это сработало. Часть кода, которая отличается от того, что я выложил выше, и имеет решение здесь

 # set the location of the nodes for each set
pos = dict()
pos.update( (n, (i, -1)) for i, n in enumerate(nodes_0) ) 
pos.update( (n, (i, -2) for i, n in enumerate(nodes_1) ) 
pos.update( (n, (i, -3)) for i, n in enumerate(nodes_2) ) 
0 голосов
/ 11 апреля 2020

Вместо того, чтобы перевернуть график, вы рассматривали возможность использования pygraphviz или решениеierarchical_pos, как в ответе ниже?

Можно ли получить иерархические графики из сети x с помощью python 3?

для меня в некоторой степени хорошо подошло решение иерархии:

 ## Converting the graph to an oriented tree through depth first search or breadth first search
tree_g = nx.dfs_tree(g, <starting_node>)

## attempt to draw it like a tree
pos = hierarchy_pos(tree_g) 
nx.draw(tree_g, pos=pos,....)

https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.algorithms.traversal.depth_first_search.dfs_tree.html

...