我正在使用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)
答案 0 :(得分:8)
tl; dr:无法将par(mfrow=...)
与函数tanglegram
一起使用,但可以使用layout
。
说明:如果您仔细查看功能tanglegram
,您会看到(methods(tanglegram)
)下面有几种方法,其中包括{ {1}}被调用来绘制纠缠图(在dendextend:::tanglegram.dendrogram
函数中可以看到)。
在此功能中,可以调用dendextend:::tanglegram.dendlist
:
layout
这&#34;擦除&#34;您先前的layout(matrix(1:3, nrow = 1), widths = columns_width)
设置并将其更改为par(mfrow=c(2, 2))
(仅适用于函数的&#34;时间&#34;但因为在函数结束时,值会重置...) 。
确实,在c(1, 3)
的帮助页面中,它说:
这些功能与在设备上排列图的其他机制完全不兼容:par(mfrow),par(mfcol)和split.screen。
结论:如果你想在同一个&#34;窗口&#34;中绘制几个纠结图。在调用layout
之前,您需要使用layout
调用(包含12个子部分:2行和6列),并禁止tanglegram
内的layout
调用使用参数tanglegram
。
绘制多个纠结图的示例:
使用下面的代码,您可以获得所需的绘图(我为布局设置了函数的默认宽度):
just_one=FALSE
这是通过更新dendextend软件包完成的,其中:我修改了2个函数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)
和tanglegram.dendrogram
以添加tanglegram.dendlist
参数,默认为just_one
并更改TRUE
中的layout
行:
tanglegram.dendrogram
我还禁止重置 if (just_one) layout(matrix(1:3, nrow = 1), widths = columns_width)
参数,当然也改变了par
(现在称为tanglegram.dendlist
)中的调用,因此调用了新的修改函数,并合并了tanglegram.dendlist_mod
}参数并将其传递给修改后的just_one
函数。
答案 1 :(得分:4)
您可以创建多个图并在将它们放入文档时进行排列,而不是在单个图形设备中创建组合图。 knitr
包可以轻松完成此操作,方法是使用fig.show = "hold"
保留单个R块中生成的多个绘图并指定相关的out.width
,例如.Rmd
。 50%连续两个图,用于将图放在文档中。
例如,在R markdown(```{r, fig.show = "hold", out.width = "50%", echo = FALSE}
suppressPackageStartupMessages(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)
tanglegram(dends_15_51, margin_outer = 1)
plot.new()
tanglegram(dends_15_51, margin_outer = 1)
plot.new()
tanglegram(dends_15_51, margin_outer = 1)
plot.new()
tanglegram(dends_15_51, margin_outer = 1)
```
)文件中,您可能有
knit
当dendextend
加入HTML时,如下所示:
我对代码进行了一些修改:
margin_outer
。plot.new()
以避免来自相邻地块的x轴标签重叠。tanglegram
的调用之间添加了tanglegram
,否则下一个绘图将绘制在前一个绘图之上(这是layout
使用.Rnw
的结果在制作多个地块时通常不需要这样做。)可以在{{1}}文件中使用相同的方法。如果您正在编译为PDF(通过LaTeX),您可以添加数字标题和子标题,有关详细信息,请参阅knitr
demo #067 - Graphics Options。