2012-12-04 20 views
6

Przygotowuję wykresy generowane przez ggplot2. Muszę użyć print, aby wydrukować działki i grid.draw, aby wyświetlić legendę.Jak zmienić pozycję grid.draw

Przykładowy kod:

p0 <- ggplot(data = iris, geom = 'blank', 
     aes(y = Petal.Width, x = Petal.Length, color = Species)) + geom_point() + 
     theme(axis.title.x = element_blank(), 
      axis.title.y = element_blank(), 
      legend.position = "none") 

p1 <- ggplot(data = iris, geom = 'blank', 
     aes(y = Petal.Length, x = Petal.Width, color = Species)) + geom_point() + 
     theme(axis.title.x = element_blank(), 
      axis.title.y = element_blank(), 
      legend.position = "none") 

g_legend <- function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    return(legend) 
} 

p <- ggplot(data = iris, geom = 'blank', 
     aes(y = Petal.Width, x = Petal.Length, color = Species)) + geom_point() 


grid.newpage() 
pushViewport(viewport(layout = grid.layout(2, 4))) 
print(p0,vp = viewport(layout.pos.row = 1, layout.pos.col = 1)) 
print(p0,vp = viewport(layout.pos.row = 1, layout.pos.col = 2:3)) 
print(p1,vp = viewport(layout.pos.row = 2, layout.pos.col = 2:3)) 
grid.text("This is x label",gp=gpar(fontsize = 14), vjust = 11, 
      vp = viewport(layout.pos.row = 2, layout.pos.col = 2)) 
grid.text("This is y label",gp=gpar(fontsize = 14), vjust = -11, rot = 90, 
      ![enter image description here][1]vp = viewport(layout.pos.row = 2, layout.pos.col = 2)) 

grid.draw(g_legend(p)) 

Chciałbym umieścić legendę w czwartej kolumnie. Jak mogę to zrobić? Dzięki.

+3

Mam wycofana twoje pytanie, ponieważ twoja ostatnia edycja zadaje nowe pytanie. – Andrie

Odpowiedz

9

enter image description here użyciu gridExtra

  library(gridExtra) 
     grid.arrange(p0 , p1, g_legend(p), ncol=3, 
     heights=c(10, 1),widths =c(1,2,1) ,as.table =TRUE) 
+0

Dzięki. Czy jest tam, aby trzymać się punktu pushview? Układam wiele działek i muszę ustawić długość i położenie dla każdego z nich, a także muszę użyć grid.text, aby dodać tekst do wykresu. – Autumn

+0

Nie odpowiadasz tej odpowiedzi? jeśli tak jest, sprawdź to wcześniej, a następnie lepiej zadać nowe pytanie, w którym szczegółowo wysyłasz prośbę (wiele działek, gtext, ..) – agstudy

+0

Edytowałem przykładowy kod i działkę. Czy możesz mi w tym pomóc? – Autumn

2

Można ręcznie zmienić współrzędne x i y w obiekcie TableGrob. Na przykład, można wykonać następujące czynności, aby umieścić legendę w środku działki:

leg <- g_legend(p) 
leg$vp$x <- unit(.5, 'npc') 
leg$vp$y <- unit(.5, 'npc') 

Po wywołaniu grid.draw (noga), zostanie ona umieszczona w środku. Użyj różnych wartości, aby umieścić go tam, gdzie chcesz.

+1

Chyba masz na myśli: noga $ VP $ x <- jednostka (0,5 'NPC') noga $ VP $ y <- jednostka (0,5 'NPC') a następnie jak pan powiedział, grid.draw (noga) – maia

2

w siatce, pomysł będzie naciskać rzutnię, w której chcesz rysować,

pushViewport(viewport(layout.pos.row = 2, layout.pos.col = 4)) 
grid.draw(g_legend(p)) 

lub, alternatywnie, przypisać rzutnię do Grob legendy

leg = g_legend(p) 
leg$vp = viewport(layout.pos.row = 2, layout.pos.col = 4) 
grid.draw(leg) 
Powiązane problemy