[英]Read relations from data using igraph python
我有一个包含以下值的 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),mean_values 可以称为边(12)。
数据方面:pos基本上由蓝色和黄色圆圈值表示,mean值对应哪个与哪个pos相关。 因此,例如,在 180,360,540 和 720 个标签值中,180 个连接到 360,540、720,如箭头所示,并由以下均值表示:[(180,360), (180,540),(180,720)] 和其他类似的结果位置,
关于如何使用 igraph 获得这样的结果的任何想法。 我做了几次搜索,但没有得到任何想法。 我是 igraph 的新手,任何帮助将不胜感激。 提前致谢
首先,您需要像这样计算最近的一组点(请注意,我冒昧地从列表而不是文件中读取数据,您可以相应地更改它):
import numpy as np
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 = []
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)))
当我们绘制图形时,将清除我将第二个元素存储为字符串的原因。 可以自己看积分来验证
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 绘制二部图,因此我将为此使用NetworkX :
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')
参考资料:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.