Position/showing 个带有 networkx + graphviz 的标签
Position/showing of labels with networkx + graphviz
我结合使用 networkx 和 graphviz 获得了以下图:
我对结果很满意。在图中,您可以识别我所说的聚合节点:那些是最新的绿色节点(所有绿色节点汇聚的地方)比橙色节点早一跳。
我想要实现的是:
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()
关于如何做到这一点有什么想法吗?
谢谢!
卢卡斯
好的,所以我已经部分解决了第二个问题:如何从聚合节点开始绘制。为此,我估计了最新一跳的跳数。之后我决定标记低于阈值的节点。
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
更新:
现在,为了 re-position 标签,我不得不自己修改位置。
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)
在此之后,我开始绘制以下内容:
我现在真的很喜欢这个输出...:-)
我结合使用 networkx 和 graphviz 获得了以下图:
我对结果很满意。在图中,您可以识别我所说的聚合节点:那些是最新的绿色节点(所有绿色节点汇聚的地方)比橙色节点早一跳。
我想要实现的是:
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()
关于如何做到这一点有什么想法吗?
谢谢!
卢卡斯
好的,所以我已经部分解决了第二个问题:如何从聚合节点开始绘制。为此,我估计了最新一跳的跳数。之后我决定标记低于阈值的节点。
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
更新:
现在,为了 re-position 标签,我不得不自己修改位置。
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)
在此之后,我开始绘制以下内容:
我现在真的很喜欢这个输出...:-)