Ray*_*S. 1 r ggplot2 ggraph tidygraph
我正在尝试绘制网络图,并仅显示具有高于特定阈值的中心得分的geom_node_text标签。我的代码如下:
rt_tbl %>%
mutate(centrality = centrality_authority()) %>%
ggraph(layout = 'kk') +
geom_edge_link(aes(), colour = "gray", alpha = 0.5) +
geom_node_point(aes(size = centrality, colour = centrality)) +
geom_node_text(data=subset(centrality > 0.6), aes(centrality, label=name)) +
theme_graph(base_family = "Roboto Condensed", base_size = 13)
Run Code Online (Sandbox Code Playgroud)
我遇到以下错误:
Error in subset(centrality > 100) : object 'centrality' not found
Run Code Online (Sandbox Code Playgroud)
我的数据如下所示:
# A tbl_graph: 1589 nodes and 3992 edges
# A directed multigraph with 3 components
# Node Data: 1,589 x 3 (active)
name degree centrality
<chr> <dbl> <dbl>
1 Ashinlay1970 35 0.90053429
2 WinTunMin1 25 0.66408597
3 Yaminayeyaohn1 2 0.06080755
4 TUNOO00655880 3 0.07609831
5 inewagency 8 0.21569006
6 KSwe03 4 0.12416238
# ... with 1,583 more rows
# Edge Data: 3,992 x 2
from to
<int> <int>
1 1 48
2 1 49
3 1 1
# ... with 3,989 more rows
Run Code Online (Sandbox Code Playgroud)
我以前从未使用ggraph过,您应该提供一个可重复的最小示例,但是请尝试以下操作:
rt_tbl %>%
mutate(centrality = centrality_authority()) %>%
ggraph(layout = 'kk') +
geom_edge_link(aes(), colour = "gray", alpha = 0.5) +
geom_node_point(aes(size = centrality, colour = centrality)) +
geom_node_text(aes(label=ifelse(centrality > .6, name, NA))) +
theme_graph(base_family = "Roboto Condensed", base_size = 13)
Run Code Online (Sandbox Code Playgroud)
您的subset-approach不起作用,因为它不在您的内部看,rt_tbl而是试图获取该对象centrality,该对象不存在。但是无论如何它都无法工作,因为您需要给它一个与数据长度相同的向量,但是子集只返回与您的条件匹配的值。因此,使用ifelse更适合您的任务。
顺便说一句,这是一个最小的可复制示例(至少我现在知道如何使用ggraph):
library(tidygraph)
library(ggraph)
rt_tble <- tidygraph::create_star(10) %>%
mutate(centrality = centrality_authority(),
name = LETTERS[1:10])
ggraph(graph = rt_tble) +
geom_edge_link() +
geom_node_point(aes(size = centrality, colour = centrality)) +
geom_node_text(aes(label = ifelse(centrality > .6, as.character(name), NA_character_)))
Run Code Online (Sandbox Code Playgroud)
我必须使用as.character(name)而不是name或levels(name)(如我之前所做的那样),也许您也必须在上述解决方案中对此进行更改...
但是关于这一点,请看下面的@Alper Yilmaz解决方案。
小智 5
这不是答案,而是对任何使用以上答案的未来访客的评论。当我levels(name)在其他网络中尝试时,结果却是错误的。tidygraph具有filter可在各种几何中用于过滤节点,边线等的属性。
因此,geom_node_text以上答案的行如果写为:
geom_node_text(aes(filter=centrality > .6, label = name))
Run Code Online (Sandbox Code Playgroud)