Programing/R- programming

R - graph (Network) plot, 네트워크 그래프

sosal 2015. 7. 31. 21:17

 

/*

 http://sosal.kr/
 * made by so_Sal
 */

 


 

- Graph data

그래프 데이터의 표현방식은 다양하다.

 

1. Adjacency matrix (인접행렬)

# 데이터는 아무런 의미가 없는, 제가 마음대로 만든 matrix 입니다.

 

ALK

AMN DMRTA1 SOX2 PCDHA8 OR52A5 IQCB1

ALK

0 1 0 1 0 1 0
AMN 1 0 1 1 0 1 0
DMRTA1 0 1 0 0 0 0 0
SOX2 1 1 0 0 1 1 0
PCDHA8 0 0 0 1 0 1 0

OR52A5

1 1 0 1 1 0 1
IQCB1 0 0 0 0 0 1 0

 

인접행렬은 column, row의 구성이 같아야 하며 n by n matrix를 이룬다.

따라서 column, row에 있는 목록이 곧 vertex가 되며, n-Adjacency matrix의 경우 n개의 vertex가 존재할 것이다.

Vij가 곧 vertex를 연결하는 direct를 의미하며,

 

예제파일 (위의 matrix를 csv로 변환한 파일입니다.)

adjacency_matrix.csv

 

 

 

> library(igraph)

# 라이브러리 설치가 안됐다면, install.packages("igraph") 로 간단하게 설치 가능

> dat <- read.csv("adjacency_matrix.csv", header=TRUE, row.names=1,sep=",")

 

 

> m_dat <- as.matrix(dat)
> g <- graph.adjacency( dat, mode="undirected", weighted=NULL) 

> plot(g)

 

 

2. Edge list 

V1 V2

ALK AMN
ALK SOX2
ALK OR52A5
AMN ALK
AMN DMRTA1
AMN SOX2
DMRTA1 OR52A5
DMRTA1 IQCb1
SOX2 AMN
PCDHA8 SOX2
QR52A5 DMRTA1
IQCB1 AMN
IQCB1 DMRTA1
IQCB1 QR52A5

 

예제파일 (위의 matrix를 csv로 변환한 파일입니다.)

edge_list.csv

 

> dat=read.csv("edge_list.csv",header=TRUE)

 

> m_dat <- as.matrix(dat)

> g = graph.edgelist( m_dat, directed = TRUE)

> plot(g)

 

 

 

 

3. bipartite graph

Stack overflow에서 간단한 예제를 수정하여 가져왔다.

http://stackoverflow.com/questions/31366066/how-to-plot-a-bipartite-graph-in-r

 

> V1 <- sample(LETTERS[1:10], size = 10, replace = TRUE)
> V2 <- sample(1:10, size = 10, replace = TRUE)
> d <- data.frame(V1 = V1, V2 = V2, weights = runif(10))

 

 

 
> g <- graph_from_data_frame(d, directed = FALSE)
> V(g)$label <- V(g)$name # set labels.
 
> V(g)$type <- 1
> V(g)[name %in% 1:10]$type <- 2
> col <- c("steelblue", "orange", "green")
> shape <- c("circle", "square", "circle")
> plot(g, vertex.color = col[V(g)$type], vertex.shape = shape[V(g)$type], edge.width = E(g)$weights * 5)

 # optional, plot edges width proportional to weights.
 

 

 

 

 

사실 이 bipartite graph에서는 Vertex1과 Vertex2를 이름으로 구분했는데,

유전자 네트워크의 경우 V1과 V2에 같은 유전자가 존재할 수 있으므로 이 방법은 사용하기 쉽지 않다.

어떤 방식으로 V1과 V2를 독립적인 vertex로 type을 지정할 수 있을 지 좀더 공부가 필요하다.