use*_*089 10 plot visualization r dendrogram dendextend
我正在使用dendextend在R中绘制Tanglegrams.我想知道是否有可能使用多个子图par(mfrow = c(2,2))?
我似乎无法弄明白.
谢谢
library(dendextend)
dend15 <- c(1:5) %>% dist %>% hclust(method = "average") %>% as.dendrogram
dend15 <- dend15 %>% set("labels_to_char")
dend51 <- dend15 %>% set("labels", as.character(5:1)) %>% match_order_by_labels(dend15)
dends_15_51 <- dendlist(dend15, dend51)
par(mfrow = c(2,2))
tanglegram(dends_15_51)
tanglegram(dends_15_51)
tanglegram(dends_15_51)
tanglegram(dends_15_51)
Run Code Online (Sandbox Code Playgroud)
tl; dr:不能使用par(mfrow=...)该功能tanglegram,但可以使用layout.
说明:如果你仔细观察函数tanglegram,你会看到(methods(tanglegram))下面有几个方法,其中有一些方法dendextend:::tanglegram.dendrogram被调用来绘制tanglegram(在dendextend:::tanglegram.dendlist函数内部可以看到).
在此功能中,有一个调用layout:
layout(matrix(1:3, nrow = 1), widths = columns_width)
Run Code Online (Sandbox Code Playgroud)
这会"删除"您之前的设置par(mfrow=c(2, 2))并将其更改为c(1, 3)(仅适用于函数的"时间",因为在函数结束时,值会重置...).
实际上,在帮助页面中layout,它说:
这些功能与在设备上排列图的其他机制完全不兼容:par(mfrow),par(mfcol)和split.screen.
结论:如果你想在同一个"窗口"中绘制几个tanglegrams,你需要在layout调用之前使用调用(有12个子部分:2行和6列)tanglegram并使用参数抑制layout内部tanglegram调用just_one=FALSE.
绘制几个tanglegrams的示例:
使用下面的代码,您可以获得所需的绘图(我为布局设置了函数的默认宽度):
layout(matrix(1:12, nrow=2, byrow=TRUE), widths=rep(c(5, 3, 5), 2))
tanglegram.dendlist_mod(dends_15_51, just_one=FALSE)
tanglegram.dendlist_mod(dends_15_51, just_one=FALSE)
tanglegram.dendlist_mod(dends_15_51, just_one=FALSE)
tanglegram.dendlist_mod(dends_15_51, just_one=FALSE)
Run Code Online (Sandbox Code Playgroud)
这是通过更新dendextend包完成的,其中:我修改了2个函数tanglegram.dendrogram并tanglegram.dendlist添加了一个just_one参数,默认为TRUE并将layoutin 的行更改tanglegram.dendrogram为:
if (just_one) layout(matrix(1:3, nrow = 1), widths = columns_width)
Run Code Online (Sandbox Code Playgroud)
我还抑制了par参数的重置,当然也改变了调用tanglegram.dendlist(现在调用tanglegram.dendlist_mod),因此调用新的修改函数,合并just_one参数并将其传递给修改后的tanglegram.dendrogram函数.