gpt4 book ai didi

r - 什么是英寸?设置箭头的长度

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

有点令人费解的是,arrows 中的 length 参数以英寸为单位指定(来自 ?arrows):

length length of the edges of the arrow head (in inches).

R source甚至在评论中明确指出此测量单位是英寸,强调了此设计的独特之处。

这意味着箭头的相对大小取决于 dev.size()。目前尚不清楚的是如何将英寸转换为轴单位(这首先是非常有用的)。这是一个简化版本:

h = c(1, 2, 3)
xs = barplot(h, space = 0, ylim = c(0, 4))
arrows(xs, h - .5, xs, h + .5,
length = .5*mean(diff(xs)))

显示方式取决于设备。例如。这是该设备上的输出:

png('test.png', width = 5, height = 5)

A barplot with three bars with heights increasing from left to right; each has an upward-pointing arrow starting within the bar and extending above it.

这是另一个:

png('test.png', width = 8, height = 8)

The same plot, but scaled larger; the arrows look relatively smaller on this version despite the same code (besides the call to png()) underlying it.

乍一看有点视觉错觉,但两个图中的箭头确实具有相同的宽度。我如何控制它以便两个图(传达相同的数据)显示相同?更具体地说,如何确保箭头的宽度恰好 0.5 绘图单位

最佳答案

我在这个问题上花了太多时间,但现在就到这里。我将首先记录我的一些旅程,以帮助其他在尝试自力更生时在角落和缝隙中遇到这种情况的人进行搜索。

我开始查找arrows的源代码,但无济于事,因为它很快就深入到了内部代码。于是我搜索了R source使用 "C_arrows" 查找正在发生的情况;幸运的是,它是not too esoteric ,就 R 内部代码而言。环顾四周,主力似乎实际上是 GArrow ,但这是一个死胡同,因为似乎 length 参数并没有真正在那里转换(IIUC 这意味着转换为英寸是为其他坐标和 length 完成的未受影响)。但我碰巧注意到一些 GConvert 调用看起来更接近我想要的,并希望找到一些直接吸引这些用户的函数。

这让我回到 R 并简单地运行与 arrows 相同的包中的所有函数,寻找任何有用的东西:

ls(envir = as.environment('package:grDevices'))
ls(envir = as.environment('package:graphics'))

最后我在graphics中找到了三个函数:xinchyinchxyinch(都可以在?xinch) 用于与我的目标相反的地方 - 即,它们采用英寸并将其转换为设备单位 em>(分别在 x、y 和 x&y 方向)。幸运的是,这些功能都非常简单,例如xinch 的主要工作是转换因子:

diff(par("usr")[1:2])/par("pin")[1L]

检查?par(第1,000,000次),确实pinusr正是我们需要的图形参数( pin 对我来说是新的,usr 到处出现):

pin The current plot dimensions, (width, height), in inches.

usr A vector of the form c(x1, x2, y1, y2) giving the extremes of the user coordinates of the plotting region.

因此,我们可以通过反转此函数将绘图单位转换为英寸:

xinch_inv = function(dev_unit) {
dev_unit * par("pin")[1L]/diff(par("usr")[1:2])
}

h = c(1, 2, 3)
xs = barplot(h, space = 0, ylim = c(0, 4))
arrows(xs, h - .5, xs, h + .5,
# just convert plot units to inches
length = xinch_inv(.5*mean(diff(xs))))

结果为 (5x5):

enter image description here

和(8x8):

enter image description here

进一步注意,length 似乎是箭头的每条边 的长度 - 使用 length = xinch_inv(.5), code = 3、角度 = 90 导致线段与条形一样宽(即 1)。

如果您感兴趣,我已将这些打包在我的 package 中如xdev2in等;目前仅限 GitHub。

关于r - 什么是英寸?设置箭头的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47034898/

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