标签: networkx

在NetworkX中移动/重命名节点的最有效方法是什么?

我正在使用Python的NetworkX图形库.在我的程序中的某个时刻,我想将我的nodeID"合并"成一系列数字.这是我的天真方法:

start = 1 # could be anything
for i, n in enumerate(g.nodes()):
    if i+start == n:
        continue
    g.add_node(i+start, attr_dict=g.node[n])
    g.add_edges_from([(i+start, v, g[n][v]) for v in g.neighbors(n)])
    g.remove_node(n)
Run Code Online (Sandbox Code Playgroud)

有没有比这个所有邻居的详尽副本更快的方法?例如,我尝试过g[i+start] = g[n],但这是禁止的.

谢谢!

python graph networkx

14
推荐指数
2
解决办法
4386
查看次数

使用NetworkX和Matplotlib实现网络增长动画

我想动画一段随着时间的推移而增长的图表.

这是我到目前为止:

fig = plt.figure()
ims = []
graph = nx.Graph()
for i in range(50):
    // Code to modify Graph
    nx.draw(graph, pos=nx.get_node_attributes(graph,'Position'))
    im = plt.draw()
    self.ims.append([im])
ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,repeat_delay=1000)
ani.save('dynamic_images.mp4')
plt.show()
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误消息:

 File "main.py", line 204, in <module>
    repeat_delay=1000)
  File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 356, in __init__
    TimedAnimation.__init__(self, fig, *args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 304, in __init__
    Animation.__init__(self, fig, event_source=event_source, *args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 53, in __init__
    self._init_draw()
  File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 363, in _init_draw
    artist.set_visible(False)
AttributeError: 'NoneType' object …
Run Code Online (Sandbox Code Playgroud)

python animation matplotlib networkx

14
推荐指数
3
解决办法
1万
查看次数

Python NetworkX - 根据属性选项的数量自动设置节点颜色

我正在使用NetworkX来分析和可视化社交网络.通常,网络内的节点具有与它们相关联的属性信息,例如划分.但是,我并不总是知道属性划分可能有多少选项.例如,有时可能只有3个分区表示为网络中的节点属性,有时可能有30个分区.

我已经弄清楚如何根据节点属性设置节点颜色(参见下面的代码).但是,在此示例中,我知道节点属性组(5个选项)的选项有多不同,并自动设置每种颜色.

当节点属性只有3或5个选项时,选择节点属性颜色并不困难,但是当有更多选项时,这变得不现实.

我想弄清楚的是如何根据提供的节点属性选项的数量自动选择最佳节点属性颜色.

有时候我有5个属性要着色的选项,有时我可能有30个选项让节点属性着色,我不想单独设置每个节点颜色.

我不确定这是否应该能够与colormap函数一起使用,或者如果仅通过数值度量(例如度中心度)用于颜色节点.

NETWORKX代码

import networkx as nx

pylab inline

# create an empty graph
g = nx.Graph()

# open csv edgelist and read edges into graph
for line in open('phils_network_edgelist.csv', 'rb'):
    edge = line.rstrip().split(',')
    g.add_edge(edge[0], edge[1])

# draw network without node color
nx.draw(g, with_labels=False, node_size=25)
Run Code Online (Sandbox Code Playgroud)

没有节点属性颜色的网络

# read in node attributes as list of tuples
group_attr = []
for line in open('phils_network_attribute_group.csv', 'rb'):
    group_attr.append(tuple(line.rstrip().split(',')))

# convert list of tuples into a dict
group_attr_dict = dict(set(sorted(group_attr))) …
Run Code Online (Sandbox Code Playgroud)

python matplotlib networkx

14
推荐指数
1
解决办法
2万
查看次数

最优雅的方法是使用networkX查找节点的前辈

我正在使用NetworkX使用python进行图形模型项目.NetworkX使用词典提供简单而好的功能:

import networkx as nx
G = nx.DiGraph() # a directed graph
G.add_edge('a', 'b')
print G['a'] # prints {'b': {}}
print G['b'] # prints {}
Run Code Online (Sandbox Code Playgroud)

我想使用有向图,因为我正在编写具有方向的依赖项(在上面的例子中,我有'b'的封闭形式,条件是'a',而不是相反).

对于给定节点,我想找到该节点的前驱.对于上面的例子,par('b')应该返回['a'].NetworkX确实有一个后继函数,它可以找到任何节点的子节点.显然,通过遍历所有节点并找到那些具有"b"作为子节点的节点将起作用,但节点数量将是Ω(n)(这对于我的应用来说太昂贵了).

我无法想象这个简单的东西会被遗漏在这个制作精良的包装中,但找不到任何东西.

一个有效的选择是存储图的有向和无向版本; 所有无向边缘基本上都是通过添加两个有向边来实现的,因此可以采用相邻节点和子节点(它们是前一个节点)之间的设置差异.

麻烦的是我不确定包装现有的networkx DiGraph和Graph类来实现这一目标的最pythonic方法.真的,我只想得到一个类PGraph,它的行为与networkx DiGraph类完全相同,但predecessors(node)除了函数之外还有一个successors(node)函数.

PGraph应该继承DiGraph并封装Graph(用于前辈函数)吗?那么我应该如何强制将所有节点和边缘添加到它包含的有向图和无向图中?我是否应该重新实现在PGraph中添加和删除节点和边缘的功能(以便在有向和无向版本中添加和删除它们)?我担心,如果我想念一些不为人知的东西,我会在以后头疼,这可能并不意味着好的设计.

或者(并且请让它成为True)有一个简单的方法来获取nodex.DiGraph中的节点的前辈,我完全错过了它?

非常感谢你的帮助.


编辑:

我认为这样做了.PGraph继承自DiGraph,并封装了另一个DiGraph(这个反转).我已经覆盖了添加和删除节点和边缘的方法.

import networkx as nx

class PGraph(nx.DiGraph):
    def __init__(self):
        nx.DiGraph.__init__(self)
        self.reversed_graph = nx.DiGraph()
    def add_node(self, n, attr_dict=None, **attr):
        nx.DiGraph.add_node(self, n, attr_dict, **attr)
        self.reversed_graph.add_node(n, attr_dict, **attr)
    def add_nodes_from(self, ns, attr_dict=None, **attr):
        nx.DiGraph.add_nodes_from(self, ns, attr_dict, **attr)
        self.reversed_graph.add_nodes_from(ns, …
Run Code Online (Sandbox Code Playgroud)

python parents networkx

13
推荐指数
2
解决办法
2万
查看次数

Networkx:pagerank,pagerank_numpy和pagerank_scipy之间的区别?

有谁知道Networkx中三种不同的pagerank功能之间的准确性差异?

我有一个1000个节点和139732个边缘的图形,"普通" pagerank函数似乎根本不起作用 - 除了两个节点之外都有相同的PG,所以我假设这个函数不起作用以及大型图表?

pagerank_numpy价值观似乎也比pagerank_scipy价值观更加分散.该函数的文档说"这对于小图表来说是最快和最准确的".什么是"小"图?

另外,为什么pagerank_numpy不允许max_itertol参数?

python numpy pagerank scipy networkx

13
推荐指数
1
解决办法
4605
查看次数

为Networkx和Graphviz中的特定节点着色

我正在编写一个程序来绘制距离矩阵图.它工作正常.现在我希望某个节点和某个边缘具有我选择的特定颜色.我怎么做?

该程序使用Python并使用Networkx和Graphviz

import networkx as nx
import numpy as np
import pickle
from random import randint

p_file = open('pickles/distance')
Dist = pickle.load(p_file)
p_file.close()
p_file = open('pickles/names')
Names = pickle.load(p_file)
p_file.close()

dt = [('len', float)]
A = np.array(Dist)*5
A = A.view(dt)

G = nx.from_numpy_matrix(A)
G = nx.relabel_nodes(G, dict(zip(range(len(G.nodes())),Names)))    

G = nx.to_agraph(G)
G.node_attr.update(ndcolor="red", node="DC", style="filled")
G.edge_attr.update(color="none")
G.draw('P1.png', format='png', prog='neato')
Run Code Online (Sandbox Code Playgroud)

numpy graph graphviz networkx graph-visualization

13
推荐指数
1
解决办法
1万
查看次数

使用networkx绘制多路图?

我试图想象一些节点代表不同对象的图形.我想创建一个看起来像这里的图像:

在此输入图像描述

基本上,我需要一个3D绘图,并能够在同一级别或不同级别的节点上的节点之间绘制边缘.

python networkx

13
推荐指数
1
解决办法
4329
查看次数

Networkx中的社区检测

我正在研究网络中的检测社区.

我用的是igraph和Python

对于模块化度量方面的最佳社区数量:

from igraph import *
karate = Nexus.get("karate")
cl = karate.community_fastgreedy()
cl.as_clustering().membership
Run Code Online (Sandbox Code Playgroud)

为供应所需数量的社区:

from igraph import *
karate = Nexus.get("karate")
cl = karate.community_fastgreedy()
k=2
cl.as_clustering(k).membership
Run Code Online (Sandbox Code Playgroud)

但是,我喜欢使用networkx这样做.我知道在模块化度量方面获得最佳社区数量:

import community # --> http://perso.crans.org/aynaud/communities/
import fastcommunity as fg # --> https://networkx.lanl.gov/trac/ticket/245
import networkx as nx

g = nx.karate_club_graph()
partition = community.best_partition(g)
print "Louvain Modularity: ", community.modularity(partition, g)
print "Louvain Partition: ", partition

cl = fg.communityStructureNewman(g)
print "Fastgreed Modularity: ", cl[0]
print "Fastgreed Partition: ", cl[1]
Run Code Online (Sandbox Code Playgroud)

但我无法获得所需数量的社区.使用Networkx有一些算法吗?

python modularity igraph networkx

13
推荐指数
1
解决办法
2万
查看次数

NetworkX中的二分图

B.add_nodes_from(a, bipartite=1)
B.add_nodes_from(b, bipartite=0)
nx.draw(B, with_labels = True)  
plt.savefig("graph.png")
Run Code Online (Sandbox Code Playgroud)

我得到下图.如何让它看起来像一个合适的二分图?

我的图表

matplotlib bipartite networkx

13
推荐指数
2
解决办法
8288
查看次数

在networkx中标记边缘

我正在编写一个基本的神经网络,并希望将其绘制为图片.为此我创建了我需要的所有节点和边缘.

    for l, j in zip(self.layers, range(len(self.layers))):
        for n, i in zip(l.neurons, range(len(l.neurons))):
            fixed_positions[n.identifier] = (j, i)
    for l in self.layers:
        for n in l.neurons:
            for c, w in zip(n.inconnections, n.inconnectionweights):
               g.add_edge(n.identifier, c.identifier)
    fixed_nodes = fixed_positions.keys()
    pos = nx.spring_layout(g, pos=fixed_positions, fixed=fixed_nodes)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

蓝点(想象它们在所有边缘)是我想在边缘添加标签的地方,但我不知道该怎么做.它应该适用于任何合理的净大小,即它也适用于resprective层中的4,3和2个神经元.

python networkx

13
推荐指数
3
解决办法
8158
查看次数