如何定义图的id节点之间的差异?
How to define the difference between id's nodes of graph?
我有一个图表g
n = 8
m <- t(matrix(c(
0,0,0,0,0,0,0,8,
3,0,0,0,0,0,0,0,
5,0,0,5,1,0,0,0,
0,0,6,0,0,7,1,0,
0,6,2,0,0,0,0,0,
0,0,0,0,0,0,0,0,
7,4,0,0,8,0,0,3,
0,3,0,0,0,9,0,0),ncol=n))
library(igraph)
g <- graph_from_adjacency_matrix(m, weighted=TRUE, mode="directed")
V(g1)$name <- letters[1:n]
经过一些计算,我得到了带有顶点名称的向量 str
:
str <- c("dca", "dgb", "dc", NA, "dce", "df", "dg", "dg")
我需要找到唯一的节点并绘制一棵树,其中根节点是 str
中的第一个符号。
我的尝试是:
str[is.na(str)]<-"";
vname <- noquote(unique(strsplit((paste0(str, collapse="")),"")[[1]]))
vname
# d c a g b e f
vid <- match( vname, V(g1)$name )
vid
# 4 3 1 7 2 5 6
可以看出g
和vid
节点的区别在于h
节点,它的id
是8.
预期结果是:
问题。如何定义id的节点的差异并删除具有对应边的顶点来绘制树?
您可以使用 subgraph.edges
:
# find wanted edges
str <- unique(str[!is.na(str)])
keep_edges <- apply(
X = unique(
do.call(rbind, lapply(strsplit(str, ""), function(x) embed(x, 2)[,2:1]))
),
MARGIN = 1,
paste0,
collapse = "|"
)
# subgraph containing only wanted edges
g <- subgraph.edges(g1, keep_edges)
nodes <- V(g)$name
plot(g, layout = igraph::layout_as_tree)
您可以使用 eval
+ graph_from_literal
+ gsub
创建图形对象 g
如下所示
tryCatch({
if (all(is.na(str))) warning("All NAs in the input array!")
g <- eval(
str2lang(
sprintf(
"graph_from_literal(%s)",
toString(gsub("(?<=.)(?=.)", "-+", na.omit(str), perl = TRUE))
)
)
)
})
你会看到
> g
IGRAPH fe5b7ea DN-- 7 6 --
+ attr: name (v/c)
+ edges from fe5b7ea (vertex names):
[1] d->c d->g d->f c->a c->e g->b
和plot(g, layout = layout_as_tree)
给出
我有一个图表g
n = 8
m <- t(matrix(c(
0,0,0,0,0,0,0,8,
3,0,0,0,0,0,0,0,
5,0,0,5,1,0,0,0,
0,0,6,0,0,7,1,0,
0,6,2,0,0,0,0,0,
0,0,0,0,0,0,0,0,
7,4,0,0,8,0,0,3,
0,3,0,0,0,9,0,0),ncol=n))
library(igraph)
g <- graph_from_adjacency_matrix(m, weighted=TRUE, mode="directed")
V(g1)$name <- letters[1:n]
经过一些计算,我得到了带有顶点名称的向量 str
:
str <- c("dca", "dgb", "dc", NA, "dce", "df", "dg", "dg")
我需要找到唯一的节点并绘制一棵树,其中根节点是 str
中的第一个符号。
我的尝试是:
str[is.na(str)]<-"";
vname <- noquote(unique(strsplit((paste0(str, collapse="")),"")[[1]]))
vname
# d c a g b e f
vid <- match( vname, V(g1)$name )
vid
# 4 3 1 7 2 5 6
可以看出g
和vid
节点的区别在于h
节点,它的id
是8.
预期结果是:
问题。如何定义id的节点的差异并删除具有对应边的顶点来绘制树?
您可以使用 subgraph.edges
:
# find wanted edges
str <- unique(str[!is.na(str)])
keep_edges <- apply(
X = unique(
do.call(rbind, lapply(strsplit(str, ""), function(x) embed(x, 2)[,2:1]))
),
MARGIN = 1,
paste0,
collapse = "|"
)
# subgraph containing only wanted edges
g <- subgraph.edges(g1, keep_edges)
nodes <- V(g)$name
plot(g, layout = igraph::layout_as_tree)
您可以使用 eval
+ graph_from_literal
+ gsub
创建图形对象 g
如下所示
tryCatch({
if (all(is.na(str))) warning("All NAs in the input array!")
g <- eval(
str2lang(
sprintf(
"graph_from_literal(%s)",
toString(gsub("(?<=.)(?=.)", "-+", na.omit(str), perl = TRUE))
)
)
)
})
你会看到
> g
IGRAPH fe5b7ea DN-- 7 6 --
+ attr: name (v/c)
+ edges from fe5b7ea (vertex names):
[1] d->c d->g d->f c->a c->e g->b
和plot(g, layout = layout_as_tree)
给出