我制作了一个网格,我在每个单元格之间绘制了一些线条。 我希望文本位于单元格的左上角,但我只能相对于单元格的中心进行对齐。
我花了很多时间搜索,这是我能找到的最接近的What do hjust and vjust do when making a plot using ggplot?。 hjust和vjust的[0,1]值对齐文本以引用此示例中的点,并且在网格上(使用grid.text)它们将文本相对于单元格的中心对齐。我已经尝试了[0,1]以外的hvjust值而没有运气;我在指定行/列(1.5应该在第1行和第2行之间?)进行文本放置时尝试使用小数位,但小数只是四舍五入。我无法手动对齐,因为我的脚本应该对齐许多可变长度的名称。
布局网格的代码:
grid.newpage()
pushViewport(viewport(layout=grid.layout(29+1,7, heights = unit(rep(1,
(29+1), "null"), widths=unit(c(1,.5,.5,.5,1,1,1), "null"))))
grid.polyline(x=c(0,0,1,1,1.5,1.5,2,2,2.5,2.5,3.5,3.5,4.5,4.5,5.5,5.5)/5.5, y=rep(c(0,1), 8), id.lengths=rep(2,8))
grid.polyline(x=rep(c(0,1), 29+2), y=sort(rep(0:(29+1), 2)/(29+1)), id.lengths=rep(2,29+2))
假设29s是可变数字,我不得不从更具体的东西改变它们。如果代码没有布局网格,我必须删除一个额外的括号。我唯一的其他代码只是将文本放在网格单元格的近中心。
我的目标是放置文字,使第一个字母位于网格线旁边的左上角。非常感谢任何指导。
答案 0 :(得分:0)
您可能会发现使用gtable更容易,在这种情况下,每个标签都可以在其自己的单元格中居中。否则,根据您的策略,您需要跟踪所有x和y位置(或定义尽可能多的单个视口,但这基本上是gtable在网格顶部的作用)。
这是一个例子(我只是为了方便而使用tableGrob来设置gtable),
library(gtable)
library(gridExtra)
g <- tableGrob(matrix("", 29+1, 7), theme = ttheme_minimal())
g$widths <- unit(c(1,.5,.5,.5,1,1,1), "null")
g$heights <- unit(rep(1, (29+1)), "null")
vs <- replicate(ncol(g)-1,
segmentsGrob(x1 = unit(0, "npc"), gp=gpar(lwd=0.5)),
simplify=FALSE)
hs <- replicate(nrow(g)-1,
segmentsGrob(y1 = unit(0, "npc"), gp=gpar(lwd=0.5)),
simplify=FALSE)
g <- gtable::gtable_add_grob(g, grobs = vs,
t = 1, b = nrow(g), l = seq_len(ncol(g)-1)+1)
g <- gtable::gtable_add_grob(g, grobs = hs,
l = 1, r = ncol(g), t = seq_len(nrow(g)-1))
labels <- list(textGrob("l", hjust=0, x=0),
textGrob("c", hjust=0.5, x=0.5),
textGrob("r", hjust=1, x=1))
g <- gtable_add_grob(g, labels, t=c(1,2,3), l=c(2, 4, 7), z = -1)
grid.newpage()
grid.draw(g)
请注意,此策略效率非常低,因为它不使用矢量化grobs(而是放置单个grobs)。对于一个足够小的桌子来说,这可能并不重要,方便的收获也是值得的。有关gtable处理的更多示例,请参阅this wiki page。