重新排列节点并使用 Networkx 和 Pygraphviz .DOT

问题描述

我正在尝试绘制点图,其中我有 20 个父节点和 500 多个子节点。

我有一个字典,其中有 20 个键作为父节点,值(列表)用作边。钥匙与下一个免费。如果第一个是 'X => Y' 那么下一个是 'Y => X'、'X => Z' 和 'Z => X'。当我在字典中传递时,我试图保持父节点的顺序。尝试了很多东西,但没有奏效。我试图获取父节点的位置,然后移动它们以按照我想要的顺序放置它然后它变得一团糟,因为我也必须与它们一起移动子节点,这变得更加复杂。一旦这个父节点是有序的,我需要拒绝免费的。

我通过获取位置然后负值来完成颠倒部分。但是父节点上的顺序和重叠让我感到困惑。不过,子节点重叠不是问题。

下图是我手动重新排列父节点位置然后关闭互补位置时的样子。

reverted

这是我提供完整字典时得到的输出

enter image description here

我传递给 nx 的字典如下。

link to the dict1

我的字典示例

dict1={'I => M': [76,77,126,131,193,344,391,413,414,425,481,579],'M => I': [76,204,241,516,579,704],'I => Mi': [111,704,717],'I => U': [7],'U => I': [5],'I => +': [126,139,159,173,190,231,333,412,549],'I => -': [14,19,112,129,141,143,147,149,164],'M => Mi': [1,2,3,5,6,8,10,11,13,30,32,39,64,68,69,106,108,117,124,125,160,197,198,199,200],'Mi => M': [2,29,31,41,103,200,207,240,242,246,251,264,293,294,308,341,347,351,353,379,388,389,393,395,426,437,447,487],'M => U': [139]}

我正在尝试通过以下方式绘制它:

import networkx as nx
import matplotlib.pyplot as plt
from networkx.drawing.nx_agraph import graphviz_layout
import random
G = nx.DiGraph()
G=nx.from_dict_of_lists(dict1)

color_map=[]
for node in G:
    if type(node) == int:
        color_map.append('lightblue')
    else:
        color = "#"+''.join([random.choice('0123456789ABCDEF') for j in range(6)])
        color_map.append(color)

nodeSize = 1500
nodeColorList = color_map

prog = 'dot'
args = '-Gnodesep=10 -Granksep=2 -Gpad=0.5 -Gordering=out'
root = None
pos  = graphviz_layout(G,prog = prog,root = root,args = args)

fig = plt.figure(figsize=(100,10))
nx.draw(G,pos         = pos,with_labels = True,node_color  = nodeColorList,node_size   = nodeSize,)
    
plt.savefig('parentnodes.png')
plt.show()

更新 1: 我尝试将大父节点添加到父节点,我想如果它有效,我会删除大父节点或使其不可见,但是当我添加 3 大父节点时父节点保持顺序,又搞砸了。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)