Метки меток для конкретного geom_node_text
Я пытаюсь построить график сети и показать только метки для 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)
Я сталкиваюсь со следующей ошибкой:
Error in subset(centrality > 100) : object 'centrality' not found
Мои данные выглядят так:
# 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
2 ответа
Я никогда не пользовалась 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)
Ваш subset
-подход не работает, потому что он не заглядывает внутрь вашего 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, levels(name), NA)))
Я должен был использовать levels(name)
вместо name
, может быть, вам придется изменить это в моем решении выше...
Это не ответ, а комментарий для любого будущего посетителя, использующего ответ выше. Когда я пытался levels(name)
в разных сетях это дало ошибочные результаты. tidygraph
имеет filter
свойство, которое можно использовать в различных геометриях для фильтрации узлов, ребер и т. д.
Итак geom_node_text
строка ответа выше должна работать лучше, если написано как:
geom_node_text(aes(filter=centrality > .6, label = name))