python图中未知标签和边的处理

python图中未知标签和边的处理,python,igraph,Python,Igraph,我有两个数组,a和b。我想绘制networkx图,将彼此接近的值分组,并相应地标记它们。知道怎么做吗?找到紧密配对 您的算法会找到距离b的每个点最近的a点,但您需要在距离的某个阈值内确定它们的列表(在大多数情况下可能为空)。这可以借助于scipy.spatial.KDTree: import numpy as np from scipy.spatial import KDTree from itertools import chain def nearby_pts(a, b, distance)

我有两个数组,a和b。我想绘制
networkx
图,将彼此接近的值分组,并相应地标记它们。知道怎么做吗?

找到紧密配对

您的算法会找到距离
b
的每个点最近的
a
点,但您需要在距离的某个阈值内确定它们的列表(在大多数情况下可能为空)。这可以借助于
scipy.spatial.KDTree

import numpy as np
from scipy.spatial import KDTree
from itertools import chain
def nearby_pts(a, b, distance):
    # indices of close points of `b` for each point of `a`
    a_data, b_data = np.expand_dims(a, axis=1), np.expand_dims(b, axis=1)
    idx = KDTree(b_data).query_ball_point(a_data, r=distance)
    return idx
然后,您可以找到连接从
a
b
的闭合点索引对的边。这不能完全矢量化,但我尽了最大努力:

def close_pairs(a, b, distance):
    pts = nearby_pts(a, b, distance).tolist()
    pts_flatten = list(chain(*pts))
    idx = np.repeat(np.arange(len(pts)), [len(n) for n in pts])
    return np.c_[idx, pts_flatten]
输出:

>>> close_pairs(a, b, distance=150)
[[0, 12], [1, 11], [2, 13], [3, 7], [5, 10], [5, 15], [6, 8], [7, 1], [8, 2], [9, 3], [9, 14], [10, 0], [11, 6], [12, 4], [13, 5], [13, 15], [14, 3], [15, 10]]
绘制图形

现在可以根据找到的边创建图形了,但首先需要重新标记节点的第二部分(
b
),以避免与
a
部分重复。因此,您只需将
len(a)
添加到
b
节点的索引中即可:

import igraph as ig

pairs_relabel = close_pairs(a, b, distance=150) + [0, len(a)]
g = ig.Graph(n = len(a) + len(b))
g.add_edges(pairs_relabel)

pal = ig.drawing.colors.ClusterColoringPalette(2) #number of colors used is 2
color = pal.get_many([0]*len(a)+[1]*len(b)) #tags of colors
labels = np.r_[a.astype(int), b.astype(int)] #labels are integral values of nodes

ig.plot(g, bbox=(500, 300), vertex_size=24, 
        vertex_color = color, vertex_label_size=9, vertex_label = labels)

非常感谢您的支持。但是,当我运行这段代码时,我在getattr raise TypeError(“plotting not available”)@AnkitaDebnath中的第396行收到以下错误“文件”C:\Users\rp603\Anaconda3\lib\site packages\igraph\drawing\utils.py”,请尝试从安装
pycairo
,尤其是用于打印。您可能还希望看到我对
networkx
igraph
的分析,我已经在系统中“pycairo”了,并且当我重新运行您的程序时。我仍然得到这个错误。我安装了'pycairo'版本:1.19.1。构建通道:py38h63da52a_o。是否可以使用matplotlib库打印?如果是,怎么办?@AnkitaDebnath抱歉等了这么久。这可能是python版本的问题。自从python igraph 0.8发布以来,不需要任何非官方的二进制文件。我已经在一个新的conda环境中测试了我的答案的一个脚本:conda create--name testigraph<代码>康达安装jupyter<代码>conda安装scipy
pip安装pythonigraph
python安装pycairo
。自动选择了我的
pycairo
版本:
pycairo-1.20.0-cp38-cp38-win_amd64。whl
@AnkitaDebnath Matplotlib不支持
igraph
。关于这个话题我已经做了一些。此外,
cairo
surfaces的用法是在python中使用的,与R不同。好吧,谢天谢地,至少它有那么少的特性。