什么是英寸?设置箭头

时间:2017-10-31 12:00:08

标签: r plot

有点莫名其妙,length中的arrows参数以英寸(来自?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)

enter image description here

这是另一个:

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

enter image description here

在视线中讲述的是一种视错觉,但两个图中的箭头确实是相同的宽度。如何控制这个以便两个图(传达相同的数据)显示相同?更具体地说,我如何确保箭头完全 .5 绘图单位的宽度?

1 个答案:

答案 0 :(得分:11)

我在兔子洞里花了太多时间,但是这里有。我将首先记录一下我的旅程,以帮助其他在角落和缝隙类型中发生这种情况的人在尝试通过你的自我提升时进行搜索。

我开始查看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上的所有函数)都用于我的目标相反 - 即,他们将英寸转换为设备单位(分别在x,y和x& y方向) )。幸运的是,这些功能都非常简单,例如xinch的工作马是转换因子:

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

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

  

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

     

pin usr形式的向量,给出绘图区域的用户坐标的极值。

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

c(x1, x2, y1, y2)

导致(5x5):

enter image description here

和(8x8):

enter image description here

还有一点需要注意,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)))) 是箭头的每边的长度 - 使用length会产生与条形一样宽的线段(即, 1)。

关于您感兴趣的机会,我已将这些内容打包在我的package length = xinch_inv(.5), code = 3, angle = 90等中; GitHub现在只有。