2016-06-30 14 views
1

Ich machte ein Gitter, ich zeichnete einige Linien zwischen jeder Zelle. Ich möchte Text in der oberen linken Ecke einer Zelle, aber ich kann nur Ausrichtung relativ zum Zentrum der Zelle bekommen.Text an Kante des Gitters ausrichten R

Ich habe viel Zeit mit der Suche verbracht, und dies ist das nächste, was ich finden konnte ist What do hjust and vjust do when making a plot using ggplot?. Die [0,1] -Werte von hjust und vjust richten den Text in Bezug auf die Punkte in diesem Beispiel aus und auf einem Raster (mit grid.text) richten sie den Text relativ zum Mittelpunkt der Zelle aus. Ich habe Werte außerhalb von [0,1] ohne Glück versucht; Ich habe versucht, Dezimalstellen bei der Angabe der Zeile/Spalte (1,5 sollte zwischen Zeile 1 und 2 rechts?) Für die Textplatzierung, aber die Dezimalstellen nur gerundet werden. Ich kann nicht von Hand ausrichten, weil mein Skript viele Namen variabler Länge ausrichtet.

-Code das Raster-Layout:

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)) 

Angenommen, die 29s sind variable Zahlen, ich sie von etwas speziellere ändern musste. Wenn der Code das Raster nicht layout, muss ich eine zusätzliche Klammer gelöscht haben. Der einzige andere Code, den ich gerade habe, plaziert den Text in der Nähe der Mitte einer Gitterzelle.

Mein Ziel ist es, Text so zu platzieren, dass der erste Buchstabe in der oberen linken Ecke neben den Gitternetzlinien ist. Jede Anleitung wird sehr geschätzt.

Antwort

0

Sie können es einfacher finden, mit einem gtable zu arbeiten. In diesem Fall kann jedes Label in seiner eigenen Zelle zentriert werden. Andernfalls müssten Sie bei Ihrer Strategie alle x- und y-Positionen verfolgen (oder so viele einzelne Ansichtsfenster definieren, aber das ist im Wesentlichen das, was gtable über dem Raster macht).

Hier ist ein Beispiel (I verwendet tableGrob die gtable nur für Bequemlichkeit einzurichten),

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) 

enter image description here

Beachten Sie, dass diese Strategie jedoch sehr ineffizient ist, weil es von machen keinen Gebrauch vektorisierte Grobs (stattdessen werden einzelne Groabs platziert). Für einen Tisch, der klein genug ist, spielt es keine Rolle, und der Komfortgewinn kann sich lohnen. Weitere Beispiele für die Verarbeitung von gtable finden Sie unter this wiki page.

Verwandte Themen