gpt4 book ai didi

r - 如何在ggplot2中为矩形rasterGrob添加边框?

转载 作者:行者123 更新时间:2023-12-03 23:41:25 24 4
gpt4 key购买 nike

我正在尝试为已添加到 ggplot 的矩形 png 图像( found here )添加边框,并使用 npc 指定定位。

library(png)
library(grid)
library(ggplot2)

img <- readPNG("gb.png")


g <- rasterGrob(img, x = unit(0.5, "npc"),
y = unit(0.5, "npc"),
width = unit(0.4, "npc"))

border <- rectGrob(x = unit(0.5, "npc"),
y = unit(0.5, "npc"),
width = unit(0.4, "npc"),
# height = resolveRasterSize(g)$height,
gp = gpar(lwd = 2, col = "black", fill="#00000000"))

myplot <- ggplot() +
annotation_custom(g) +
annotation_custom(border) +
scale_x_continuous(limits = c(0, 1)) +
scale_y_continuous(limits = c(0, 1))
在 RStudio 查看器中看起来像这样:
enter image description here
由于我已经指定了 x 和 y 坐标以及光栅的宽度,因此很容易复制这些作为边框坐标。但是,由于我没有指定任何高度,因此我不确定找出 npc 设置边框高度的最佳方法。我没有设置高度,因为我想根据 .png 尺寸自动保留标志的任何纵横比。
我查看了一些可能有助于网格的函数,例如 resolveRasterSize ,这说明你可以

Determine the width and height of a raster grob when one or both arenot given explicitly


还有关于方面/视口(viewport)的其他一些事情,我不太熟悉它如何影响在 ggplot2 中创建的绘图。内部 rectgrobheight = resolveRasterSize(g)$height情节最终看起来像:
enter image description here
边框与图像不匹配。我还注意到使用 resolveRasterSize 创建的高度变量给定一个带有英寸而不是 npc 的属性。
如果我调整 Plots 平面的大小,我注意到标志和边框的高度都会动态变化,有时我可以使其对齐,但我想要一种更精确的方法来正确对齐它们,例如,如果我m 在 ggsave 或某些用法中以不同的尺寸保存。
我试着看其他 grid函数如 convertHeight , 与 height = convertHeight(resolveRasterSize(g)$height, "npc")rectGrob ,这似乎总是在 RStudio 的 Plot Pane 中设置正确的边框,但是如果我调整 Pane 的大小,边框会再次未对齐,如果我使用 ggsave 保存,它也会未对齐。
ggsave(filename = "my_example.png", plot = myplot, width = 16, height = 9)
enter image description here

最佳答案

正如您正确确定的那样,问题在于您的 rectGrob 的尺寸绘图窗口的缩放比例与您的 rasterGrob 的尺寸会受到不同的影响。 .您可以使用一些数学来解决这个问题,以纠正光栅和绘图窗口的纵横比。唯一的缺点是在调整绘图窗口大小时必须重新运行计算。对于大多数应用程序,这不是主要问题。例如,要保存为 16 x 9 png 文件,您可以执行以下操作:

img <- readPNG("gb.png")

g <- rasterGrob(img, x = unit(0.5, "npc"),
y = unit(0.5, "npc"),
width = unit(0.4, "npc"))

img_aspect <- dim(g$raster)[1] / dim(g$raster)[2]
dev_aspect <- 16/9
rect_aspect <- dev_aspect * img_aspect

border <- rectGrob(x = unit(0.5, "npc"),
y = unit(0.5, "npc"),
width = g$width,
height = g$width * rect_aspect,
gp = gpar(lwd = 2, col = "black", fill="#00000000"))

myplot <- ggplot() +
annotation_custom(g) +
annotation_custom(border) +
scale_x_continuous(limits = c(0, 1)) +
scale_y_continuous(limits = c(0, 1))

ggsave(filename = "my_example.png",
plot = myplot, width = 16, height = 9)
这导致:
my_example.png
enter image description here
如果您想让边框适合 R Studio 中的当前设备,那么您可以使用
dev_aspect <- dev.size()[1]/dev.size()[2]
如果你想要一个矩形来缩放绘图发生的任何事情,那么这可以通过创建 rasterGrob 来完成。仅包含黑色边框。
例如,如果您这样做:
border <- g$raster
border[] <- "#00000000"
border[1:2, ] <- "#000000FF"
border[, 1:2] <- "#000000FF"
border[nrow(border) + seq(-1, 0), ] <- "#000000FF"
border[, ncol(border) + seq(-1, 0)] <- "#000000FF"

border <- rasterGrob(border, x = unit(0.5, "npc"),
y = unit(0.5, "npc"),
width = unit(0.4, "npc"))

myplot <- ggplot() +
annotation_custom(g) +
annotation_custom(border) +
scale_x_continuous(limits = c(0, 1)) +
scale_y_continuous(limits = c(0, 1))
然后 myplot将在标志周围显示一个黑色边框,该边框在重新缩放时仍然存在。

关于r - 如何在ggplot2中为矩形rasterGrob添加边框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65496330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com