gpt4 book ai didi

Vertex 中的 R iGraph 热图

转载 作者:行者123 更新时间:2023-12-02 09:43:39 25 4
gpt4 key购买 nike

我对 R 很陌生,并且遇到了一个问题。是否可以在 iGraph 中的顶点上打印热图?我知道我可以做一个彩色的正方形或圆形。但是小型热图可能吗?这是绘制我当前图表的代码:

    # 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"])

此外,我的列表中有可以绘制成热图的矩阵。这些矩阵如下所示:

[[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

有谁知道是否可以将这些矩阵绘制为顶点上的热图?

示例数据:

    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"))))

矩阵的大小可以变化,始终为 4 列,但行数可以从 0 行到 10 行变化。

最佳答案

因此,正如我在上面的评论中所说,使用新的顶点形状 API 相对容易,尽管您需要了解一些技巧。 igraph 中有一些示例形状,我想这些会有帮助。

所以你需要定义一个函数来绘制你的顶点。它必须具有三个参数:矩阵中的坐标、要绘制的顶点(NULL 表示全部)以及可用于查询 igraph 图形参数的函数对象。如果您有兴趣,请查看代码中的详细信息。如果您想更改热图的外观,只需将 image() 更改为您喜欢的任何内容即可。

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)

plot

关于Vertex 中的 R iGraph 热图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14727321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com