Управление размещением фигур с помощью функции 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]()