R iGraph Heatmap in Vertex

做~自己de王妃 提交于 2019-12-05 03:11:05

问题


I'm quite new to R and stuck on a question. Would it be possible to print a heatmap on a vertex in iGraph? I know I can do a colored square or circle. But would a small heatmap be possible? This is the code that draws my current graph:

    # create graph
graph <- graph.data.frame(network[,1:2])
vertex_names <- get.vertex.attribute(graph,"name")


# define node attributes
V(graph)$label.font <- 1
V(graph)$label.font[which(element_types[vertex_names,"type"]=="PRIMARIES")] <- 2
V(graph)$label.font[which(element_types[vertex_names,"type"]=="REACTION")] <- 2

V(graph)$label <- element_types[vertex_names,"label"]
V(graph)$color <- element_types[vertex_names,"color"]
V(graph)$size <- as.integer(element_types[vertex_names,"size"]*20)
V(graph)$label.cex <- element_types[vertex_names,"weight"]

V(graph)$frame.color <- "gray"
V(graph)$frame.color[which(element_types[vertex_names,"type"]=="PRIMARIES")] <- "white"
V(graph)$frame.color[which(element_types[vertex_names,"type"]=="PATHWAY")] <- "white"
V(graph)$frame.color[which(element_types[vertex_names,"type"]=="PRODUCTS")] <- "white"
V(graph)$frame.width <- 10

V(graph)$shape <- "square"
V(graph)$shape[which(element_types[vertex_names,"type"]=="REACTION")] <- "circle"

V(graph)$label.color <- "black"
V(graph)$label.color[which(element_types[vertex_names,"type"]=="PRIMARIES")] <- "darkred"
V(graph)$label.color[which(element_types[vertex_names,"type"]=="PATHWAY")] <- "darkgreen"
V(graph)$label.color[which(element_types[vertex_names,"type"]=="REACTION")] <- "darkorange3"

E(graph)$color <- "red"
E(graph)$color[which(network[,3]=="out")] <- "blue"
E(graph)$color[which(network[,3]=="external")] <- "darkgreen"
E(graph)$arrow.size <- 0.5

layout <- layout.auto(graph)
plot.igraph(graph,layout=layout,main=pathways[pathway_id,"COMMON-NAME"])

Furthermore, I have matrices in a list that can be drawn into a heatmap. These matrices look like this:

[[1]]
     TotalSNP HighSNP ModerateSNP PromotorSNP
[1,]        1       0           0           1
[2,]        3       0           2           1
[3,]        5       0           2           3
[4,]        1       0           0           1
[5,]        7       0           4           3
[6,]        3       0           3           0
[7,]        4       0           1           3
[8,]        3       0           2           1

[[2]]
     TotalSNP HighSNP ModerateSNP PromotorSNP
[1,]        3       0           1           2
[2,]        0       0           0           0

[[3]]
     TotalSNP HighSNP ModerateSNP PromotorSNP
[1,]        0       0           0           0
[2,]        0       0           0           0

Does anyone know if it's possible to draw these matrices as heatmaps on the vertex?

Sample data:

    FinalList <- list(structure(c(1, 3, 5, 1, 7, 3, 4, 3, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 2, 2, 0, 4, 3, 1, 2, 1, 1, 3, 1, 3, 0, 3, 1), .Dim = c(8L, 
4L), .Dimnames = list(NULL, c("TotalSNP", "HighSNP", "ModerateSNP", 
"PromotorSNP"))), structure(c(3, 0, 0, 0, 1, 0, 2, 0), .Dim = c(2L, 
4L), .Dimnames = list(NULL, c("TotalSNP", "HighSNP", "ModerateSNP", 
"PromotorSNP"))), structure(c(0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(2L, 
4L), .Dimnames = list(NULL, c("TotalSNP", "HighSNP", "ModerateSNP", 
"PromotorSNP"))))

The size of the matrices can vary, It's always 4 columns but the number of rows can vary from 0 rows till 10.


回答1:


So, as I said in the comment above, this is relatively easy with the new vertex shape API, although there are some tricks that you need to know. There are some example shapes in igraph, those help I guess.

So you need to define a function that will plot your vertices. It must have three parameters, the coordinates in a matrix, the vertices to plot (NULL means all of them) and a function object that you can use to query igraph graphics parameters. Please see the details in the code if you are interested. If you want to change the look of the heatmaps, just change image() to whatever you like.

myheat <- function(coords, v=NULL, params) {
  colbar <- heat.colors(50)
  colbreaks <- seq(0, 1, length=length(colbar)+1)
  vertex.size <- 1/200 * params("vertex", "size")
  if (length(vertex.size) != 1 && !is.null(v)) {
    vertex.size <- vertex.size[v]
  }
  heat <- params("vertex", "heat")
  if (is.list(heat) && !is.null(v)) {
    heat <- heat[v]
  } else if (!is.null(v)) {
    heat <- list(heat)
  }
  mapply(coords[,1], coords[,2], vertex.size*2, heat,
         FUN=function(x, y, size, int) {
           stopifnot(is.matrix(int))
           nc <- ncol(int); nr <- nrow(int)
           xc <- seq(x, x+size/nc*(nc-1), length=nc)-size/nc*(nc-1)/2
           yc <- seq(y, y+size/nr*(nr-1), length=nr)-size/nr*(nr-1)/2
           image(xc, yc, int, add=TRUE, col=colbar, breaks=colbreaks)
         })
}

# OK, we add the new shape now, it will be called "heat", 
# and will have an extra vertex parameter, also called "heat". 
# This parameter gives the heatmap intensities. The shape will 
# clip as a square, ie. the edges will be cut at the boundary 
# of the heatmap.

add.vertex.shape("heat", clip=vertex.shapes("square")$clip, plot=myheat,
                 parameters=list(vertex.heat=matrix(0,3,3)))

# Some example data and random heatmaps

g <- graph.formula(A:B -+ C:D +- E)
randheat <- function() matrix(runif(9), 3)
heats <- lapply(1:vcount(g), function(x) randheat())

# Plot them

plot(g, vertex.shape="heat", vertex.heat=heats, vertex.size=50)

# You can mix various vertex shapes

par(mar=c(0,0,0,0)+.1)
plot(g, vertex.shape=c("heat", "heat", "sphere", "heat", "heat"),
     vertex.heat=heats, vertex.size=50)



来源:https://stackoverflow.com/questions/14727321/r-igraph-heatmap-in-vertex

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!