使用dendextend

时间:2016-09-30 06:06:51

标签: r plot visualization 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)

2 个答案:

答案 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

enter image description here

这是通过更新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时,如下所示:

enter image description here

我对代码进行了一些修改:

  • 来自margin_outer
  • 的抑制包启动消息
  • 增加默认plot.new()以避免来自相邻地块的x轴标签重叠。
  • 在对tanglegram的调用之间添加了tanglegram,否则下一个绘图将绘制在前一个绘图之上(这是layout使用.Rnw的结果在制作多个地块时通常不需要这样做。)

可以在{{1}}文件中使用相同的方法。如果您正在编译为PDF(通过LaTeX),您可以添加数字标题和子标题,有关详细信息,请参阅knitr demo #067 - Graphics Options