繁体   English   中英

如何在networkx间接图中绘制循环边

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM