Управление размещением фигур с помощью функции knitr:: include_graphics

Я использую следующий код в файле *.Rmd для вывода ниже:

```{r gb, echo=F, eval=T, results='asis', cache.rebuild=T, fig.cap='bla', out.width='0.7\\linewidth', fig.subcap=c('bla.', 'Using the \\textit{normalizeChIPToInput} function. THis method doesn not require to compute a enrichment ratio.')}
p1 <- file.path(FIGDIR, 'correlK27K9me3.png')
p2 <- file.path(FIGDIR, 'correlK27K9me3.png')
knitr::include_graphics(c(p1,p2))
```

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

Я хотел бы вертикально стекать два графика вместо того, чтобы показывать их бок о бок без отдельных вызовов include_graphics (которые не работают с подзаголовками) и без необходимости размещать их отдельно chuncks. Возможно ли это без манипулирования латексным кодом?

В более общем плане, возможно ли каким-либо образом указать макет для графиков, включенных в приведенный выше способ, например: "Дайте мне сетку 2x2 для 4 изображений, которые я передаю функции include_graphics?

Ответ 1

Вместо:

knitr::include_graphics(c(p1,p2))

Как насчет этого:

cowplot::plot_grid(p1, p2, labels = "AUTO", ncol = 1, align = 'v')

Это будет работать внутри {r}, но я не уверен, как он будет работать, учитывая конфигурацию/настройку вашего chunk.

Ответ 2

Это не самое опрятное решение проблемы, но небольшое обходное решение с использованием функций gridarrange и text в R.

Поток процесса: read_images → преобразуется в сетку → читать изображение сетки → add_text → final_save

```{r fig.align='center', echo=FALSE, fig.cap="Figure 1 : foo", warning=FALSE, message=FALSE}
library(png)
library(grid)
library(gridExtra)

#Loading images
img0 <- readPNG("heatMap.png")
img1 <- readPNG("heatMap.png")
img2 <- readPNG("heatMap.png")
img3 <- readPNG("heatMap.png")

#Convert images to Grob (graphical objects)
grob0 <- rasterGrob(img0)
grob1 <- rasterGrob(img1)
grob2 <- rasterGrob(img2)
grob3 <- rasterGrob(img3)

png(filename = "gridPlot.png", width = 1200, height = 716)

grid.arrange(grob0, grob1, grob2, grob3, nrow = 2)

invisible(dev.off())

gridplot.0 <- readPNG("gridPlot.png")
h<-dim(gridplot.0)[1]
w<-dim(gridplot.0)[2]

png(filename = "gridPlotFinal.png", width = 1200, height = 716)

#adding text to image (refer to https://stackoverflow.com/a/23816416/6779509)

par(mar=c(0,0,0,0), xpd=NA, mgp=c(0,0,0), oma=c(0,0,0,0), ann=F)
plot.new()
plot.window(0:1, 0:1)

#fill plot with image
usr<-par("usr")    
rasterImage(gridplot.0, usr[1], usr[3], usr[2], usr[4])

#add text
text("plot1", x=0.25, y=0.50)
text("plot2", x=0.75, y=0.50)
text("plot3", x=0.23, y=0.0)
text("plot4", x=0.77, y=0.0)

invisible(dev.off())

gridplot <- file.path("gridPlotFinal.png")
knitr::include_graphics(gridplot)
```

Выход: plot