我有一个多图对象,并希望将其转换为带有加权边的简单图形对象.我查看了networkx文档,似乎无法找到实现此功能的内置函数.我只是想知道是否有人知道networkx中可以实现这一目标的内置函数.我查看了to_directed(),to_undirected()函数,但它们不能满足我的目标.
我拥有:在networkx whit节点中导入的图形G和由gml文件加载的egdes.
问题:如何向选定边添加新属性E.
我想做什么:我想为图的特定边E添加新属性'type'.注意:此边缘E不存在属性"type".
我在互联网和这里阅读了很多解决方案,但这些解决方案中没有一个解决了我的问题.实际上我的代码是:
G.edge[id_source][id_target]['type']= value
Run Code Online (Sandbox Code Playgroud)
但是如果我打印G的所有边缘,现在我有n + 1条边,G的所有旧边和新边p =(id_source,id_target,{'type'= value}).此外,旧边E(我想修改的那个)没有新属性'type'.
所以我的代码添加了一个新的边缘(我不想要).
我想更新旧的添加不存在的新属性.
谢谢您的帮助 !
编辑:已解决 感谢Aric和一些技巧我解决了我的问题:
G.edge[id_source][id_target]['type']= value
Run Code Online (Sandbox Code Playgroud) 我想在具有特定属性的图中的节点上选择和执行操作.您如何选择具有给定属性值的节点?例如:
P=nx.Graph()
P.add_node('node1',at=5)
P.add_node('node2',at=5)
P.add_node('node3',at=6)
Run Code Online (Sandbox Code Playgroud)
有没有办法只选择at == 5?的节点.
我想象的东西(这不起作用):
for p in P.nodes():
P.node[p]['at'==5]
Run Code Online (Sandbox Code Playgroud) 我正在使用networkx(python中的图形库),我发现文档说PageRank算法在评分时会考虑边缘权重,但我想知道更大边缘权重是更好还是更低权重更好?
我正在尝试创建一个在节点外打印节点标签的图形.我能够生成如下所示的"偏移"来解决目的.但是,有时标签与边缘重叠(这是不合需要的,因为在节点周围有很多空白区域可以打印相应的标签).我需要以这样的方式标记这些节点,使得标签不与任何边缘重叠,或者至少尽可能地尽量减少重叠.
import networkx as nx
from networkx.utils import is_list_of_ints, flatten
import matplotlib.pyplot as plt
G=nx.Graph()
G = nx.complete_graph(5)
mapping = {0:'aaaaaaa',1:'bbbbbbb',2:'ccccccc', 3:'dddddddd', 4:'eeeeeeeee'}
G = nx.relabel_nodes(G,mapping)
plt.figure(figsize=(10,10), facecolor="w", frameon=False)
pos = nx.graphviz_layout(G, prog="fdp") #calculate position (x,y) coordinates
nx.draw_networkx_nodes(G,pos,node_size=1200,node_shape='o',node_color='0.75')
nx.draw_networkx_edges(G,pos, width=2,edge_color='b')
#for labeling outside the node
offset =10
pos_labels = {}
keys = pos.keys()
for key in keys:
x, y = pos[key]
pos_labels[key] = (x, y+offset)
nx.draw_networkx_labels(G,pos=pos_labels,fontsize=2)
plt.show()
Run Code Online (Sandbox Code Playgroud)
networkx中是否有任何可以处理这种情况的功能.我google了很长时间没有成功.
我正在使用networkx包在python中做一些图论.我想将图形边缘的权重添加到绘图输出中.我怎样才能做到这一点?
例如,如何修改以下代码以获得所需的输出?
import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
i=1
G.add_node(i,pos=(i,i))
G.add_node(2,pos=(2,2))
G.add_node(3,pos=(1,0))
G.add_edge(1,2,weight=0.5)
G.add_edge(1,3,weight=9.8)
pos=nx.get_node_attributes(G,'pos')
nx.draw(G,pos)
plt.savefig("path.png")
Run Code Online (Sandbox Code Playgroud)
我希望0.5和9.8出现在图中它们所指的边缘上.
我有以下 python 代码来构建 knn 图,但我有一个错误:AttributeError: 'Graph' object has no attribute 'node'。似乎 nx.Graph() 没有节点属性,但我不知道我应该用它替换什么。
import networkx as nx
def knn_graph(df, k, verbose=False):
points = [p[1:] for p in df.itertuples()]
g = nx.Graph()
if verbose: print ("Building kNN graph (k = %d)" % (k))
iterpoints = tqdm(enumerate(points), total=len(points)) if verbose else enumerate(points)
for i, p in iterpoints:
distances = map(lambda x: euclidean_distance(p, x), points)
closests = np.argsort(distances)[1:k+1] # second trough kth closest
for c in closests:
g.add_edge(i, c, weight=distances[c])
g.node[i]['pos'] = p …Run Code Online (Sandbox Code Playgroud) 在学习了一个在线教程之后,我发现即使是一小段段落也很难运行。这是我想写入图中的内容:将有向非循环未加权矩阵写入图中,但是我遇到了矩阵表示和图片表示的问题。前者给出警告并用数组替换输出矩阵。然而,图片绘制总是只输出错误,我不知道为什么。这是我的代码
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
import numpy as np
A = np.array([[0,1,1,0],
[1,0,1,1],
[1,1,0,0],
[0,1,0,0]])
G=nx.from_numpy_array(A)
nx.draw(G,with_lables=True)
Run Code Online (Sandbox Code Playgroud)
我的networkx版本是2.8.4,matplotlib版本是3.6.0,与提到的版本教程相匹配。这是错误:
'_AxesStack' object is not callable
Run Code Online (Sandbox Code Playgroud) 我正在使用networkX和matplotlib绘制一个大约5K节点的图形.matplotlib的GTK窗口具有缩放和可视化图形的工具.有什么办法,我可以保存一个放大版本以便以后进行适当的可视化吗?
import matplotlib.pyplot as plt
import networkx as nx
pos=nx.spring_layout(G) #G is my graph
nx.draw(G,pos,node_color='#A0CBE2',edge_color='#BB0000',width=2,edge_cmap=plt.cm.Blues,with_labels=True)
#plt.show()
plt.savefig("graph.png", dpi=500, facecolor='w', edgecolor='w',orientation='portrait', papertype=None, format=None,transparent=False, bbox_inches=None, pad_inches=0.1)
Run Code Online (Sandbox Code Playgroud) 我以.json文件的形式将我的Facebook数据导入到我的计算机上.数据格式如下:
{"nodes":[{"name":"Alan"},{"name":"Bob"}],"links":[{"source":0,"target:1"}]}
Run Code Online (Sandbox Code Playgroud)
然后,我使用这个功能:
def parse_graph(filename):
"""
Returns networkx graph object of facebook
social network in json format
"""
G = nx.Graph()
json_data=open(filename)
data = json.load(json_data)
# The nodes represent the names of the respective people
# See networkx documentation for information on add_* functions
G.add_nodes_from([n['name'] for n in data['nodes']])
G.add_edges_from([(data['nodes'][e['source']]['name'],data['nodes'][e['target']]['name']) for e in data['links']])
json_data.close()
return G
Run Code Online (Sandbox Code Playgroud)
使这个.json文件在NetworkX上使用图形.如果我找到节点的程度,我知道如何使用的唯一方法是:
degree = nx.degree(p)
Run Code Online (Sandbox Code Playgroud)
其中p是我所有朋友的图表.现在,我想绘制图形,使得节点的大小与该节点的程度相同.我该怎么做呢?
使用:
nx.draw(G,node_size=degree)
Run Code Online (Sandbox Code Playgroud)
没有工作,我想不出另一种方法.
networkx ×10
python ×10
graph ×5
matplotlib ×2
attributes ×1
graph-theory ×1
knn ×1
label ×1
nodes ×1
pagerank ×1
pycharm ×1
python-2.7 ×1