tl;dr:不能par(mfrow=...)
与函数一起使用tanglegram
,但可以使用layout
。
解释:如果你仔细看 function tanglegram
,你会看到 ( methods(tanglegram)
) ,在下面,有几个方法,其中,dendextend:::tanglegram.dendrogram
调用它来绘制缠结图(可以在dendextend:::tanglegram.dendlist
function 内部看到)。
在这个函数内部,有一个调用layout
:
layout(matrix(1:3, nrow = 1), widths = columns_width)
这会“擦除”您之前的设置par(mfrow=c(2, 2))
并将其更改为c(1, 3)
(仅针对函数的“时间”,因为在函数结束时,值被重置......)。
确实,在 的帮助页面中layout
,它说:
这些函数与在设备上安排绘图的其他机制完全不兼容:par(mfrow)、par(mfcol) 和 split.screen。
结论:如果你想在同一个“窗口”中绘制多个缠结图,你需要在layout
调用之前使用调用(有 12 个子部分:2 行和 6 列)并使用参数tanglegram
抑制layout
内部调用。tanglegram
just_one=FALSE
绘制多个缠结图的示例:
使用下面的代码,您可以获得所需的绘图(我将函数的默认宽度用于布局):
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)
这是通过更新 dendextend 包完成的,其中: 我修改了 2 个函数tanglegram.dendrogram
并tanglegram.dendlist
添加了一个just_one
参数,该参数默认为TRUE
并将layout
in的行更改tanglegram.dendrogram
为:
if (just_one) layout(matrix(1:3, nrow = 1), widths = columns_width)
我还抑制了par
参数的重置,当然还更改了调用tanglegram.dendlist
(现在称为tanglegram.dendlist_mod
),因此它调用了新的修改函数,合并了just_one
参数并将其传递给修改后的tanglegram.dendrogram
函数。