我有以下图形:
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
输出为:
如您所见,即使认为存在边(“ 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
。
答案 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()
您会注意到显示了边缘标签。在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')
以下是图形:
这个答案可能是有向图问题的重复,我仍然相信对间接图进行小的调整是值得的。