如何在Networkx间接图中绘制回路边缘

时间:2018-09-01 13:25:43

标签: python graph networkx

我有以下图形:

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()

我正在尝试绘制一个图形,该图形显示标记有数字3的节点(“ A”)中的循环。该循环应类似于节点(1)here的循环。

它必须是一个间接图。

到目前为止,我正在使用它:

G=nx.MultiDiGraph

输出为:

enter image description here

如您所见,即使认为存在边(“ A”,“ A”),在节点“ A”周围也没有循环。关于如何实现它的任何想法吗?

编辑-为什么不重复?

问题Matplotlib and Networkx - drawing a self loop node用于有向图。使用G.graph['edge']创建图形时,可以使用nx.Graph()设置边的属性。

使用G.graph['edge'](间接图),nx.Graph的结果是一个空字典。

该问题与该问题之间的区别实质上是,我使用nx.MultiDiGraph,而该问题使用SELECT test.* FROM (select MAX(date_in) as temp_date_in,title from test GROUP BY title order by date_in desc) as temp JOIN test ON temp.title = test.title ORDER BY temp.temp_date_in DESC,test.date_in DESC

2 个答案:

答案 0 :(得分:1)

据我所知,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()

enter image description here

您会注意到显示了边缘标签。在Networkx中,边缘似乎只是顶点之间的线。同一点之间的界线很好……什么都没有……

所以我认为您不会对networkx感到满意。

不过,按照Matplotlib and Networkx - drawing a self loop node

中的建议,最好使用pygraphviz

据我所知graphviz(警告它仅以32位出现)(而且是python wrapper pygraphviz需要graphviz)仍然是一个非常好的图形可视化工具。

安装后,您可以使用networkx.drawing.nx_agraph的to_agraph函数。

祝你好运。

答案 1 :(得分:0)

P.E。诺曼的答案让我看了graphviz,我意识到,如果将有向图的arrowsize更改为0,则它​​看起来像是一个间接图。使用它,我可以重用Matplotlib and Networkx - drawing a self loop node中的答案,但是我仍然缺少标签边缘。使用答案here,我设法创建了以下图形:

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')

以下是图形:

enter image description here

这个答案可能是有向图问题的重复,我仍然相信对间接图进行小的调整是值得的。