使用networkx + graphviz定位/显示标签

时间:2018-03-19 16:52:36

标签: nodes python-3.5 networkx labels pygraphviz

我使用networkx和graphviz组合实现了以下情节:

enter image description here

我对结果非常满意。在图中,您可以识别出我称之为聚合节点的内容:那些是最新的绿色节点(所有绿色节点会聚),在橙色节点之前一跳。

我想要实现的目标如下:

1)将标签放在节点的两侧。正如您所看到的,标签位于它们之上并且难以阅读;

2)仅在聚合节点和橙色节点上显示标签。

这就是我绘制图表的方法。

# We create the graph
G = nx.DiGraph()

# We add nodes and edges
G.add_nodes_from(nodes)
G.add_edges_from(edges)

# We establish attributes to nodes
nx.set_node_attributes(G,nodesAttrDic)

# Tune plot
nodeFontSize    = 10
nodeSize        = 20
nodeColorList   = list(getNodeColor(nodesAttrDic,G.nodes()))
edgeColorList   = getEdgeColor(G.edges())

# Graphiz tunning
prog = 'dot'
args = '-Gnodesep=1 -Granksep=2 -Gpad=0.5 -Grankdir=TD'
root = None
pos  = graphviz_layout(G, prog = prog, root = root, args = args)

nx.draw(G,
    pos         = pos,
    with_labels = True, 
    node_color  = nodeColorList, 
    edge_color  = edgeColorList, 
    font_size   = nodeFontSize,
    node_size   = nodeSize,)

plt.show()

关于如何做到这一点的任何想法?

谢谢!

卢卡斯

1 个答案:

答案 0 :(得分:0)

好的,我已经部分地解决了第二个问题:如何从聚合节点开始绘制。为此,我估计了最新的跳数。之后,我决定将节点标记为低于阈值。

def getHopToNH(nodes):
    path        = []
    labelList   = {}

    for startNode in G.nodes():
        endNode = 'myLabel'
        try:
            p = len(nx.shortest_path(G,source=startNode,target=endNode))
        except:
            p = -1
        path.append((startNode,p))

        if p < 8:
            labelList = {**labelList,**{str(startNode):str(startNode)}}
        else:
            labelList = {**labelList,**{str(startNode):''}}

    return labelList

<强>更新

现在,为了重新定位标签,我不得不自己修改位置。

for p in pos:

    yOffSet = -300
    xOffSet = -400

    pos[p] = (pos[p][0]+xOffSet,pos[p][1]+yOffSet)

labelDescr = nx.draw_networkx_labels(G,
    pos         = pos,
    labels      = nodeLabelDict,
    font_size   = nodeFontSize,)

for n,t in labelDescr.items():
    finDegree = 70
    t.set_rotation(finDegree)

在此之后,我将绘制以下内容:

enter image description here

我现在非常喜欢这个输出......: - )