R 图中行的恒定绝对间距

2024-04-16

In R,我该如何调整height绘图设备的价值(例如,windows() or png()),以便点之间的绝对间距保持不变?这是一个例子来说明我的意思:

n <- 10
windows(width=4, height=4)
par(xpd=NA)
plot(1:n)
abline(h=1:10)

n <- 20
windows(width=4, height=6)
par(xpd=NA)
plot(1:n)
abline(h=1:20)

我希望每个图中点/线之间的距离完全相同(我使用par(xpd=NA)因此,很容易将图表彼此相邻放置,并且可以更好地查看线条是否对齐)。清楚地,height需要是一个函数n。人们当然可以尝试找到以下函数n通过反复试验来实现这一目标。但也许有一种聪明的方法可以通过编程实现这一目标。

我的问题与此类似:将 ggplot 图设置为具有相同的 x 轴宽度和点图行之间的相同间距 https://stackoverflow.com/q/23863345/2615367。但这个问题使用ggplot2,而我的问题仍然是基本图形。


这里似乎有两件事在起作用。

  1. R如何处理轴的分割?
  2. 边际对这些规则有什么影响?

首先我们需要弄清楚没有边距会发生什么:

adjLineSpace <- function(nLine, baseHeight=32){
  # get reproducible device
  png(paste("nLine=", nLine, ".png", sep=""), width=baseHeight*nLine, heigh=baseHeight*nLine, res=100)
  # control margins
  par(mar=c(0,0,0,0))
  # open plot with axis that do not interact with data to find "optimal range of axes"
  plot(0:nLine, pch=NA_integer_, xlim=c(0, nLine), ylim=c(0, nLine), yaxs="i", xaxs="i")
  abline(h=1:nLine)
  # include text for visualisation
  text(0:nLine, 0:nLine, labels=0:nLine)
  text(c(1:4), 0.5, par("usr")[1:4], pos=4)
  text(c(5), c(0.5), paste("pin: ", par("pin")[1], ", ", par("pin")[2], sep=""), pos=4)
  text(c(5), c(1.5), paste("fin: ", par("fin")[1], ", ", par("fin")[2], sep=""), pos=4)
  text(c(5), c(2.5), paste("din: ", par("din")[1], ", ", par("din")[2], sep=""), pos=4)
  dev.off()
}
# examples
adjLineSpace(10)
adjLineSpace(20)

找到问题后,我感觉自己像个该死的初学者,因为我已经很久没有看到它了:需要从0开始计数,否则不会有10或20或n“行”,而是9、19或n-1。


但由于几乎在任何情况下都需要边距,因此我们还需要找出边距与其相互作用的方式:

# introduce new attributes to adjust margins, make it possible to deal with width and height seperately and be able to controll resolution
adjLineSpace <- function(nLine, basePHeight=32, basePWidth=32, marHeight=c(0, 0), marWidth=c(0, 0), res=100){
  pMai <- round(par("mai"),2); pMar <- round(par("mar"),2)
  pixelLeft <- marWidth[1]*pMai[2]/pMar[2]*res       # adjust left
  pixelRight <- marWidth[2]*pMai[4]/pMar[4]*res      # adjust right
  pixelBottom <- marHeight[1]*pMai[1]/pMar[1]*res    # adjust bottom
  pixelTop <- marHeight[2]*pMai[3]/pMar[3]*res       # adjust top
  # reproducible device: we first need to find out how many inches one row covers, multiply that by our resolution and the number of 'lines' we want to use in our margin
  png(
    paste("nLine=", nLine, ".png", sep=""), 
    width=basePWidth*nLine + pixelLeft + pixelRight, 
    heigh=basePHeight*nLine + pixelBottom + pixelTop, 
    res=res
  )
  # set margins
  par(mar=c(marHeight[1], marWidth[1], marHeight[2], marWidth[2]))
  # this is the key to it all! Set range of plot area (in pixels) as above, only transformed to inches (divided by resolution in ppi=points/pixels per inch)
  par(pin=c(basePWidth*nLine/res, basePHeight*nLine/res))
  plot(0:nLine, pch=NA_integer_, xlim=c(0, nLine), ylim=c(0, nLine), yaxs="i", xaxs="i", bg="white")
  abline(h=1:nLine)
  # include text for visualisation of values
  text(0:nLine, 0:nLine, labels=0:nLine)
  text(c(1:4), 0.5, par("usr")[1:4], pos=4)
  text(c(5), c(0.5), paste("din: ", par("din")[1], ", ", par("din")[2], sep=""), pos=4)
  text(c(5), c(1.5), paste("fin: ", par("fin")[1], ", ", par("fin")[2], sep=""), pos=4)
  text(c(5), c(2.5), paste("pin: ", par("pin")[1], ", ", par("pin")[2], sep=""), pos=4)
  text(c(.5), c(9.5), paste("mar: ", pMar[1], ", ", pMar[2], ", ", pMar[3], ", ", pMar[4], sep=""), pos=4)
  text(c(.5), c(8.5), paste("mai: ", pMai[1], ", ", pMai[2], ", ", pMai[3], ", ", pMai[4], sep=""), pos=4)
  text(c(.5), c(7.5), paste("mai(nch)/mar(ow): ", round(pMai[1]/pMar[1],2), ", ", round(pMai[2]/pMar[2],2), ", ", round(pMai[3]/pMar[3],2), ", ", round(pMai[4]/pMar[4],2), sep=""), pos=4)
  dev.off()
}
# examples without margins still work
adjLineSpace(10, basePHeight=32, basePWidth=32, marHeight=c(0, 0), marWidth=c(0, 0))
adjLineSpace(20, 32, 32, c(0, 0), c(0, 0))
# with margins as well!
adjLineSpace(10, 32, 32, c(4, 0), c(4, 0))
adjLineSpace(20, 32, 32, c(4, 0), c(4, 0))

See https://www.stat.auckland.ac.nz/~paul/RGraphics/rgraphics.html https://www.stat.auckland.ac.nz/~paul/RGraphics/rgraphics.html(作者:Paul Murrell)用于解释设备区域。 不幸的是,我还不能发布图像,否则我还会在这里包含一些示例。

其实我也是从这个帖子来的:将文本与 R 中可变大小的绘图对齐 https://stackoverflow.com/questions/25565817/align-text-to-a-plot-with-variable-size-in-r我有兴趣看到它包含在 Metafor 的 Forest() 函数中。我会给你发私信,沃尔夫冈。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 图中行的恒定绝对间距 的相关文章

随机推荐

  • Scala 函数变体和重写

    我在理解重载时方法的差异时遇到了一些问题 虽然由于返回类型的协方差 这可以完美地工作 class Bla class Fasel extends Bla trait Test A def tester Bla new Bla class F
  • 错误:仅具有以下方案的 URL:使用 monorepo 中的 NX 生成的 NestJS 应用程序中的默认 ESM 加载程序支持文件和数据

    我有一个用 NX v16 生成的 Monorepo 我里面有正在运行的 React 应用程序 我使用来自 NX VS Code 插件的 nx 生成器命令生成了 NestJS 应用程序 但是当我启动 Nest 应用程序时nx run
  • Eclipse更新后插件消失了

    已使用更新 Eclipse PDTWindow gt Check for Updates特征 重启后所有第三方插件似乎都被关闭了 从 开始 clean命令行键没有帮助 Eclipse Installation Detals正确包含有关我所有
  • 从两个表中选择最大值、最小值

    我有两张桌子 不同之处在于 归档是一个表 另一个保存当前记录 这些是记录公司销售额的表格 在这两个字段中 我们都有其他字段 id 名称 销售价格 我需要从两个表中选择给定名称的最高价格和最低价格 我尝试处理查询 select name ma
  • 寻找贝宝付款教程[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个教程 它将向我展示如何接受贝宝付款 因为我对文档不太了解 在教程中 我只需要了解如何在发起
  • 如何获取传递给 JNI 的枚举值

    我有一个 Java 应用程序和 JNI dll 我想知道如何获取作为参数传递给 JNI 的枚举 int 的值 这是枚举 Java public enum envelopeType NOT SPECIFIED 1 NONE 0 IMAGE 1
  • 如何在 IntelliJ 15 中导入现有的 Grails 3 (3.0.12) 项目

    IntelliJ 网站上有用于创建新 Grails 项目的文档 但导入项目比较粗略 我无法让它为我工作 如果我告诉 IntelliJ 导入一个新项目 并将其指向我的项目目录 它不会将其识别为 Grails 项目 项目导入后 我可以转到 项目
  • Docker mysql 主机没有特权

    我正在尝试配置一个nodejs 容器来连接到mysql 数据库 我的代码如下所示 var pool mysql createPool host mysql port 3306 user root password database gene
  • IE8 不渲染某些 HTML 名称实体

    某些 HTML 名称实体未在 IE8 中呈现 相反我可以看到未呈现的 HTML 实体 例如 scedil or inodot 我找到了一个使用 HTML 数字实体的解决方案 例如 351 代替 scedil 我想知道是否有人知道这个问题的原
  • 除了扩展名之外,.json、.txt、.html、.css 和 .js 文件之间有什么区别吗?

    动力是 我有一些 JSON 我已经将其保存为 txt 文件一段时间了 我想将它们全部重命名为 json 以更准确 我很确定它们都是 UTF 8 大多数可以通过 Ajax 发送的文件也是如此 无论如何 这个问题提出了一个更大的问题 除了扩展名
  • 使用 jQuery 传递 POST 数据时打开 URL

    是否可以使用 jQuery 更改页面 URL 同时将发布数据传递到新页面 如果您的意思是要更改current页面 URL 那么您可以添加新的
  • 在没有互联网的情况下使用 Javascript 获取 GPS 位置 [重复]

    这个问题在这里已经有答案了 您好 如果设备具有 GPS 硬件 我们可以在没有互联网连接的情况下使用 JavaScript 获取 GPS 位置吗 请注意谁将其标记为重复 我需要 JavaScript 在没有互联网连接的情况下工作 并使用 GP
  • 从 mysql 表获取行到 php 数组

    如何获取 mysql 表的每一行并将其放入 php 数组中 我需要一个多维数组吗 所有这一切的目的是稍后在谷歌地图上显示一些点 您需要从表中获取所需的所有数据 像这样的事情会起作用 SQLCommand SELECT someFieldNa
  • 如何使用 CSS 更改图标图像的颜色? [复制]

    这个问题在这里已经有答案了 我想弄清楚如何更改半透明和半纯色图像的颜色 我希望能够更改白色的颜色 这样我就可以添加悬停 并添加以动态方式更改 WordPress 中颜色的功能 使用 Photoshop 来填充图像不是一个选项 因为我要在我的
  • Android 将 Px 转换为 Dp(视频宽高比)[重复]

    这个问题在这里已经有答案了 可能的重复 在android中将像素转换为dp https stackoverflow com questions 4605527 converting pixels to dp in android 我正在尝试
  • 有没有办法为 Heroku Toolbelt 设置默认应用程序?

    我在heroku上有多个app git远程 我想知道是否可以配置一个默认应用程序 这样 每当我忘记指定应用程序时 app 工具带会使用它 您可以设置heroku remote在存储库的 Git 配置中键入默认远程名称 例如 如果您的遥控器被
  • Gradle:战争任务有冲突的包含/排除

    我正在尝试使用 Gradle 构建一个 war 文件 但遇到了一个问题 即排除一个目录并包含另一个恰好具有相同名称但父目录不同的目录 请注意 在下面的第一个代码示例中 两者都没有css 目录将包含在最终版本中war文件 我假设是因为 Gra
  • 如何设置 JSlider 的大小?

    我在网上搜索了此问题的解决方案 但没有找到任何有效的方法 我在 JPanel 中有一个垂直 JSlider 它使用 GridBagLayout 和 GridBagConstraints 将对象定位在面板上 目前我有以下代码 gbc grid
  • 有返回值的 C void 函数

    据我所知 returnvoid 函数中的语句将引发错误 但在下面的程序中 情况并非如此 这里显示的输出是1 怎么会 main int i 5 printf d fun fun fun i void fun int i if i 2 retu
  • R 图中行的恒定绝对间距

    In R 我该如何调整height绘图设备的价值 例如 windows or png 以便点之间的绝对间距保持不变 这是一个例子来说明我的意思 n lt 10 windows width 4 height 4 par xpd NA plot