【问题标题】:Matplotlib and Networkx - drawing a self loop nodeMatplotlib 和 Networkx - 绘制自循环节点
【发布时间】:2018-08-26 16:31:00
【问题描述】:

我有这个功能,我想画一个自循环。我该怎么做?
边缘存在,但我认为这只是这个例子中的一个点是 (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()

【问题讨论】:

    标签: python matplotlib graph draw networkx


    【解决方案1】:

    您的方法似乎在使用 matplotlib 方面非常先进,但我仍然建议使用专门的绘图库 (as does the networkx documentation)。随着图表变得越来越大,会出现更多问题——但这些问题已经在这些库中解决了。

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

    这是一个示例,基于graph attributesmultigraph edge attributes

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

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

    【讨论】:

    • 你能用 MattPlotLib 绘制这个图吗?
    • 对于 Jupyterlab,Image(A.draw(format='png')) 将图形 inline 打印到同一浏览器会话。需要通过from IPython.display import Image导入Image
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 2011-04-28
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多