从URL读取PNG并添加至patchwork绘图时遇'as_patch'方法错误
解决patchwork中inset_element添加URL图片报错的问题
问题根源
readPNG()读取URL图片后返回的是数组格式,但inset_element()要求输入是ggplot对象、patch对象或其他可转换为patch的对象,数组无法被识别,因此报错no applicable method for 'as_patch' applied to an object of class "c('array', 'double', 'numeric')"。
解决方案
需要先将PNG数组转换为grid图形对象,再包装成patchwork可识别的对象,以下两种方法都可行:
方法1:用wrap_elements()直接包装图形对象
library(tidyverse) library(patchwork) library(RCurl) library(grid) # 加载grid包处理图形对象 dat <- data.frame( x = 1:10, y = 1:10 ) list_of_url_logos <- cfbfastR::cfbd_team_info() %>% select(school, logo) my_url <- head(list_of_url_logos$logo, 1) # 读取图片为数组 my_image <- png::readPNG(getURLContent(my_url)) # 将数组转换为grid图形对象 img_grob <- rasterGrob(my_image, interpolate = TRUE) # 创建基础绘图 p1 <- ggplot(dat, aes(x = x, y = y)) + geom_point() p2 <- ggplot(dat, aes(x = x, y = y)) + geom_line() # 用wrap_elements包装grob,再传入inset_element p1 / p2 + inset_element(wrap_elements(img_grob), left = 0.6, bottom = 0.6, right = 1, top = 1, align_to = "full")
方法2:用ggplot+annotation_custom()创建空图
library(tidyverse) library(patchwork) library(RCurl) library(grid) dat <- data.frame( x = 1:10, y = 1:10 ) list_of_url_logos <- cfbfastR::cfbd_team_info() %>% select(school, logo) my_url <- head(list_of_url_logos$logo, 1) my_image <- png::readPNG(getURLContent(my_url)) img_grob <- rasterGrob(my_image, interpolate = TRUE) # 创建仅包含图片的空ggplot(去掉坐标轴等元素) img_plot <- ggplot() + annotation_custom(img_grob, xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf) + theme_void() p1 <- ggplot(dat, aes(x = x, y = y)) + geom_point() p2 <- ggplot(dat, aes(x = x, y = y)) + geom_line() # 传入inset_element p1 / p2 + inset_element(img_plot, left = 0.6, bottom = 0.6, right = 1, top = 1, align_to = "full")
关键说明
rasterGrob():将PNG数组转换为grid图形对象,interpolate=TRUE参数可让图片缩放时更平滑。wrap_elements():直接将grid图形对象转换为patchwork兼容的patch对象,无需额外创建ggplot。theme_void():用于移除空ggplot的坐标轴、背景等冗余元素,避免影响主图布局。
内容的提问来源于stack exchange,提问作者user13973103
相关产品推荐
相关产品推荐

