如何减少ggraph弧图中的节点?

时间:2019-08-14 19:03:32

标签: r igraph ggraph

我正在尝试创建一个弧形图,以非营利组织之间的关系为重点,围绕着一个以非营利组织之一为中心的子图。此子图中有很多非营利组织,我需要减少弧图中的节点数量,以仅关注最牢固的连接。

我已经成功滤除了权重为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()

这是我得到的结果: enter image description here

2 个答案:

答案 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)

基本过程是识别所有感兴趣的边的起点和终点,然后将该唯一列表与所有边进行比较,并删除唯一列表中没有的那些边。
从代码上方的图形中,“较小”的图形将用于查找顶点。

希望这会有所帮助。