2017-08-23 70 views
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]] 
    })) 

Error in mutate_impl(.data, dots) : Evaluation error: Cannot coerce values to character(1).

马尔科桑德里答案后编辑

使用mutate(Genus = as.character(Genus))不存在更多的错误消息,但Genus不能正确传播。例如,请参阅从右侧开始的第三个和第四个节点:父级应该是NA ...(请注意,它在博客帖子图中不起作用)。

enter image description here

回答

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]] 
    })) 
+0

谢谢你的帮助。然而,正如我在编辑中所说的那样,代码工作得不好。 – AntoineBic

+0

@MrSnake这是一个不同的新问题。现在的代码工作,但它不会给你预期的结果。我建议你关闭(不要删除)这个帖子,并在你详细描述你的问题的地方打开一个新的帖子。 –