有点莫名其妙,length参数in arrows以英寸(从?arrows)为单位:
length箭头边缘的长度(以英寸为单位).
R源甚至可以明确地指出这个测量在评论中以英寸为单位,突出了这种设计的特殊性.
这意味着箭头的相对大小取决于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)))
Run Code Online (Sandbox Code Playgroud)
显示方式取决于设备.例如,这是该设备上的输出:
png('test.png', width = 5, height = 5)
Run Code Online (Sandbox Code Playgroud)
这是另一个:
png('test.png', width = 8, height = 8)
Run Code Online (Sandbox Code Playgroud)
这看起来有点视错觉,但两个图中的箭头宽度确实相同.如何控制这个以便两个图(传达相同的数据)显示相同?更具体地说,我如何确保箭头的宽度正好为 .5个单位?
Mic*_*ico 11
我在兔子洞里花了太多时间,但是这里有.我将首先记录一下我的旅程,以帮助其他在角落和缝隙类型中发生这种情况的人在尝试通过你的自我拉伸时进行搜索.
我开始寻找源代码arrows,但无济于事,因为它很快就会深入内部代码.所以我搜索了R源代码,"C_arrows"找出发生了什么; 幸运的是,就R内部代码而言,它并不太深奥.实际上看起来似乎是主力GArrow,但这是一个死胡同,因为看起来length参数并没有在那里真正转换(IIUC这意味着转换为英寸是为其他坐标完成并且length未触及).但我碰巧注意到一些GConvert看起来更接近我想要的电话,并希望找到一些直接吸引这些用户的功能.
这导致我回到R并简单地在同一个包中运行各种函数,arrows寻找可能有用的任何东西:
ls(envir = as.environment('package:grDevices'))
ls(envir = as.environment('package:graphics'))
Run Code Online (Sandbox Code Playgroud)
最后我发现了三个函数graphics:xinch,yinch和xyinch(所有找到的?xinch)用于与我的目标相反 - 即,它们占用英寸并将它们转换为设备单元(分别在x,y和x和y方向) .幸运的是,这些功能都很简单,例如工作马xinch是转换因子:
diff(par("usr")[1:2])/par("pin")[1L]
Run Code Online (Sandbox Code Playgroud)
检查?par(为1,000,000次),确实pin和usr正是我们所需要的图形参数(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))))
Run Code Online (Sandbox Code Playgroud)
导致(5x5):
并且(8x8):
还要注意的length是,箭头的每一侧的长度似乎都是- 使用的length = xinch_inv(.5), code = 3, angle = 90结果与条形一样宽(即1).
如果您对此感兴趣,我会将这些包装在我的包裹中xdev2in等等; GitHub现在只有.