我正在尝试创建一个弧形图,以非营利组织之间的关系为重点,围绕着一个以非营利组织之一为中心的子图。此子图中有很多非营利组织,我需要减少弧图中的节点数量,以仅关注最牢固的连接。
我已经成功滤除了权重为50的边缘。但是,当我创建图形时,即使边缘消失了,节点仍然保留着。如何从弧形图中过滤掉不需要的节点?
这是我的代码,从创建igraph对象开始。
# Create an igraph object
NGO_igraph <- graph_from_data_frame(d = edges, vertices = nodes, directed = TRUE)
# Create a subgraph centered on a node
# Start by entering the node ID
nodes_of_interest <- c(48)
# Build the graph
selegoV <- ego(NGO_igraph, order=1, nodes = nodes_of_interest, mode = "all", mindist = 0)
selegoG <- induced_subgraph(NGO_igraph,unlist(selegoV))
# Reducing the graph based on edge weight
smaller <- delete.edges(selegoG, which(E(selegoG)$weight < 50))
# Plotting an arc graph
ggraph(smaller, layout = "linear") +
geom_edge_arc(aes(width = weight), alpha = 0.8) +
scale_edge_width(range = c(0.2, 2)) +
geom_node_text(aes(label = label)) +
labs(edge_width = "Interactions") +
theme_graph()
答案 0 :(得分:1)
如果仅对省略零度顶点或隔离(即没有传入或传出边缘的顶点)感兴趣,则可以使用以下行:
g <- induced.subgraph(g, degree(g) > 0)
但是,这将删除所有隔离。因此,如果出于某种原因要专门删除由小于50的边连接的那些顶点(并排除其他“特殊”隔离点),那么您将需要清楚地识别出哪些是
special_vertex <- 1
v <- ends(g, which(E(g) < 50))
g <- delete.vertices(g, v[v != special_vertex])
您也可以通过考虑顶点的delete.edges
来跳过strength
部分:
g <- induced.subgraph(g, strength(g) > 50)
答案 1 :(得分:0)
没有任何示例数据,我创建了这个基本示例:
#define graph
g <- make_ring(10) %>%
set_vertex_attr("name", value = LETTERS[1:10])
g
V(g)
#delete edges going to and from vertice C
g<-delete.edges(g, E(g)[2:3])
#find the head and tails of each edge in graph
heads<-head_of(g, E(g))
tails<-tail_of(g, E(g))
#list of all used vetrices
combine<-unique(c(heads, tails))
#collect an vertices
v<-V(g)
#find vertices not in found set
toremove<-setdiff(v, combine)
#remove unwanted vertices
delete_vertices(g, toremove)
基本过程是识别所有感兴趣的边的起点和终点,然后将该唯一列表与所有边进行比较,并删除唯一列表中没有的那些边。
从代码上方的图形中,“较小”的图形将用于查找顶点。
希望这会有所帮助。