R - graph (Network) plot, 네트워크 그래프
- 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로 변환한 파일입니다.)
> 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로 변환한 파일입니다.)
> 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.
유전자 네트워크의 경우 V1과 V2에 같은 유전자가 존재할 수 있으므로 이 방법은 사용하기 쉽지 않다.
어떤 방식으로 V1과 V2를 독립적인 vertex로 type을 지정할 수 있을 지 좀더 공부가 필요하다.