我有一个具有特定属性的节点图,我想在Python中通过networkx绘制图形,其中有几个属性作为节点外节点的标签.
有人可以帮助我如何编写我的代码来实现这一目标?
我的代码中有一个循环生成"interface_?" 防火墙列表中每个输入的属性(fwList)
for y in fwList:
g.add_node(n, type='Firewall')
print 'Firewall ' + str(n) + ' :'
for x in fwList[n]:
g.node[n]['interface_'+str(i)] = x
print 'Interface '+str(i)+' = '+g.node[n]['interface_'+str(i)]
i+=1
i=1
n+=1
Run Code Online (Sandbox Code Playgroud)
然后,我稍后绘制节点和边缘,如:
pos=nx.spring_layout(g)
nx.draw_networkx_edges(g, pos)
nx.draw_networkx_nodes(g,pos,nodelist=[1,2,3],node_shape='d',node_color='red')
Run Code Online (Sandbox Code Playgroud)
并将稍后将其扩展到一些具有其他形状和颜色的新节点.
为了标记我在代码下面尝试的单个属性,但它没有用
labels=dict((n,d['interface_1']) for n,d in g.nodes(data=True))
Run Code Online (Sandbox Code Playgroud)
为了将文本放出节点,我不知道......
我正在根据给定的Y值序列创建一个图形curveSeq.(X值自动枚举:0,1,2 ......)
即为curveSeq = [10,20,30],我的图表将包含点:
<0,10>, <1,20>, <2,30>.
Run Code Online (Sandbox Code Playgroud)
我正在绘制一系列图表nx.Graph,以便在一张图片中呈现所有内容.
我的问题是:
<0,10>呈现其各自的标签,我不知道如何删除它.例如,对于序列:
[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1]
Run Code Online (Sandbox Code Playgroud)
收到的图表是:

代码是:
for point in curveSeq:
cur_point = point
#assert len(cur_point) == 2
if prev_point is not None:
# Calculate the distance between the nodes with the Pythagorean
# theorem
b = cur_point[1] - prev_point[1]
c = cur_point[0] - prev_point[0]
a = math.sqrt(b ** 2 + c ** 2)
G.add_edge(cur_point, prev_point, weight=a)
G.add_node(cur_point)
pos[cur_point] = cur_point
prev_point = …Run Code Online (Sandbox Code Playgroud) 根据networkx文档,connected_component_subgraphs(G)返回所有组件的排序列表.因此,第一个应该是最大的组件.
但是,当我尝试使用文档页面上的示例代码获取图G的最大组件时
G=nx.path_graph(4)
G.add_edge(5,6)
H=nx.connected_component_subgraphs(G)[0]
Run Code Online (Sandbox Code Playgroud)
我明白了
TypeError: 'generator' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)
它曾经在我的另一台计算机上运行早期版本的networkx(1.7我想,不是100%肯定)
现在我使用的是另一台配备python 2.7.7和networkx 1.9的计算机.这是版本问题吗?
我自己编写了一个带有几行的小函数来找到最大的组件,只是想知道为什么会出现这个错误.
顺便说一句,我可以通过将生成器对象转换为列表来获取组件.
components = [comp for comp in nx.connected_components(G)]
Run Code Online (Sandbox Code Playgroud)
但是列表不按文档中所述的组件大小排序.
例:
G = nx.Graph()
G.add_edges_from([(1,2),(1,3),(4,5)])
G.add_nodes_from(range(6,20))
components = [comp for comp in nx.connected_components(G)]
component_size = [len(comp) for comp in components]
print G.number_of_nodes(), G.number_of_edges(), component_size
G = nx.Graph()
G.add_edges_from([(1000,2000),(1000,3000),(4000,5000)])
G.add_nodes_from(range(6,20))
components = [comp for comp in nx.connected_components(G)]
component_size = [len(comp) for comp in components]
print G.number_of_nodes(), G.number_of_edges(), component_size
Run Code Online (Sandbox Code Playgroud)
输出:
19 3 [3, 2, 1, …Run Code Online (Sandbox Code Playgroud) B = nx.Graph()
B.add_nodes_from(data['movie'].unique(), bipartite=0, label='movie')
B.add_nodes_from(data['actor'].unique(), bipartite=1, label='actor')
B.add_edges_from(edges, label='acted')
A = list(nx.connected_component_subgraphs(B))[0]
Run Code Online (Sandbox Code Playgroud)
当我尝试使用 nx.connected_component_subgraphs(G) 时,我收到以下给定的错误。请帮助解决这个问题。
在数据集中有两个 couns(电影和演员),它是二部图的形式。
我想获得电影节点的连接组件。
----> 1 A = list(nx.connected_component_subgraphs(B))[0]中的AttributeError Traceback(最近一次调用)
AttributeError: 模块“networkx”没有属性“connected_component_subgraphs”
我正在尝试用 networkx 和 Python 绘制简单的图形。
这是我的代码:
import networkx as nx
import matplotlib.pyplot as plt
G = nx.complete_graph(5)
nx.draw(G, with_labels=True, font_weight='bold')
plt.show()
Run Code Online (Sandbox Code Playgroud)
但我收到错误
Message=random_state_index is incorrect
Source=***\PythonTest.py
StackTrace:
File "***\PythonTest.py", line 15, in <module>
nx.draw(G, with_labels=True)
Run Code Online (Sandbox Code Playgroud)
Python 3.7 64bit
OS Windows
networkx 2.2 ,2.3 或 2.5 也有同样的问题。
目标:我正在尝试将网络中的图形导入 PyTorch 几何图形并设置标签和节点特征。
(这是Python中的)
问题):
from_networkx功能)我看过一些其他/以前的帖子有这个问题,但他们没有得到回答(如果我错了,请纠正我)。
尝试:(我刚刚在下面使用了一个不切实际的例子,因为我无法在这里发布任何真实的内容)
让我们想象一下我们正在尝试在一组汽车上执行图形学习任务(例如节点分类)(正如我所说的不太现实)。也就是说,我们有一组汽车、一个邻接矩阵和一些特征(例如年底的价格)。我们想要预测节点标签(即汽车的品牌)。
我将使用以下邻接矩阵:(抱歉,不能使用乳胶来格式化它)
A = [(0, 1, 0, 1, 1), (1, 0, 1, 1, 0), (0, 1, 0, 0, 1), (1, 1, 0, 0, 0) , (1, 0, 1, 0, 0)]
这是代码(适用于 Google Colab 环境):
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import networkx as nx
from torch_geometric.utils.convert import to_networkx, from_networkx
import torch
!pip install torch-scatter torch-sparse torch-cluster …Run Code Online (Sandbox Code Playgroud) 我有一个巨大的图表数据集 - 让我们说它是这样的,但在更大的层面上:
1 -> 2
3 -> 4
Run Code Online (Sandbox Code Playgroud)
1,2,3,4是节点,箭头是有向边.假设它们都在一个图形对象中:
import networkx as nx
G = nx.DiGraph()
G.add_nodes_from([1,2,3,4])
G.add_edge(1,2)
G.add_edge(3,4)
Run Code Online (Sandbox Code Playgroud)
给定一个像这样的对象,它在图形中有两个迷你图形,我们如何拉出每个迷你图形?我觉得必须有这个词吗?我的最终结果如下:
for mini_graph in G:
print mini_graph.nodes()
...
[1,2]
[3,4]
Run Code Online (Sandbox Code Playgroud) 我有代码
import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()
G.add_nodes_from([1, 2, 3, 4])
G.add_edges_from([(1, 2), (2, 1), (2, 3)])
nx.draw(G)
plt.savefig("graph.png")
plt.show()
Run Code Online (Sandbox Code Playgroud)
但是,我需要显示标签.如何在图形的节点内显示数值和单词(一,二,三和四)?
在看了令人印象深刻的性能比较后,我决定尝试使用图形工具.因此,为了进行比较,我编写了代码以使用两个包生成随机树.
图形工具代码:
import numpy as np
import graph_tool.all as gt
# construct an initial graph with two nodes and one link
n = 5000
G = gt.Graph(directed = False)
G.add_edge(0, 1)
for t in range(2, n):
# connect the new vertex to one of the old vertices randomly
G.add_edge(np.random.choice(range(t)), t)
Run Code Online (Sandbox Code Playgroud)
Networkx代码:
import networkx as nx
import numpy as np
n = 5000
# initial graph
G = nx.Graph()
G.add_edge(0, 1)
for t in range(2, n):
G.add_edge(t, np.random.choice(range(t)))
Run Code Online (Sandbox Code Playgroud)
图形工具在我的4核机器上大约需要14秒,而networkx在同一台机器上需要不到2秒!我错过了一些明显的东西吗 …
操作 使用连通分量基于距离和标签对点进行聚类。
问题 NetworkX 节点存储属性和 Pandas DataFrame 之间的来回切换
尝试 使用不同的函数,如 Scikit NearestNeighbours,但导致数据的来回移动相同。
问题 是否有更简单的方法来执行此连接组件操作?
例子
import numpy as np
import pandas as pd
import dask.dataframe as dd
import networkx as nx
from scipy import spatial
#generate example dataframe
pdf = pd.DataFrame({'x':[1.0,2.0,3.0,4.0,5.0],
'y':[1.0,2.0,3.0,4.0,5.0],
'z':[1.0,2.0,3.0,4.0,5.0],
'label':[1,2,1,2,1]},
index=[1, 2, 3, 4, 5])
df = dd.from_pandas(pdf, npartitions = 2)
object_id = 0
def cluster(df, object_id=object_id):
# create kdtree
tree = spatial.cKDTree(df[['x', 'y', 'z']])
# get neighbours within distance for every point, store …Run Code Online (Sandbox Code Playgroud) networkx ×10
python ×9
matplotlib ×2
graph ×1
graph-tool ×1
kdtree ×1
pandas ×1
pytorch ×1
scipy ×1