使用igraph python从数据中读取关系
我有一个example.cvc文件,其中包含以下值:使用igraph python从数据中读取关系,python,igraph,Python,Igraph,我有一个example.cvc文件,其中包含以下值: pos= [180 270 360 450 540 630 720 810] mean_values= [(270,630), (540,720),(270,810),(450,630),(180,360), (180,540),(450,810),(360,540),(180,720),(630,810),(270,450),(360,720)] 平均值基本上来自二维高斯混合模型。根据我的理解,标签可以表示顶点(8),平均值可以称为边(1
pos= [180 270 360 450 540 630 720 810]
mean_values= [(270,630), (540,720),(270,810),(450,630),(180,360), (180,540),(450,810),(360,540),(180,720),(630,810),(270,450),(360,720)]
平均值基本上来自二维高斯混合模型。根据我的理解,标签可以表示顶点(8),平均值可以称为边(12)
关于数据:位置基本上由蓝色和黄色圆圈值表示,而平均值对应于哪个位置与哪个位置相关。因此,例如,在180360540和720标签值中,180连接到360540,720,如箭头所示,并由以下平均值表示:[(180360),(180540),(180720)]其他pos也有类似的结果
知道如何使用igraph获得这样的结果吗。我做了几次搜索,但都不知道。我是新来的伊格拉夫,任何帮助将不胜感激。首先,您需要像这样计算最接近的点集(请注意,我随意从列表而不是文件中读取数据,您可以相应地更改它): 当我们绘制图形时,我将第二个元素存储为字符串的原因将被清除。您可以自己查看要验证的点
print(closest_mapping)
#[(640.0, '630.0'),
# (270.0, '360.0'),
# (450.0, '450.0'),
# (230.0, '360.0'),
# (180.0, '360.0'),
# (540.0, '540.0'),
# (270.0, '360.0'),
# (180.0, '360.0'),
# (450.0, '450.0'),
# (360.0, '360.0'),
# (610.0, '630.0'),
# (360.0, '360.0')]
我不知道如何使用igraph绘制二部图,因此我将使用:
import networkx as nx
# Create an empty graph
G = nx.Graph()
# Add the edges from the list we created
G.add_edges_from(closest_mapping)
# Create a bipartite layout
pos = nx.bipartite_layout(G, a)
# Draw the Graph
nx.draw(G, pos, with_labels=True, node_size=900, node_color='y')
左侧的节点来自A
,而右侧的节点来自B
如果要为每对节点查找最近的节点
import numpy as np
import networkx as nx
a = np.asarray([640., 270., 450., 230., 180., 540., 270., 180., 450., 360., 610.,
360.])
b = np.asarray([810., 630., 810., 760., 360., 720., 450., 540., 630., 720., 810.,
540.])
closest_mapping = []
# Find mapping for A->B
for node in a:
# Subtract node from each element in b
# and get the absolute value
dist_list = np.absolute(np.array(b) - node)
# Find the element in b with the min. absolute value
min_element = b[np.argmin(dist_list)]
# Create a tuple of (node, min_element) and add it to list.
# This will be used to plot a graph later.
# Note that the second element is stored as a string.
closest_mapping.append((node, str(min_element)))
# Find Mapping for B->A
for node in b:
# Subtract node from each element in b
# and get the absolute value
dist_list = np.absolute(np.array(a) - node)
# Find the element in b with the min. absolute value
min_element = a[np.argmin(dist_list)]
# Create a tuple of (node, min_element) and add it to list.
# This will be used to plot a graph later.
# Note that the first element is stored as a string.
closest_mapping.append((str(node), min_element))
# Create an empty graph
G = nx.Graph()
# Add the edges from the list we created
G.add_edges_from(closest_mapping)
# Create a bipartite layout
pos = nx.bipartite_layout(G, a)
# Draw the Graph
nx.draw(G, pos, with_labels=True, node_size=900, node_color='y')
注意列表B
中的节点存储为字符串的原因是,如果它们保持为整数/浮点数,并且它们在A
中具有相同的值,则图形将不会是两部分的(即使两者在逻辑上不同,它也不会注册重复节点,因此我将一个节点列表保留为字符串)
更新:
根据更新的问题,可以使用NetworkX直接添加节点和边,如下所示:
将networkx导入为nx
pos= [180, 270, 360, 450, 540, 630, 720, 810]
mean_values= [(270,630), (540,720), (270,810), (450,630), (180,360),
(180,540), (450,810), (360,540), (180,720), (630,810),
(270,450), (360,720)]
G = nx.Graph()
G.add_nodes_from(pos)
G.add_edges_from(mean_values)
pos = nx.spring_layout(G)
nx.draw(G, pos, node_size=500, with_labels=True, node_color='y')
您可以对像这样的定向边使用nx.DiGraph
import networkx as nx
pos= [180, 270, 360, 450, 540, 630, 720, 810]
mean_values= [(270,630), (540,720), (270,810), (450,630), (180,360),
(180,540), (450,810), (360,540), (180,720), (630,810),
(270,450), (360,720)]
G = nx.DiGraph()
G.add_nodes_from(pos)
G.add_edges_from(mean_values)
pos = nx.spring_layout(G)
nx.draw(G, pos, node_size=500, with_labels=True, node_color='y')
参考资料:
import networkx as nx
pos= [180, 270, 360, 450, 540, 630, 720, 810]
mean_values= [(270,630), (540,720), (270,810), (450,630), (180,360),
(180,540), (450,810), (360,540), (180,720), (630,810),
(270,450), (360,720)]
G = nx.DiGraph()
G.add_nodes_from(pos)
G.add_edges_from(mean_values)
pos = nx.spring_layout(G)
nx.draw(G, pos, node_size=500, with_labels=True, node_color='y')