
开发
ggtree就是我的使命!
可交互这个功能是GISAID的创始人Peter Bogner和我提出来的,我们拉了个线上Zoom会议,聊了聊。于是我和双斌就着手来做这下事情。
当我们做了个demo,发给他们的时候,跟我说,两周后WHO要开会选疫苗株,他们把数据整理了发我,我来帮他们画。

这时候,我基本上就有求必应,乃至于说加班加点也要帮他们弄了。因为可以说,这是在给世界做贡献。
ggtree的交互,出现得悄无声息
library(ggtree)
set.seed(123)
tr <- rtree(20)
# 这是静态的,和原来一样
p <- ggtree(tr)
# 交互开关,这第二个p,是可交互的图了
ggtree_set_interactive()
p
就是这么简单,这是一个截图,所以看不出啥,但我们从红色框出来的地方,可以看到,这是一张html的【可交互】的图。
当然这张图,事实上我们没有任何可交互的设置,它其实是没有交互元素的可交互图,有点绕口,但差不多可以说,搞了个寂寞。
但它就是这么简单,有个开关,你开了,是交互的,关了,是静态的。你感觉不到它的存在。这就是我们所追求的,极致的简单,没有学习成本。
就这个事情,双斌给我提了意见,说搞个寂寞这种,要给个warning。
我给他的回复就是,搞个寂寞在某个场景下,或者是有用的。我再加个开关,可以关掉warning。

没错,我们就是这么细节控,这样才做到了,呈现给大家的是极致的简单。
怎么样可交互?
你基本上只需要知道,加多了两个映射,就可以了:
data_id为图形元素分配唯一标识符,用于JavaScript回调函数的元素识别,实现交互功能。tooltip为图形元素添加鼠标悬停提示框,当鼠标悬停时,显示自定义信息。
核心就这些,其它的以后再讲。
让我们来看一个真正的可交互图:
p2 <- ggtree(
tr,
mapping = aes(
tooltip = round(branch.length, 2),
data_id = node
)
)
p2代码简单吧,显示的信息是保留两个小数点的分支长度。
鼠标悬停,信息出现,就这样简单。
然后我们照常加图层,你可以在多个图层都设置有悬停,都是可以的。
dt <- data.frame(id = c(36, 38), type=c("A", "B"))
p3 <- p2 +
geom_hilight(
data = dt,
mapping = aes(
node = id,
fill = type,
tooltip = paste0("clade of node ", id),
data_id = type
),
to.bottom = TRUE
)
p3
眼尖的你可能发现,这张截图,高亮的区域和legend对应不上,其实是对着的,没有问题。你看到的不一样,是因为我截图的是鼠标正好悬停在上面,鼠标悬停会高亮相应的图形元素,就像上一张图,在分支上,那个分支就有了颜色一样,所以相当于叠多了个颜色,就看着不一样。当我们把鼠标移开之后,它就是原来的颜色,是一模一样的。
然后可交互图,一般不是只给你导出PNG, SVG这些,不给保存PDF?
让我们把交互特性给关了。
ggtree_unset_interactive()
p3
这就是美妙之处,零学习成本,静态与交互,随意切换。