首页 > 解决方案 > 无论绘图尺寸如何,都对 text() 和 legend() 使用恒定的垂直调整

问题描述

要为 中的条形图绘制 X 轴标签R,我使用text()如下方式:

text(mean(bp), par("usr")[3] - 0.05*yDiff, xpd=NA, labels=journey, cex=0.9, font=2)

为了画一个图例,我使用这样的东西:

legend("bottom", legend=abbrevLabels, fill=c(colors), xpd=NA, horiz=TRUE, bty="n", 
   cex=1.0, inset=c(0, -0.3), xjust=0, adj=0.035, 
   text.width=rep(meanLabelLen/7.5, length(legendLabels)))

这里的两个垂直偏移——图例的 the0.05*yDiff和插入偏移-0.3——都在 Y 轴空间中。由于各种原因,这对我来说是个问题。相反,我更喜欢以像素为单位的偏移量。也就是说,我真正想说的是:“将标签渲染到图形底部下方10个像素处”。

如何才能做到这一点?

标签: r

解决方案


对于位于条形图下方(在此类图的较大网格的底部)的水平 X 轴标签的恒定垂直偏移,事实证明,使用titleline属性具有一致的行为/放置,与设备大小无关。这是我现在要做的:

title(xlab=journey, line=0, cex=0.8, font.lab=2, xpd=NA)

其中line是整数并且0最接近绘图,并且较大的整数更远(在负 Y 方向上)。

对于图例,我想不出一个独立于网格尺寸或设备大小的恒定垂直偏移量。这里有几点:

  • yjust参数 tolegend 根本不起作用。我在网上找了一些例子,但无论我使用什么值,yjust都是不行的。
  • y参数确实有效,但遗憾的是,不能x;的描述性属性结合使用 也就是说,如果x设置为bottom,则不能同时设置y。我发现这种行为令人不安,因为我通常希望这些坐标彼此独立。

为了解决这些限制,这是我所做的:

yInset <- 0.4 * (1.075 - par("fin")[2] / dev.size("in")[2])
legend(x='bottom', yjust=-0.75, inset=c(0, -yInset), legend=abbrevLabels, fill=c(colors), xpd=NA, horiz=TRUE, bty="n", cex=1.0, adj=0.035, text.width=rep(meanLabelLen/7.5, length(legendLabels)))

该逻辑有效地设置了与网格尺寸和设备尺寸成比例的滑动 Y 偏移。1.075和的经验确定的比例/偏移因子0.4确实是粗略的,但现在就足够了。

legend如果上面引用的一些限制得到解决(或者在我误解文档的情况下可能更好地解释),这将有助于将来。


推荐阅读