R 数据可视化 —— igraph 对象

Python065

R 数据可视化 —— igraph 对象,第1张

例如,我们有如下 igraph 对象

查看对象

在第一行中, 16 进制数后面的字符分别代表:

还有两个字符

后面的两个数值 (10 9) 表示节点和边的数量

第二行为节点和边的属性,其中括号中的字符分别表示:

例子中的 name 为节点的字符型属性

获取图的大小

以传递节点 ID 的方式,获取指定节点及这些节点之间的边,构建子图

以指定边 ID 的方式,获取包含指定边及边所涉及到的节点,构建子图

最直接的表示图的方法是邻接矩阵,行列与节点对应,如果两个节点之间存在连接,则矩阵中对应位置的值为 1 ,否则为 0 。对于加权图来说,值代表的是边的权重。

对于无向图来说,邻接矩阵总是对称的,而对于有向图来说并不一定是对称的。

使用 [] 可以返回对象的邻接矩阵,也可以使用 get.adjacency(g) 来获取

返回的是一个稀疏矩阵

获取对应的边

0 表示不存在 A 到 F 的边,我们可以将其设置为 1 ,意味着会添加这条边

如果要删除一条边,可以将邻接矩阵对应位置的值设置为 0 ,例如

查询多条边会返回一个矩阵

获取一个节点与其他所有节点之间的连接

以数字索引的方式

条件查询

配对节点

将会查询的边为 A-C 、 B-D 、 C-E ,需要保证 from 和 to 的长度一致

获取邻接节点

邻接表是以表的形式来表示图的,只存储每个节点中与其相连的节点

获取节点的邻接节点

不同方向的邻接节点

显示边

获取两个节点集合之间的边

使用 E() 和 V() 函数,可以获取 igraph 对象的边和节点。例如

V() 的返回值是根据结点的 ID 进行了排序。由于我们的节点是字符型的,会根据节点添加的顺序自动为节点设置 ID ,第一个节点的 ID 为 1

可以使用两个节点名称之间添加一个竖线组成的字符串来引用连接两个节点的边,如果是无向图,则两个节点的顺序不影响边的引用

使用 ends() 可以获取边的矩阵表示

对于有向图, head_of 和 tail_of 可以获取边的头尾两个端点,有箭头的一端为头

使用 neighbors 来获取节点的邻接节点

对于无向图,两种模式的邻接节点是一样的

计算边和节点的数量

节点序列操作

根据邻接节点索引

查询条件

反转、去重和集合操作

获取边涉及的结点

边序列操作与节点类似

获取涉及到节点的边

条件索引

获取两个节点集合之间存在的边

集合操作、去重和反转和节点操作一样

注意 :我们在中括号中使用的简写函数只能在对应条件下使用,无法单独使用

我们可以将节点和边的元数据(附加信息)作为属性值的方式添加到节点和边的属性中

使用 $ 可以获取和设置属性,例如,获取节点的 name 属性

为节点新建一个名为 class 的属性

为边设置属性值

也可以使用 set_edge_attr 和 set_vertex_attr 函数来设置,效果是一样的

获取所有节点和边的属性

可以使用 delete_edge_attr 和 delete_vertex_attr 删除属性

获取图属性

设置图的属性

删除图属性

上面的属性设置都是在已经构建完图之后,我们也可以在构建图的时候添加属性。例如

在这里,我们使用 add_edges 和 add_vertices 函数来添加边和节点,对应的,可以使用 delete_edges 和 delete_vertices 来删除边和节点

有几个特殊的属性:

图有一个类' Igraph '。下面是一个示例,一个使用make_ring创建的环形图:

如果想查看图形的边,可以使用print_all函数:

要创建具有给定结构的小图形,graph_from_literal函数可能是最简单的。它使用R的公式界面,它的手册页包含了许多示例。另一种选择是graph函数,它直接接受数值顶点id。graph.atlas从 Graph Atlas创建图,make_graph 函数可以创建一些特殊的图。

igraph中有很多用于创建图的函数,有确定性的,也有随机的随机图构造器称为‘games’。

要从字段数据创建图,graph_from_edgelist、graph_from_data_frame和graph_from_adjacency_matrix可能是最好的选择。

igraph包括一些经典的随机图,如Erdos-Renyi GNP and GNM graphs (sample_gnp, sample_gnm),以及一些最近流行的模型,如preferential attachment (sample_pa) and the small-world model (sample_smallworld)。

对于边也是一样,边id总是在1到m之间,m是图中边的总数。

顶点和边在igraph中都有数值的顶点id。顶点id从1开始,总是连续的。即对于一个有n个顶点的图,顶点id在1到n之间。如果某些操作改变了图中的顶点数,例如通过induced_subgraph创建了一个子图,那么顶点将重新编号以满足这个条件。

在igraph中,可以将属性赋给图的顶点或边,或者赋给图本身。igraph提供了基于属性值选择一组顶点或边的灵活构造,有关详细信息,请参阅vertex_attr、V和E。

一些顶点/边/图属性被特殊处理。其中一个是“name”属性。这用于打印图形,而不是数字id(如果存在)。在所有igraph函数中,顶点名称也可以用来指定一个向量或顶点集。例如,度有一个v参数,它给出了度被计算的顶点。这个参数可以作为顶点名称的字符向量给出。

边也可以有一个“name”属性,这也是特别处理的。就像顶点一样,边也可以根据它们的名字来选择,例如在delete_edges和其他函数中。

我们注意到,顶点名称也可以用来选择边。形式“from|to”,其中“from”和“to”是顶点名称,选择一个单一的,可能是有方向的,从“from”到“to”的边。这两种形式也可以在同一个边选择器中混合。

如果您使用save和load来存储/检索图形,那么所有的属性值都将被保留。

igraph提供了三种不同的可视化方法。首先是情节。igraph函数。(实际上你不需要写情节。igraph, plot就够了。这个函数使用常规的R图形,可以与任何R设备一起使用。

第二个函数是tkplot,它使用一个Tk GUI来进行基本的交互式图形操作。(Tk非常需要资源,所以不要对非常大的图尝试这种方法。)

第三种方法需要rgl包并使用OpenGL。

igraph可以处理各种图形文件格式,通常用于读写。我们建议对图形使用GraphML文件格式,除非图形太大。对于较大的图形,建议采用更简单的格式。有关详细信息,请参阅read_graph和write_graph。

igraph development team

igraph Tutorials

系列文章:

networkD3 绘制动态网络