Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib和Networkx-绘制自循环节点_Python_Matplotlib_Graph_Draw_Networkx - Fatal编程技术网

Python Matplotlib和Networkx-绘制自循环节点

Python Matplotlib和Networkx-绘制自循环节点,python,matplotlib,graph,draw,networkx,Python,Matplotlib,Graph,Draw,Networkx,我有这个函数,我想画一个自循环。我该怎么做? 边是存在的,但我认为它只是这个例子中的一个点,是(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=No

我有这个函数,我想画一个自循环。我该怎么做?
边是存在的,但我认为它只是这个例子中的一个点,是(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.node[n]['patch']=c
        x,y=pos[n]
    seen={}
    for (u,v,d) in G.edges(data=True):
        n1=G.node[u]['patch']
        n2=G.node[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()

使用matplotlib,您的方法似乎相当先进,但我仍然建议使用专门的图形绘制库(。随着图形变大,出现更多问题,但这些库中已经解决的问题

一个“转到”选项是,它可以很好地处理多个图形的绘制。您可以从networkx图形中写入点文件,然后使用其中一个图形绘制工具(例如dot、neato等)

以下是一个基于和的示例:

请注意,您还可以从ipython shell中轻松调用图形:

也可以使用MattPlotLib打印此图形吗?对于Jupyterlab,
图像(A.draw(format='png'))
将图形内联打印到同一浏览器会话。需要通过:
从IPython导入图像。显示导入图像
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')