使用 PNG/JPEG 图像创建多面板图形

jl7*_*795 5 png jpeg r image ggplot2

问题:

我想使用 PNG 或 JPEG 图像制作多面板图形。这些图像不是在 R 中创建的,但我想在 R 中将它们拼凑在一起以形成一个图形。所有图像的尺寸/尺寸相同。

我尝试过的:

library(png)

img1 <- readPNG("filepath/img1.png")
img2 <- readPNG("filepath/img2.png")

library(patchwork)

patch <- img1 + img2
patch
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我收到以下错误:

[ reached getOption("max.print") -- omitted 3 matrix slice(s) ]
Run Code Online (Sandbox Code Playgroud)

我多次增加了最大打印量(达到高得离谱):

options(maxprint = 1000000000000)
Run Code Online (Sandbox Code Playgroud)

但仍然遇到同样的错误。

然后我尝试使用以下方法将每个图像制作成 ggplot (没有点):

library(ggplot2)

img1plot <- ggplot() + 
background_image(img1) +
theme(plot.margin = margin(t=1, l=1, r=1, b=1, unit = "cm"))
Run Code Online (Sandbox Code Playgroud)

返回以下错误:

Error in background_image(d311) : 
  could not find function "background_image"
Run Code Online (Sandbox Code Playgroud)

有没有另一种方法可以在 R 中将图像拼凑在一起以制作图形?

编辑:

根据@davidnortes的评论,我尝试了以下方法:

p1 <- ggplot2::annotation_custom(grid::rasterGrob(img1,
                                            width=ggplot2::unit(1,"npc"),
                                            height=ggplot2::unit(1,"npc")),
                           -Inf, Inf, -Inf, Inf)

p2 <- ggplot2::annotation_custom(grid::rasterGrob(img2,
                                                  width=ggplot2::unit(1,"npc"),
                                                  height=ggplot2::unit(1,"npc")),
                               -Inf, Inf, -Inf, Inf)


library(cowplot)

plots <- plot_grid(
  p1, p2,
  labels = c('A', 'B'),
  align="hv"
)
plots
Run Code Online (Sandbox Code Playgroud)

我收到以下警告消息,但绘图未形成:

Warning messages:
1: In as_grob.default(plot) :
  Cannot convert object of class LayerInstanceLayerggprotogg into a grob.
2: In as_grob.default(plot) :
  Cannot convert object of class LayerInstanceLayerggprotogg into a grob.
Run Code Online (Sandbox Code Playgroud)

dav*_*tes 5

我为您提供了我最常用的几种替代方案:

替代方案1 : ggplot2、grid和cowplot的组合。

每个 PNG 图像都可以使用以下方法嵌入到 ggplot 对象中:

ggplot2::ggplot() + ggplot2::annotation_custom(grid::rasterGrob(YourPNGimage,
                                                width=ggplot2::unit(1,"npc"),
                                                height=ggplot2::unit(1,"npc")),
                               -Inf, Inf, -Inf, Inf)
Run Code Online (Sandbox Code Playgroud)

然后你可以用来cowplot::plot_grid()安排你的情节。

替代方案 2:使用magick包。

该包依靠自己的函数来读取图像,因此我们需要稍微调整一下您的代码:

img1 <- magick::image_read("filepath/img1.png")
img2 <- magick::image_read("filepath/img2.png")
Run Code Online (Sandbox Code Playgroud)

然后使用类似的函数magick::image_append(c(img1, img2))可以将它们组合起来。有关详细信息,请参阅magick 包文档。

  • 我当时没有解释自己。我的意思是,作为一种解决方法,您可以使用 *image_append()* 创建行,将它们存储为 magick 图像对象。然后用 *image_append(c(row1,row2,...,row n), stack = TRUE)* 堆叠这些对象 (2认同)