在 R 中的图像顶部准确绘图 - 处理绘图区域、面板、原点和不同尺寸

问题描述 投票:0回答:1

我正在尝试使用 R 在背景图像上插入文本和图表。

可能有更好的方法来做到这一点,但一些研究表明这是最好的方法(尽管它存在一些问题,如下所述)

我使用 magick 读取图像,然后使用owplot::ggdraw() 绘制数据。

为了让事物轻松对齐,我希望能够在图像顶部覆盖一个网格,与图像具有相同的原点 - 但是,不同的命令/包似乎使用不同的原点(例如从 0,0 开始)作为轴交点或整个绘图区域)。请参阅提供的图像,了解红色网格原点与黑色网格原点不对齐。

另一个问题是,我需要能够直观地设置标签(主要是通过反复试验)并使用 RStudio - 但 RStudio 中的绘图窗口在大小调整方面非常动态,我想尝试修复大小的输出。虽然

theme(aspect.ratio=1)
似乎解决了最糟糕的问题,但点网格关系的准确性仍然非常依赖于窗口大小(请参阅示例图片以了解蓝点与背景网格的关系(黑色网格 = 图像红色网格 =因此,我需要以某种方式修复显示的绘图的大小,就像您可以使用 ggsave 修复发送到文件的图像的大小一样(注意,我正在设置手动绘制文本的代码 - 但代码最终会自动运行)。

我意识到我可能只是以完全错误的方式来解决这个问题,所以激进的替代方法而不是修补也受欢迎。然而,我要解决的关键点是:

  1. 如何可靠地修复图像上的网格,以便无论图像/绘图大小如何,图像特征的坐标都保持不变?

  2. 如何使绘图原点与加载/绘制图像的左下角对齐?

下面提供了简单的可重现演示代码 - 但最终我们尝试将文本放置在背景图像上以制作如下所示的信息图形:

    if (!require("pacman")) install.packages("pacman")
    pacman::p_load(data.table,magick, tidyverse,cowplot,ggpubr)

#Load Graphic
    pb<-image_read("https://art.pixilart.com/8c9cffeb529b204.png")
    
    #Choose this sets up the grid
    plotaxes<-ggplot()+ geom_point() + cowplot:: theme_nothing()+# ggpubr::theme_transparent()+
      theme(panel.grid.major = element_line(linewidth = 0.5, linetype = 'solid',colour = "red"),
            panel.grid.minor = element_line(linewidth = 0.1, linetype = 'solid',colour = "pink"))+ 
      scale_x_continuous(expand=c(0,0),breaks=seq(1, 100, 10), minor_breaks = seq(1, 100, 1),limits=c(0,100))+
      scale_y_continuous(expand=c(0,0),breaks=seq(1, 100, 10),minor_breaks = seq(1, 100, 1),limits=c(0,100))+theme(aspect.ratio=1)
    
    
    points<-data.table(x=seq(1,10),y=seq(1,10))
    plotpoints<-ggplot(points)+geom_point(aes(x=x,y=y),colour="blue")+ggpubr::theme_transparent()
    
    ggdraw()+draw_image(pb)+draw_plot(plotaxes)+draw_plot(plotpoints)

   

在图像顶部,我使用cowplot:draw_label 添加文本标签

这些点的绘制肯定会受到绘图的影响(请参见接下来的两张图片) - 有什么更好的替代方法可以将文本放置在绘图上,以便无论绘图窗口的尺寸如何,它都与网格对齐?

ggdraw()+draw_image(pb)+draw_plot(plotaxes)+draw_plot(plotpoints)+ draw_label(".This Point is at 0.2,0.2", x=0.2, y =0.2, color = "green", size = 15, angle = 0,hjust=0,vjust=0,fontfamily="HelveticaNeue",fontface="bold")+ draw_label(".This Point is at 0.5,0.5", x=0.5, y =0.5, color = "green", size = 15, angle = 0,hjust=0,vjust=0,fontfamily="HelveticaNeue",fontface="bold")+ draw_label(".This Point is at 0.8,0.8", x=0.8, y =0.8, color = "green", size = 15, angle = 0,hjust=0,vjust=0,fontfamily="HelveticaNeue",fontface="bold")

仅供参考...如果明天早上我没有得到答复,我的下一步是开始测量(在我的现实生活中是非方形的)基础图像并拟合网格它更紧密并达到正确的比例,然后探索使用注释来重做文本。

r image plot cowplot magick
1个回答
0
投票

我在尝试制作元素周期表时也遇到了同样的困难。我的解决方案是生成表格作为图形对象,然后添加标签和线条。

这取决于背景图像。如果它是一个简单的网格,那么这可能适合您。

例如:

# Data for grid, points and labels
box_data <- tibble(x = rep(1:10, each = 10), y = rep(1:10, length.out = 100))
line_data <- tibble(x = seq(1:9)*1.02+0.5, y = seq(1:9)*1.02+0.5)
label_data <- tibble(x = c(0.2, 0.5, 0.8), y = c(0.2, 0.5, 0.8), label = NULL)
    
offset <- 0.45 # Change the size of boxes

# Draw image
ggplot() +
  geom_rect(data = box_data, aes(xmin = x-offset, xmax = x+offset, ymin = y-offset, ymax = y+offset), fill = "white", colour = "grey60", linewidth = 2) +
  
  geom_hline(data = line_data, aes(yintercept = y), colour = "darkred") +
  geom_vline(data = line_data, aes(xintercept = y), colour = "darkred") +
  
  geom_text(data = label_data, aes(x = x*10, y = y*10, label = glue::glue("This point is at {x*10}, {y*10}")), hjust = -0.1,
            color = "darkgreen", size = 5, fontface="bold") +
  
  geom_point(data = points, aes(x = x, y = y), colour = "red", size = 4) +
  
  scale_x_continuous(expand = c(0,0)) +
  scale_y_continuous(expand = c(0,0)) +
  
  coord_equal() +
  
  theme_void()

© www.soinside.com 2019 - 2024. All rights reserved.