2015-11-09 2 views
3

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

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.

UPDATE: Я попытался с помощью 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() 

Любая помощь будет высоко ценится!

+1

https://cran.r-project.org/web/packages/gridBase/vignettes /gridBase.pdf – Roland

+0

@Roland См. мое обновление –

+1

Я не вижу, где вы используете функции из пакета gridBase. – Roland

ответ

3

Сначала сохраните каждый из файлов в виде .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 
2

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

В дальнейшем, я сделать два ggplots и диаграмма Венна (взятый для страницы vennDiagram помощи в limma пакете), и я помещаю три графика в видовые экраны, убедившись, что график диаграммы venn подвергается обработке grid.echo.

UPDATE для 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) 

enter image description here

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