Метки меток для конкретного 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))
Другие вопросы по тегам