[英]How to draw loops-edges in networkx indirected Graph
我有以下图表:
graph = {("A","A"): 3, ("A","B"): 4, ("A","C"): 1}
我试图绘制一个图表,显示一个标有数字3的节点(“A”)中的循环。循环应该看起来像这里的节点(1)。
它必须是一个间接图。
到目前为止我使用这个:
import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
for edge in graph:
G.add_edge(edge[0], edge[1])
graph_pos=nx.shell_layout(G)
nx.draw_networkx_nodes(G,graph_pos)
nx.draw_networkx_edges(G,graph_pos)
nx.draw_networkx_labels(G, graph_pos)
nx.draw_networkx_edge_labels(G, graph_pos, edge_labels = graph)
plt.show()
输出是:
如您所见,即使存在边缘(“A”,“A”),节点“A”周围也没有循环。 关于如何实现这一点的任何想法?
编辑 - 为什么不重复?
问题Matplotlib和Networkx - 绘制一个自循环节点用于有向图。 使用G=nx.MultiDiGraph
创建图形时,可以使用G.graph['edge']
设置边的属性。
使用nx.Graph()
(间接图), G.graph['edge']
是一个空字典。
这个问题与这个问题的区别在于,我使用的是nx.Graph
而且该问题使用的是nx.MultiDiGraph
。
从我收集的内容来看,networkx的绘制功能并没有做任何努力来绘制自循环。 让我这么说的是:如果你改变你的脚本
import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
graph = {("A","A"): 3, ("A","B"): 4, ("A","C"): 1}
#graph = {("A","B"): 4, ("A","C"): 1}
for edge in graph:
G.add_edge(edge[0], edge[1])
graph_pos=nx.circular_layout(G)
nx.draw_networkx_edge_labels(G, graph_pos, edge_labels = graph)
nx.draw_networkx_nodes(G,graph_pos, alpha=0.1)
nx.draw_networkx_edges(G,graph_pos)
#nx.draw_networkx_labels(G, graph_pos)
plt.show()
您会注意到边缘标签已显示。 在Networkx中,似乎边缘只是顶点之间的线条。 同一点之间的界线很好......没什么......
所以我认为你对networkx没有好运。
然而,使用pygraphviz是Matplotlib和Networkx中建议的最佳选择- 绘制自循环节点
从我的知识graphviz (警告它只有32位)(和它的python包装pygraphviz需要graphviz)仍然是一个非常好的图形可视化器。
安装后,您可以使用networkx.drawing.nx_agraph的to_agraph函数。
祝好运。
PE Normand的回答让我看看graphviz
,我意识到,如果我将有向图的arrowsize
更改为0,它看起来像是一个间接图。 使用它我可以重用Matplotlib和Networkx中的答案- 绘制一个自循环节点 ,但我仍然没有标签边缘。 在这里使用答案我设法创建以下图表:
import networkx as nx
from networkx.drawing.nx_agraph import to_agraph
graph = {("A","A"): 3, ("A","B"): 4, ("A","C"): 1}
G=nx.MultiDiGraph()
# add edges
for edge in graph:
G.add_edge(edge[0], edge[1])
# arrow size: '0' makes it look like an indirected graph
G.graph['edge'] = {'arrowsize': '0', 'splines': 'curved'}
G.graph['graph'] = {'scale': '3'}
A = to_agraph(G)
A.layout('dot')
# set edge labels
for pair in graph:
edge = A.get_edge(pair[0], pair[1])
edge.attr['label'] = str(graph[pair]) + " "
A.draw('test.png')
这是图表:
这个答案可能与有向图的问题重复,我仍然认为值得与间接图的小调整保持一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.