r - 使用annotation_custom以编程方式在ggplot上定位图像

标签 r ggplot2 grob

我正在尝试创建一个函数(在 R 包内),将图像添加到 ggplot 的右下角。由于这将包含在 R 包中,因此我希望此函数以编程方式将该图像定位到绘图的右下角,而无需任何用户干预。

这是我到目前为止所拥有的:

# Setup
library(tidyverse)

get_png <- function(filename) {
  grid::rasterGrob(png::readPNG(filename), interpolate = TRUE)
}

# DaSL logo
l <- get_png("logo.png")

# Main function
add_dasl_logo <- function(logo) {
  list(annotation_custom(logo, xmin = 5, xmax = 7.5, ymin = 0, ymax = 15), 
       coord_cartesian(clip = "off"),
       theme(plot.margin = unit(c(1, 1, 3, 1), "lines"))
  )
}

# Plot
ggplot(mpg, aes(displ, hwy, colour = hwy)) +
  geom_point() +
  add_dasl_logo(l)

图像文件(logo.png):enter image description here

现在,x-y 最小/最大位置是为此特定 ggplot 手动设置的。我不希望普通 ggplot2 用户能够计算出 xmin、xmax、ymin、ymax 坐标。

如何以编程方式查找这些坐标并在 add_dasl_logo() 中使用它们,而无需任何用户干预?

最佳答案

您可以直接在grid::rasterGrob中以相对坐标设置位置,而不是通过annotation_custom在数据坐标中设置 Logo 的位置。这样,每个地 block 的 Logo 将放置在相同的位置,并且具有相同的高度和宽度。

# Setup
library(tidyverse)

get_png <- function(filename) {
  grid::rasterGrob(png::readPNG(filename),
    interpolate = TRUE,
    x = unit(1, "npc") + unit(10, "pt"),
    y = unit(0, "npc") - unit(20, "pt"),
    height = unit(10, "pt"),
    hjust = 1,
    vjust = 1
  )
}

download.file("/image/uj2rP.png", "logo.png")

# DaSL logo
l <- get_png("logo.png")

# Main function
add_dasl_logo <- function(logo) {
  list(
    annotation_custom(logo),
    coord_cartesian(clip = "off"),
    theme(plot.margin = unit(c(1, 1, 3, 1), "lines"))
  )
}

ggplot(mpg, aes(displ, hwy, colour = hwy)) +
  geom_point() +
  add_dasl_logo(l)

ggplot(mpg, aes(cty, hwy, colour = hwy)) +
  geom_point() +
  add_dasl_logo(l)

关于r - 使用annotation_custom以编程方式在ggplot上定位图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76354700/

相关文章:

r - 在 R 中使用负向后查找

r - 从多列中仅获取值(非 0、非 NA)

r - 根据另一个表过滤一个表

r - 使用 grid.arrange (gridExtra) 和基于格子的图的全局图例

尽管没有任何错误,但 Renderplotly 不起作用

r - 寻求 ggplot 2.2.0 破坏的 gtable_add_grob 代码的解决方法

python - 使用 rpy2 将 .RData 文件读入 python

r - ggplot2 绘制两个子集的图形

r - 多个地 block 并排 - 如何使所有地 block 具有相同的宽度?

r - 在R中使用分配函数时,如何将图形对象存储到列表中?