使用Dendestend绘制R中的子地块

使用Dendestend绘制R中的子地块,r,plot,visualization,dendrogram,dendextend,R,Plot,Visualization,Dendrogram,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(

我正在用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)
库(Dendestend)
密度15%dist%%>%hclust(method=“average”)%%>%as.dengram
密度15%集(“标签到字符”)
dend51%集(“标签”,如.character(5:1))%>%按标签匹配顺序(dend15)

密度15μ51tl;dr:不可能将
par(mfrow=…)
与函数
tanglegram
一起使用,但可以使用
布局

解释:如果你仔细观察函数
tanglegram
,你会看到(
方法(tanglegram)
)下面有几个方法,其中,
dendextend:::tanglegram.dengram
,它被调用来绘制tanglegram(可以在
dendextend:::tanglegram.dendlist
函数中看到)

在这个函数中,有一个对布局的调用:

layout(matrix(1:3, nrow = 1), widths = columns_width) 
这将“擦除”您以前的
par设置(mfrow=c(2,2))
,并将其更改为
c(1,3)
(仅用于函数的“时间”,因为在函数结束时,该值被重置…)

实际上,在
布局的帮助页面中,它说:

这些功能与在设备上安排绘图的其他机制完全不兼容:par(mfrow)、par(mfcol)和split.screen

结论:如果要在同一个“窗口”中绘制多个Tanglegram,则需要使用
布局
调用(有12个子部分:2行6列)在调用
tanglegram
之前,使用参数
just_one=FALSE
tanglegram
内部抑制
layout
调用

绘制多个图形的示例:

使用下面的代码,您可以获得所需的绘图(我将函数的默认宽度用于布局):

这是通过更新dendextend包来实现的,其中:我修改了两个函数
tanglegram.dengram
tanglegram.dendlist
,添加一个
仅一个
参数,该参数默认为
TRUE
,并将
tanglegram.dengram
中的
布局的行更改为:

 if (just_one) layout(matrix(1:3, nrow = 1), widths = columns_width)

我还抑制了
par
参数的重置,当然在
tanglegram.dendlist
中更改了调用(现在称为
tanglegram.dendlist\u mod
)因此,它调用新的修改函数,将
仅包含一个
参数,并将其传递给修改后的
tanglegram.dendrogram
函数。

与在单个图形设备中创建组合图不同,您可以创建多个图,并在将它们放入文档时对其进行排列。
knitr
包通过使用
fig.show=“hold”
保留在单个R区块中生成的多个绘图,并指定相关的
out.width
,例如,当绘图放置在文档中时,将50%设置为一行有两个绘图,可以轻松实现这一点

例如,在R标记(
.Rmd
)文件中,您可能有

```{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)
```
`{r,fig.show=“hold”,out.width=“50%”,echo=FALSE}
suppressPackageStartupMessages(库(DendExtrend))
密度15%dist%%>%hclust(method=“average”)%%>%as.dengram
密度15%集(“标签到字符”)
dend51%集(“标签”,如.character(5:1))%>%按标签匹配顺序(dend15)

dends_15_51作为一个快速的替代方案,你可以抓取图像,并将其转换为网格对象,然后进行合并。@user20650我曾想过使用
网格
,但不知道可以抓取图像。我一直缺少这个包,谢谢!@user20650好主意,但不幸的是,你链接到的解决方案不适用于tanglegram。问题在于eems是水平树状图上的
grid.echo
阻塞(例如
plot(dend51);grid.echo()
工作,
plot(dend51,horiz=TRUE);grid.echo()
抛出错误)这是将图像转换为网格对象所必需的。可惜网格方法在这里不起作用-在这种情况下,修改
tangle。树状图
可能更简单。注意,作为创建
\u mod
函数的替代方法,您可以使用
fixInNamespace(tangle.dendrogram,“Dendex”)
要进行更改,则可以直接将
tanglegram
与新的
just_one
参数一起使用。HI@Cath是否要对此添加进行拉取请求?
```{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)
```