繁体   English   中英

使用 igraph python 从数据中读取关系

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM