对于网络图,其实我们并不陌生,用的比较普遍的是Cytoscape这个软件。不过,我们今天的主角是R包---igragh。相比Cytoscape,igragh的便利之处就是你不用趴在电脑上很痛苦的去一一调整节点的大小,颜色等属性。接下来,我就开启小白学习之旅了。
install.packages('igraph') library(igraph)
对于图 graph 这种数据结构而言,最基本的元素包括节点(node) 和 边(edge,节点之间的连线); igraph这个R包提供了很多种创建graph的方式,我们先看一个最简单的例子:
g1 <> plot(g1) #简单用参数directed修改,directed参数控制graph有无方向,标明节点之间的指向性; g2 <> plot(g2)
左右滑动查看完整内容 g1
g2 再举一个栗子,我们改变节点的颜色,标签位置等:
g3 <>'John', 'Jim', 'Jim', 'Jack', 'Jim', 'Jack', 'John', 'John'), isolates=c('Jesse', 'Janis', 'Jennifer', 'Justin') ) plot (g3, edge.arrow.size=.5, vertex.color=rgb(.25, .5, .3, alpha=.5), vertex.size=15, vertex.frame.color='gray', vertex.label.color='black', vertex.label.cex=0.8, vertex.label.dist=2, edge.curved=0.2) #参数很多了,而且'Jesse', 'Janis', 'Jennifer', 'Justin'均是独立的。改变graph()里的参数后(去掉isolates参数),network会有很大变化。
左右滑动查看完整内容 g3-1
g3-2 下面我们来了解一下在用igraph包画图时可能会用到的函数和参数。
(1)构建graph数据结构:
前面已经说过,igraph这个R包提供了很多种创建graph的方式。如上面的graph函数(也可以是make_graph()),其次还有 graph_from_literal() graph_from_data_frame() graph_from_incidence_matrix() graph_from_adjacency_matrix()等 在R中,输入?graph_from后按table键可查看更多,这里我先讲上面提到的几种常见且易操作的函数。
(2)了解绘图,?Plot.igraph即可查看plot()函数更多参数:
NODES | vertex.color | 节点颜色 |
| vertex.frame.color | 节点边框颜色 |
| vertex.shape | 节点的形状:有circle,square,csquare,rectangle, crectangle,vrectangle,pie,raster,sphere |
| vertex.size | 节点的大小 (default is 15) |
| vertex.label | 节点的标签 |
| vertex.label.family | 标签的字体系列 (e.g.“Times”, “Helvetica”) |
| vertex.label.font | 字体: 1 plain, 2 bold, 3, italic, 4 bold italic, 5 symbol |
| vertex.label.cex | 字体大小 |
| vertex.label.dist | 标签与顶点的距离(默认值为0,标签以顶点为中心) |
| vertex.label.degree | 标签相对于顶点的位置, (0,pi,pi/2,-pi/2分别表示有,左,下和上) | EDGES | edge.color | 边的颜色 |
| edge.width | 边宽, 默认值为1 |
| edge.arrow.size | 箭头大小,默认值为 1 |
| edge.arrow.width | 箭头宽度,默认值为 1 |
| edge.lty | 线条类型 |
| edge.curved | 边的曲率,范围0-1(FALSE设置为0,TRUE设置为0.5) | OTHER | layout | 布局,通过layout参数可以方便的指定,使用不同的布局算法;对于不同类型的graph,有不同的自动化的布局算法,默认值为layout_nicely。 |
# graph_from_literal()函数 用这种描述简单构图: - 表示无向连接,+ - 或 - + 指向左和右的有向关系,++表示对称关系,“:”表示顶点集。 #无向图 gl <><> plot(gl) # 有向图 plot(graph_from_literal( A +-+ B --- C ++ D + E)) #在有向图中B C之间是不相连的
左右滑动查看完整内容
无向图 有向图 ##小贴士: · 无向图之间的连接使用-,或者---,这个长度是任意的,如graph_from_literal(A-B) 和 graph_from_literal(A-----B) 等价 , 多个顶点可以直接相连,如graph_from_literal(A---B----C---D); · 图中的孤立点,可以逗号分开,作为独立的参数,如 上图的o; · 顶点集,使用:连接的顶点为一个顶点集,顶点集之间的点不相连,其余点均与顶点相连。 · 使用+作为箭头; · 有向图中,如果顶点之间没有箭头(+),则表示这两个点不相连,双向的箭头可以使用一个或者两个+代替;
左右滑动查看完整内容
# graph_from_data_frame()函数,从文件中读取network数据(读取文件的方式就是常规数据读取方式,read.table 或 read.csv等) #示例数据:
左右滑动查看完整内容
library(igraph) net - graph_from_data_frame(d=links, vertices=nodes, directed=T) class(net) ##查看net数据类型 左右滑动查看完整内容
### 用下面命令查看网络数据的nodes, edges及它们的属性: E(net) V(net) E(net)$type V(net)$media ####展示画图,调整画图参数:增加节点标签等 plot(net, edge.arrow.size=.2, edge.curved=0, vertex.color='skyblue', vertex.frame.color='#555555', vertex.label=V(net)$media, vertex.label.color='black', vertex.label.cex=.7)
左右滑动查看完整内容
##丰富网络图的内容; colrs <>'gray50', 'tomato', 'gold') #设置节点的分类颜色 V(net)$color <>$media.type] V(net)$size <>$audience.size*0.6 #设置节点大小 V(net)$label.color <>'black' #设置节点颜色 E(net)$width <>$weight/6 #基于weight值设置边的宽度 E(net)$arrow.size <>#设置箭头及边的大小 E(net)$edge.color <>'gray80' #设置边的颜色 plot(net,vertex.label=V(net)$media,vertex.label.cex=.7)
左右滑动查看完整内容
###添加标签,修改布局(layout) ll - layout_nicely(net) ##更多布局用?igraph::layout_进行查看 plot(net, layout=ll) legend(x=-1.5, y=-1.1, c('Newspaper','Television', 'Online News'), pch=21, col='#777777', pt.bg=colrs, pt.cex=2, cex=.8, bty='n', ncol=1)
左右滑动查看完整内容
好了,igraph包的入门我就先讲到这里!其实,真的还有很多很多内容,如果大家需要,我再来写一篇进阶版。现在要赶紧去动手实践哦!
|