【问题标题】:What is an inch? Setting the length for arrows什么是英寸?设置箭头的长度
【发布时间】:2017-10-31 12:00:08
【问题描述】:

有点莫名其妙,arrows 中的length 参数以英寸为单位指定(来自?arrows):

length 箭头边缘的长度(以英寸为单位)。

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)

这是另一个:

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

这有点像视觉上的错觉,但两个图中的箭头确实是相同的宽度。我怎样才能控制它,以便两个图(传达相同的数据)显示相同?更具体地说,我如何确保箭头的宽度正好 .5 绘图单位

【问题讨论】:

  • 也许使用箭头字符? text(seq(0.5, 3, 1), h, "↑", cex = 5)
  • @zx8754 谢谢。实际上我也在使用code = 3L(这些将是标准误差线a la here
  • 内部有一个Convert function,不清楚是否存在任何面向用户的版本

标签: r plot


【解决方案1】:

我在兔子洞里花了太多时间在这上面,但还是这样。我将首先记录一些我的旅程,以帮助其他遇到这种情况的人在尝试通过引导自己振作起来时搜索的角落和缝隙类型。

我开始查找arrows 的源代码,但无济于事,因为它很快就会深入到内部代码中。所以我在R source 中搜索"C_arrows" 以了解发生了什么;幸运的是,就 R 内部代码而言,它是 not too esoteric。四处寻找似乎主力实际上是GArrow,但这是一个死胡同,因为似乎length参数在那里并没有真正转换(IIUC这意味着对其他坐标和@987654333完成了到英寸的转换@ 保持不变)。但我碰巧注意到一些GConvert 调用看起来更接近我想要的,并希望找到一些直接吸引这些的面向用户的功能。

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

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

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

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

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

pin当前绘图尺寸,(宽度,高度),以英寸为单位。

usrc(x1, x2, y1, y2) 形式的向量,给出绘图区域的用户坐标的极值。

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

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):

和(8x8):

进一步注意,length 似乎是箭头每一边的长度——使用length = xinch_inv(.5), code = 3, angle = 90 会产生与条一样宽的段(即1)。

如果您有兴趣,我已将这些打包在我的package 中,如xdev2in 等;暂时只在 GitHub 上。

【讨论】:

    猜你喜欢
    • 2015-03-24
    • 2014-04-30
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    相关资源
    最近更新 更多