Matplotlib 和 Networkx - 绘制自循环节点

问题描述 投票:0回答:1

我有这个函数,我想画一个自循环。我怎样才能做到这一点?
边存在,但我认为这只是这个例子中的一个点是 (1,1) 并且我无法添加节点的名称。 我的目标是从邻接矩阵绘制一个图。有没有更好的方法来做到这一点?

import networkx as nx
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch, Circle
import numpy as np


def draw_network(G, pos, ax, sg=None):
    for n in G:
        c = Circle(pos[n], radius=0.05, alpha=0.7)
        ax.add_patch(c)
        G.nodes[n]['patch'] = c
        x, y = pos[n]

    seen = {}
    for (u, v, d) in G.edges(data=True):
        n1 = G.nodes[u]['patch']
        n2 = G.nodes[v]['patch']
        rad = 0.1
        if (u, v) in seen:
            rad = seen.get((u, v))
            rad = (rad + np.sign(rad) * 0.1) * -1
        alpha = 0.5
        color = 'k'

        e = FancyArrowPatch(n1.center, n2.center, patchA=n1, patchB=n2,
                            arrowstyle='-|>',
                            connectionstyle='arc3,rad=%s' % rad,
                            mutation_scale=10.0,
                            lw=2,
                            alpha=alpha,
                            color=color)
        seen[(u, v)] = rad
        ax.add_patch(e)
    return e


G = nx.MultiDiGraph([(1, 2), (1, 1), (1, 2), (2, 3), (3, 4), (2, 4),
                     (1, 2), (1, 2), (1, 2), (2, 3), (3, 4), (2, 4)]
                    )

pos = nx.spring_layout(G)
ax = plt.gca()
draw_network(G, pos, ax)
ax.autoscale()
plt.axis('equal')
plt.axis('off')

plt.show()
python matplotlib graph draw networkx
1个回答
9
投票

看来你的方法使用 matplotlib 是相当先进的,但我仍然建议使用专门的图形绘制库(就像 networkx 文档那样)。 随着图变大,会出现更多问题 - 但这些问题已经在这些库中得到解决。

“首选”选项是graphviz,它可以很好地处理绘制多图。 您可以从 networkx 图形编写点文件,然后使用图形绘制工具之一(例如 dot、neato 等)。

这是一个示例,基于 图属性多图边缘属性

import networkx as nx
from networkx.drawing.nx_agraph import to_agraph 

# define the graph as per your question
G=nx.MultiDiGraph([(1,2),(1,1),(1,2),(2,3),(3,4),(2,4), 
    (1,2),(1,2),(1,2),(2,3),(3,4),(2,4)])

# add graphviz layout options (see https://stackoverflow.com/a/39662097)
G.graph['edge'] = {'arrowsize': '0.6', 'splines': 'curved'}
G.graph['graph'] = {'scale': '3'}
                                                                                
# adding attributes to edges in multigraphs is more complicated but see
# https://stackoverflow.com/a/26694158                    
G[1][1][0]['color']='red'
                                                                                
A = to_agraph(G) 
A.layout('dot')                                                                 
A.draw('multi.png')   

multi-graph with self loops

请注意,您还可以轻松地从 ipython shell 中调用绘图: https://stackoverflow.com/a/14945560

© www.soinside.com 2019 - 2024. All rights reserved.