R: печать нескольких типов графиков на одной странице

Я пытаюсь построить несколько графиков на одной странице. Я знаю такие функции, как gridExtra::grid.arrange, которые могут строить графики, сгенерированные пакетом ggplot2. Проблема, с которой я столкнулся, заключается в том, что у меня есть два графика (bar.plot и density.plot ниже), которые генерируются пакетом ggplot2, и один график, созданный с использованием функции limma::vennDiagram. Я пробовал следующее, но это не работает:

output <- paste('summary.pdf')
pdf(output,width = 25,height = 20)
par(mfrow = c(3, 3))
plot(bar.plot)
plot(density.plot)
print(vennDiagram(dat.venn, circle.col = col,cex = c(3,3,3)))
invisible(dev.off())

dat.venn — это данные типа VennCounts:

 I-H-10003-T1-D1 I-H-10003-T2-D1 I-H-10003-T3-D1 Counts
               0               0               0      0
               0               0               1     41
               0               1               0     81
               0               1               1     66
               1               0               0     10
               1               0               1      2
               1               1               0      4
               1               1               1     56
attr(,"class")
[1] "VennCounts"

Я не могу найти пакет диаграммы Венна, совместимый с функцией grid.arrange. Я не думаю, что VennCounts нельзя распечатать с помощью функции grid.arrange, а ggplot2 можно распечатать с помощью функции par.

ОБНОВЛЕНИЕ: я пытался использовать pushViewport, но он все еще печатает диаграмму Венна на следующей странице:

pdf(output,width = 25,height = 20)

# Create layout : nrow = 2, ncol = 2
pushViewport(viewport(layout = grid.layout(2, 2)))

# A helper function to define a region on the layout
define_region <- function(row, col){
  viewport(layout.pos.row = row, layout.pos.col = col)
} 

# Arrange the plots
print(bar.plot, vp = define_region(1, 1:2))
print(density.plot, vp = define_region(2, 1))
print(vennDiagram(dat.venn, circle.col = col,cex = c(3,3,3)), vp = define_region(2, 2))
dev.off()

Любая помощь приветствуется!


person Komal Rathi    schedule 09.11.2015    source источник
comment
cran.r-project.org/web/packages/gridBase/ виньетки/gridBase.pdf   -  person Roland    schedule 09.11.2015
comment
@Roland Смотрите мое обновление   -  person Komal Rathi    schedule 09.11.2015
comment
Я не вижу, где вы используете функции из пакета gridBase.   -  person Roland    schedule 09.11.2015
comment
Ссылка, которую вы мне дали, является руководством для gridBase. Я увидел несколько предложений по использованию pushViewport и воспользовался ими.   -  person Komal Rathi    schedule 09.11.2015
comment
Предложения более конкретные.   -  person Roland    schedule 09.11.2015
comment
Из-за того, что мне нужно было объединить несколько типов графиков (на основе сетки и других, таких как Excel, plotrix и т. д.), я сохранил их все как. .png, использовал функцию read.PNG пакета сетки для их загрузки, а затем преобразовывал их с помощью функции rasterGrob. Как только все графики сравнимы по формату, grid.arrange() делает свое дело.   -  person lawyeR    schedule 10.11.2015
comment
@lawyeR Большое спасибо! Это сработало!! Можете ли вы переместить свой комментарий в ответ, чтобы я мог его принять? Ваше здоровье!   -  person Komal Rathi    schedule 10.11.2015


Ответы (2)


Сначала сохраните каждый из файлов как файлы .png, например save(yourfile, file = "yourname.png").

Во-вторых, используйте функцию read.PNG пакета сетки для их загрузки, например yours.png <- readPNG("yourfile.PNG")

После этого конвертируйте их с помощью функции rasterGrob, как в g1 <- rasterGrob(yours.png, interpolate=TRUE).

Как только все графики сравнимы по формату, grid.arrange() делает свое дело. Это может выглядеть так:

grid.arrange(g1, g2, g3, nrow=1)  # one row
dev.copy(png,'threeplots.png')   # to save the array of plots     
dev.off()                         # to close the device
person lawyeR    schedule 10.11.2015

Пакет gridGraphics, как и gridBase, позволяет довольно просто смешивать сетку, ggplot, решетку и базовую графику. Функция grid.echo() преобразует базовую графику в графику сетки. (Преимущество использования gridGraphics заключается в том, что базовая графика становится доступной для редактирования и модификации через grid; см. gridGraphics.pdf.)

Далее я рисую два ggplot и диаграмму Венна (взятые для страницы справки vennDiagram в пакете limma) и размещаю три графика в окнах просмотра, следя за тем, чтобы график диаграммы Венна подвергался обработке grid.echo.

ОБНОВИТЬ до ggplot2 2.0.0 (по умолчанию stat для geom_bar – stat = "count")

  library(ggplot2)
  library(gridGraphics)
  library(grid)
  library(limma)  # From bioC software repository

  grid.newpage()

  # Position 1st ggplot
  pushViewport(viewport(y = 1, height = 1/3, just = "top"))
  gg1 <- ggplot(mtcars, aes(x = mpg)) + geom_density()  
  print(gg1, newpage = FALSE)
  upViewport()

  # Position 2nd ggplot
  pushViewport(viewport(y = .5, height = 1/3, just = "centre"))
  gg2 <- ggplot(mtcars, aes(x = factor(carb, levels = 1:8))) + 
          geom_bar() + scale_x_discrete(drop = FALSE)
  print(gg2, newpage = FALSE)
  upViewport()

  # Function to draw venn diagram - the venn diagram is taken from ?vennDiagram
  plotfun <- function() {   
   Y <- matrix(rnorm(100*6),100,6)
   Y[1:10,3:4] <- Y[1:10,3:4]+3
   Y[1:20,5:6] <- Y[1:20,5:6]+3
   design <- cbind(1,c(0,0,1,1,0,0),c(0,0,0,0,1,1))
   fit <- eBayes(lmFit(Y,design))
   results <- decideTests(fit)
   a <- vennCounts(results)
   print(a)
   mfrow.old <- par()$mfrow
   par(mfrow=c(1,2))
   vennDiagram(a)
   vennDiagram(results, 
       include=c("up", "down"),
       counts.col=c("red", "blue"),
       circle.col = c("red", "blue", "green3"))
  }

  # Position the venn diagram
  pushViewport(viewport(y = 0, height = 1/3, just = "bottom"))
  grid.echo(plotfun, newpage = FALSE)
  upViewport(0)

введите здесь описание изображения

person Sandy Muspratt    schedule 23.11.2015