我们目前正在使用R
自动生成各种boxplots
.
我们遇到的问题是,我们的标签长度在一个图中的不同图和类之间有很大差异。
有没有办法自动调整绘图,以便所有标签都适合它?
指定最坏情况mar
是不可行的,因为在某些图中,标签比其他图短得多。
Lattice 是最有可能在这里提供帮助的图形库。我说这有两个原因:(i)lattice 基于网格系统,通过访问网格的图形基元,您可以更好地控制面板输出的位置等;并且 (ii) 还有更多可以使用的东西——R 标准图形包有 70 个不同的参数,而 Lattice 有 371 个——无论如何,(长度(名称(unlist(trellis.par.get())))) ,但是这 371 个不像基本包那样处于平面结构中,而是以分层结构收集(在顶层有 30 个左右的参数组)。
您想要的是轴标签的相对定位。我建议为此类任务降低一个级别。所以要做你想做的,只需更改相关的 grob 插槽,然后重绘两个 grob(使用 R 交互式提示):
library(lattice)
library(grid)
bwplot(~runif(200, 10, 99), xlab="x-axis label", ylab="y-axis label")
# move the x-axis label to the far left
grid.edit("[.]xlab$", grep=T, x=unit(0, "npc"), just="left", redraw=T)
# move it to the far right
grid.edit("[.]xlab$", grep=T, x=unit(1, "npc"), just="right", redraw=T)
# move it to the center
grid.edit("[.]xlab$", grep=T, x=unit(0.5, "npc"), just="center", redraw=T)
# same for y-axis
grid.edit("[.]ylab$", grep=T, y=unit(0.5, "npc"), just="center", redraw=T)
"[.].xlab$", grid.edit 接受一个 gPath 对象(只是一个遍历 gTree 的路径,它只是一个包含其他 grobs 的 grob);因为我不知道我感兴趣的对象在 gPath 中的哪个位置(x 轴/y 轴标签,我对对象使用了正则表达式形式;
"grep=T",只是告诉grid.edit把前面的参数当作正则表达式;
"x=unit(0.5, 'npc')",在这里指定视口坐标(在这种情况下,只是 x 值);'npc'('标准化父坐标',默认值)将视口原点视为 (0,0),并为其分配宽度和高度各 1 个单位。因此,我指定了沿 x 轴的视口中心。
使用基本绘图系统,一个快速的解决方案可能是将 x 标签旋转为垂直,使用las=2
或las=3
。当然,这也仅在您的标签不是很长的情况下才有效,但是超过一定的标签长度,无论如何您都会遇到任何类型的情节的麻烦(缩短标签将是当时的方法)。
但我同意@doug 的观点,对于更细粒度的控制,应该考虑 lattice 或 ggplot2。