r - 如何根据绘图/图形/设备区域的坐标从 0 到 1 放置文本?

标签 r graphics

https://bootstrappers.umassmed.edu/bootstrappers-courses/pastCourses/rCourse_2014-09/resources/helpfulGuides/Rfigurelayout.pdf

上面的文档显示了绘图区域、图形区域和设备区域。

假设这些区域在心理上映射到从 0(底部或左侧)到 1(顶部或右侧)的坐标。如何在基本 R 中分别将文本放入这三个区域的坐标定义中?

最佳答案

我认为您要问的是如何使用比例设备坐标将文本放置在绘图窗口中的任何位置。这实际上是文本在网格图形系统中的工作方式:

library(grid)

grid.newpage()

grid.draw(rectGrob(gp = gpar(lwd = 2)))
grid.draw(textGrob("(0.1, 0.1)", 0.1, 0.1, gp = gpar(cex = 2, col = "red2")))
grid.draw(textGrob("(0.5, 0.5)", 0.5, 0.5, gp = gpar(cex = 2, col = "blue")))
grid.draw(textGrob("(0.9, 0.9)", 0.9, 0.9, gp = gpar(cex = 2, col = "green2")))

但是,如果您想在基本 R 图形中执行相同的操作,我认为您需要编写一个围绕 text 的包装器,用于查询图形设备并将设备空间坐标转换为用户坐标,然后绘制剪切后的文本。

这是一个这样的函数(称为dtext来表示“设备文本”)

dtext <- function(x = 0.5, y = 0.5, label, ...) {
  margins <- par("omi") + par("mai")
  plotsize <- par("pin")
  devsize  <- dev.size()
  usr_space <- par("usr")
  usr_y <- devsize[2] / plotsize[2] * (diff(usr_space[3:4]))
  y_min <- usr_space[3] - usr_y * margins[1]/devsize[2]
  
  usr_x <- devsize[1] / plotsize[1] * (diff(usr_space[1:2]))
  x_min <- usr_space[1] - usr_x * margins[2]/devsize[1]
  
  text(x = x * usr_x + x_min,
       y = y * usr_y + y_min,
       label = label,
       xpd = NA,
       ...)
}

这允许:

plot(1:10, 1:10)

dtext(x = 0.1, y = 0.1, label = "(0.1, 0.1)", cex = 2, col = "red2")
dtext(x = 0.5, y = 0.5, label = "(0.5, 0.5)", cex = 2, col = "blue2")
dtext(x = 0.9, y = 0.9, label = "(0.9, 0.9)", cex = 2, col = "green2")

这似乎是一个非常有用的功能,但我很惊讶它还不存在,所以感谢您的OP。

reprex package 于 2022 年 4 月 2 日创建(v2.0.1)

关于r - 如何根据绘图/图形/设备区域的坐标从 0 到 1 放置文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71714973/

相关文章:

r - 如何更改表中行变量的名称

R Shiny : How to build dynamic UI (text input)

java - 如何在Java中阻止网格单元重绘?

iOS - Cocos2d、Box2d 或 Chipmunk

java - 覆盖 JButton paintComponent() 不起作用 java

mysql - 尝试使用 RODBC 将 R 连接到 MySQL 时出错

r - 独立子集 data.table 列

r - 查找 R 中某些列的列号

Java 2D 灯光效果

Java Unicode 字符显示框而不是 Runic 字母