用tidygraph传播儿童的价值

问题描述 投票:1回答:1

我有一个在属级别注释的树(即每个叶子都有一个名称),我想在树枝/边缘传播叶子的颜色,只要这些孩子具有相同的属,就像在这个图中:

enter image description here

Source

我的树是here(对不起,dput不起作用......)他看起来像那样:

library(ggraph)
library(tidygraph)
load("tree_v3")

TBL %>% activate(nodes) %>% as_tibble
# A tibble: 50 x 2
    leaf      Genus
   <lgl>     <fctr>
 1 FALSE         NA
 2  TRUE Klebsiella
 3  TRUE Klebsiella
 4 FALSE         NA
 5  TRUE Klebsiella
 6  TRUE Klebsiella
 7 FALSE         NA
 8 FALSE         NA
 9  TRUE Klebsiella
10 FALSE         NA
# ... with 40 more rows

我可以使用此代码打印树,但正如您所看到的,边缘颜色保持在叶子附近。

TBL %>%
  ggraph('dendrogram') + 
  theme_bw() +
  geom_edge_diagonal2(aes(color = node.Genus)) +
  scale_edge_color_discrete(guide = FALSE) +
  geom_node_point(aes(filter = leaf, color = Genus), size = 2)

enter image description here

在这个blog post上的搜索映射部分中有一个代码,但它对我的数据不起作用,我不明白为什么......

TBL2 <- TBL %>%
  activate(nodes) %>%
  mutate(Genus = map_bfs_back_chr(node_is_root(), .f = function(node, path, ...) {
    nodes <- .N()
    if (nodes$leaf[node]) return(nodes$Genus[node])
    if (anyNA(unlist(path$result))) return(NA_character_)
    path$result[[1]]
  }))

mutate_impl(.data,dots)出错:评估错误:无法将值强制转换为字符(1)。

在Marco Sandri回答后编辑

使用mutate(Genus = as.character(Genus))没有更多的错误消息,但Genus没有正确传播。例如,从右边开始看第三个和第四个节点:父节点应该是NA ...(注意它在博客文章中都不起作用)。

enter image description here

r tidyverse dendrogram ggraph tidygraph
1个回答
2
投票

GenusTBL是一个因素:

str(TBL %>% activate(nodes) %>% as_tibble)

# Classes ‘tbl_df’, ‘tbl’ and 'data.frame':       50 obs. of  2 variables:
# $ leaf : logi  FALSE TRUE TRUE FALSE TRUE TRUE ...
# $ Genus: Factor w/ 10 levels "","Citrobacter",..: NA 6 6 NA 6 6 NA NA 6 NA ...

但应该是一个角色。 将Genus从因子转换为字符后,代码可以正常工作。

TBL2 <- TBL %>%
  activate(nodes) %>% 
  mutate(Genus = as.character(Genus)) %>%
    mutate(Species = map_bfs_back_chr(node_is_root(), .f = function(node, path, ...) {
        nodes <- .N()
        if (nodes$leaf[node]) return(nodes$Genus[node])
        if (anyNA(unlist(path$result))) return(NA_character_)
        path$result[[1]]
    }))
© www.soinside.com 2019 - 2024. All rights reserved.