你的maptree还好吗?
写在前面:
今天启程回家,但是加我好友的人应该看到,今天确实太惨了,坐一整晚回去,这篇推送也是全程在火车上使用手机编辑出来的,希望能帮到大家。
到目前已经有三维热心网友给我反馈过这个问题了,就是maptree出图会重叠。
这是我使用其中一位网友的数据出图:大家可以看到,我框起来的地方确实发生的重叠。
我对这个问题进行一个具体的描述:首先在我们的示例数据中是没有问题的,很多数据也都没有问题,但是有三个网友发过来的数据都存在问题,绘制数量少一些otu还好,比较多,比如400,500个otu之后就会出现圈重叠的情况。
接在宏基因组推送的代码:
#按照平均丰度修改大小和按照门水平上色颜色
mapadd = maptree_add1_plot(mapdata)
p2 = mapadd[[1]]
p2
为什么会出现这个问题呢?这是在运行我的函数:maptree_add1_plot出现的问题。
我开始解析代码?
首先我观察到这个问题在变形菌门中出现,所以我嫁给你注释信息取子集直接到变形菌门的Gammaproteobacteria纲中。
ps_sub = ps_sub %>%
subset_taxa(
Class == "Gammaproteobacteria"
)
ps_sub
这里共有17个OTU,当我过滤出来的时候使用data_to_maptree出图,发现并没有问题,当然此时没有设置权重。
此时我们继续运行函数:maptree_add1_plot。发现就出现错误了
我去寻找那几个菌出现错误:
结果是如图所示的菌出现了重叠,进一步看他们的坐标和半径,发现确实是有重叠的范围,那么这个问题就是算法问题吗?
我打开了算法:这里有些函数我看不懂!也就是我没办法重现算法,希望动这个split这个算法的同志可以给一些帮助。由于算法没有什么进展,所以我做了一些枝枝叶叶的工作,想的也是给大家一些别的方法来减少这个错误。
layout_tbl_graph_treemap <- function(graph, algorithm = 'split', weight = NULL, circular = FALSE, sort.by = NULL, direction = 'out', height = 1, width = 1) {
weight <- enquo(weight)
weight <- eval_tidy(weight, .N())
sort.by <- enquo(sort.by)
sort.by <- eval_tidy(sort.by)
hierarchy <- tree_to_hierarchy(graph, direction, sort.by, weight)
layout <- switch(
algorithm,
split = splitTreemap(hierarchy$parent, hierarchy$order, hierarchy$weight, width, height),
stop('Unknown algorithm')
)[-1, ]
layout <- new_data_frame(list(
x = layout[, 1] + layout[, 3] / 2,
y = layout[, 2] + layout[, 4] / 2,
width = layout[, 3],
height = layout[, 4],
circular = FALSE,
leaf = degree(graph, mode = direction) == 0,
depth = node_depth(graph, mode = direction)
))
extra_data <- as_tibble(graph, active = 'nodes')
layout <- cbind(layout, extra_data[, !names(extra_data) %in% names(layout), drop = FALSE])
layout
}
当修改weight值的时候,重叠就会发生改变,或许会消失。在
所以我怀疑这个算法对于不同的数据会出现错误。为了尽可能避免这个算法问题,也想通过旁敲侧击来了解一下这个算法的特征,我进行了许多操作:
由于问题出在weight,也就是说有些子圈的半径大于父圈,这样出现大量覆盖和重叠,这在我导出的数据中可以看到。所以在我手动将这些子圈半径条小之后再做就会解决,但是智能在少部分数据问题的情况下完成。
对于weight我进行了各种不同的转化,可以通过计算平方根来缩小weigth值之间的差异,会改善重叠情况。
将weight转化为秩次也可以部分解决这个问题。
但是以上两种方式都是治标不治本,不能从根本解决这个问题。归根结底我目前认为是split算法问题,ggraph作者在帮助文档中提到还有两种算法在开发中,我想快点开发出来吧。或者去github上问问。