I am plotting Tanglegrams in R using dendextend. I am wondering if it is possible to plot multiple subplots using par(mfrow = c(2,2))
?
I can't seem to figure it out.
Thanks
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)
tl;dr: It is not possible to use par(mfrow=...)
with the function tanglegram
, but it is possible using layout
.
Explanation: If you look closer at function tanglegram
, you'll see (methods(tanglegram)
) that, underneath, there are several methods, among which, dendextend:::tanglegram.dendrogram
which is called to draw the tanglegram (as can be seen inside dendextend:::tanglegram.dendlist
function).
Inside this function, there is a call to layout
:
layout(matrix(1:3, nrow = 1), widths = columns_width)
This "erases" your previous setting of par(mfrow=c(2, 2))
and changes it to c(1, 3)
(just for the "time" of the function though because at the end of the function, the value is reset...).
Indeed, in the help page of layout
, it says:
These functions are totally incompatible with the other mechanisms for arranging plots on a device: par(mfrow), par(mfcol) and split.screen.
Conclusion: If you want to plot several tanglegrams in the same "window" you'll need to use the layout
call (with 12 subparts: 2 rows and 6 columns) ahead of the calls to tanglegram
and suppress the layout
call inside tanglegram
using the argument just_one=FALSE
.
Example of drawing several tanglegrams:
Using the code below, you can then obtain the desired plot (I put the function's default widths for the layout):
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)
This was done by updating the dendextend package in which: I modified the 2 functions tanglegram.dendrogram
and tanglegram.dendlist
to add a just_one
parameter, which defaults to TRUE
and changed the line of the layout
in tanglegram.dendrogram
to:
if (just_one) layout(matrix(1:3, nrow = 1), widths = columns_width)
I also suppressed the reset of par
parameters and of course changed the call in tanglegram.dendlist
(now called tanglegram.dendlist_mod
) so it calls the new modified function, incorporates the just_one
parameter and passes it to the modified tanglegram.dendrogram
function.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With