2016-09-30 9 views
10

Я рисую Tanglegrams в R, используя dendextend. Мне интересно, можно ли построить несколько подзаговоров, используя par(mfrow = c(2,2))?Запланировка таблеток подзаголовков в R с использованием dendextend

Я не могу понять это.

Благодаря

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) 

ответ

7

ТЛ; др: Это не представляется возможным использовать par(mfrow=...) с функцией tanglegram, но можно с помощью layout.

Объяснение: Если присмотреться к функции tanglegram, вы увидите (methods(tanglegram)), что внизу, есть несколько методов, среди которых, dendextend:::tanglegram.dendrogram, который призван привлечь tanglegram (как можно видеть внутри dendextend:::tanglegram.dendlist функция).

Внутри этой функции есть вызов layout:

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

Это «стирает» предыдущие настройки из par(mfrow=c(2, 2)) и изменяет его c(1, 3) (только для «времени» функции, хотя, потому что на конец функции, значение сбрасывается ...).

Действительно, на странице справки о layout, он говорит:

Эти функции полностью несовместимы с другими механизмами для размещения участков на устройстве: PAR (mfrow), пар (mfcol) и раскол. экран.

Вывод: Если вы хотите построить несколько tanglegrams в том же «окне» Вы должны будете использовать layout вызов (с 12 подразделы: 2 строк и 6 столбцов) перед призывами tanglegram и подавить layout вызов внутри tanglegram с использованием аргумента just_one=FALSE.

Пример рисования нескольких tanglegrams:

Используя код ниже, вы можете получить желаемый участок (я ставлю ширину функция по умолчанию для макета):

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) 

enter image description here

Это было сделано путем обновления пакета dendextend, в котором: я изменил 2 функции tanglegram.dendrogram идобавить параметр 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 и передает его на измененную функцию tanglegram.dendrogram.

+2

как быстрая альтернатива, вы можете захватить изображение и преобразовать его в объект сетки, а затем объединить. Http://stackoverflow.com/questions/27929452/r-return-corrplot-as-object/#27948707 – user20650

+1

@ user20650 Я думал об использовании 'grid', но не знал, что можно захватить изображение. Спасибо, я пропустил этот пакет, спасибо! – Cath

+1

@ user20650 хорошая идея, но решение, к которому вы ссылаетесь, не работает с tanglegram, к сожалению. Проблема заключается в том, что «grid.echo» зажимает горизонтальные дендрограммы (например,'Участок (dend51); grid.echo() 'works,' plot (dend51, horiz = TRUE); grid.echo() 'выдает ошибку), и это необходимо для преобразования изображения в объект сетки. –

4

Вместо того, чтобы создавать комбинированный график в одном графическом устройстве, вы можете создать несколько графиков и упорядочить их, когда вы поместите их в документ. Пакет 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) 
``` 

который при knit Теда HTML, будет выглядеть следующим образом:

enter image description here

Там несколько изменения, внесенные мной в код:

  • Подавленные сообщения о запуске пакета от dendextend.
  • Повышенное значение по умолчанию margin_outer, чтобы избежать наложения меток оси x из соседних участков.
  • Добавлено plot.new() между звонками tanglegram, в противном случае следующий график будет нарисован поверх предыдущего (это результат tanglegram с использованием layout и вообще не нужен при создании нескольких графиков).

Этот же подход можно использовать в файлах .Rnw. Если вы компилируете в PDF (через LaTeX), вы можете добавить заголовок и подзаголовки фигуры, см. knitr demo #067 - Graphics Options для более подробной информации.

 Смежные вопросы

  • Нет связанных вопросов^_^