1

我正在尝试创建一个弧形图,显示非营利组织之间的关系,重点是以其中一个非营利组织为中心的子图。这个子图中有这么多的非营利组织,我需要减少弧图中的节点数量,只关注最强的连接。

我已成功过滤掉权重低于 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()

这是我得到的结果: 在此处输入图像描述

4

2 回答 2

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)
于 2019-08-15T10:48:33.653 回答
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)

基本过程是识别所有感兴趣边的开始和结束,然后将这个唯一列表与所有边进行比较,并删除不在唯一列表中的那些。
从您上面的代码中,“较小”的图形将用于查找顶点。

希望这可以帮助。

于 2019-08-15T03:29:27.897 回答