2011-12-23 13 views
27

De la ayuda encuentran aquí he conseguido crear este panel G. múltiple: enter image description here con el siguiente código:Lugar título del panel de G. múltiple con ggplot2

library(zoo) 
library(ggplot2) 

datos=read.csv("paterna.dat",sep=";",header=T,na.strings="-99.9") 

datos$dia=as.POSIXct(datos[,1], format="%y/%m/%d %H:%M:%S") 

datos$Precipitación[is.na(datos$Precipitación)]=0 
xlim = as.POSIXct(c("2010-05-12 00:00:00", "2010-05-12 23:50:00")) 
ylim = trunc(max(datos$Precipitación) + 5) 
tmax = trunc(max(datos$Temperatura) + 5) 
tmin = trunc(min(datos$Temperatura) - 5) 

tmx = max(datos$Temperatura) 
tmxpos=which.max(datos$Temperatura) 
tmn = min(datos$Temperatura) 
tmnpos=which.min(datos$Temperatura) 

tmp=ggplot(data=datos,aes(x=dia, y=Temperatura)) + geom_line(colour="red") + ylab("Temperatura (ºC)") + 
xlab(" ") + scale_x_datetime(limits=xlim ,format = "%H",major='hour') + scale_y_continuous(limits = c(tmin,tmax)) + geom_text(data=datos[tmxpos,], label=tmx, vjust=-1.5, colour="red") + geom_text(data=datos[tmnpos,], label=tmn, vjust=1.5, colour="blue") 

pre=ggplot(data=datos,aes(x=dia, y=Precipitación)) + geom_bar(colour="blue",stat="identity",fill="blue") + 
ylab("Precipitación (l)") + xlab("Hora solar") + scale_x_datetime(limits=xlim ,format = "%H",major='hour') + scale_y_continuous(limits=c(0,ylim)) 

vel=ggplot(data=datos,aes(x=dia, y=Velocidad)) + geom_line(colour="brown") + ylab("Velocidad (km/h)") + xlab(" ") + scale_x_datetime(limits=xlim ,format = "%H",major='hour') + scale_y_continuous(limits = c(0,100)) 

dir=ggplot(data=datos,aes(x=dia, y=Dirección)) + geom_line(colour="brown") + ylab("Dirección viento (grados)") + xlab(" ") + scale_x_datetime(limits=xlim ,format = "%H",major='hour') + scale_y_continuous(limits = c(0,360)) 

hum=ggplot(data=datos,aes(x=dia, y=Humedad.Relativa)) + geom_line(colour="blue") + ylab("Humedad relativa (%)") + xlab(" ") + scale_x_datetime(limits=xlim ,format = "%H",major='hour') + scale_y_continuous(limits = c(0,100)) 

grid.newpage() 
pushViewport(viewport(layout = grid.layout(3, 2))) 
print(tmp, vp = viewport(layout.pos.row = 1, layout.pos.col = 1))   
print(vel, vp = viewport(layout.pos.row = 1, layout.pos.col = 2)) 
print(dir, vp = viewport(layout.pos.row = 2, layout.pos.col = 2)) 
print(hum, vp = viewport(layout.pos.row = 2, layout.pos.col = 1)) 
print(pre, vp = viewport(layout.pos.row = 3, layout.pos.col = 1:2)) 

Ahora me falta el título de la G. múltiple que quiero ser el conocido. Nombre de estación. No he encontrado cómo establecer el título principal en grid.newpage o viewport. He leído sobre grid.arrange pero no he podido encontrar la forma de usarlo en mi caso.

¿Cómo se puede hacer esto? Seguro que será una pregunta fácil para ti.

puede encontrar los datos de origen en http://ubuntuone.com/4G01ifn7cJ1jMIOKh

Gracias de antemano

ACTUALIZACIÓN: Gracias a koshke he encontrado la solución. El código de trabajo es:

grid.newpage() 
pushViewport(viewport(layout = grid.layout(4, 2, heights = unit(c(0.5, 5, 5, 5), "null")))) 
grid.text("MAIN TITLE", vp = viewport(layout.pos.row = 1, layout.pos.col = 1:2)) 
print(tmp, vp = viewport(layout.pos.row = 2, layout.pos.col = 1))   
print(vel, vp = viewport(layout.pos.row = 2, layout.pos.col = 2)) 
print(dir, vp = viewport(layout.pos.row = 3, layout.pos.col = 2)) 
print(hum, vp = viewport(layout.pos.row = 3, layout.pos.col = 1)) 
print(pre, vp = viewport(layout.pos.row = 4, layout.pos.col = 1:2)) 
+0

de [este documento] (http://www.google.at/url?sa=t&rct=j&q=push.viewport()% 20title% 20for & source = web & cd = 2 & ved = 0CCYQFjAB & url = http% 3A% 2F% 2Fstat.ethz.ch% 2FR-manual% 2FR-devel% 2Flibrary% 2Fgrid% 2Fdoc% 2Fviewports.pdf & ei = 62b0TsOsD6ni4QTJwMmNCA & usg = AFQjCNHHdoDtfIENYhX4HsbkNArFtl91Yw & cad = rja) Encontré el comando (último página pero uno) pero no estoy seguro de si es lo que está buscando 'grid.text (" ¡El usuario agrega un título! ", gp = gpar (fontsize = 20))' – Seb

+0

@Seb, tal vez es posible adaptarse. Creo que tengo que nombrar viewports y luego buscar el que quiero colocar el texto. No estoy seguro de si va a funcionar, pero lo intentaré. Gracias – pacomet

+0

el documento vinculado describe cómo obtener la ventana gráfica que está buscando; siento no poder ser de mucha ayuda, ¡pero no tengo experiencia con esto! – Seb

Respuesta

21

Si he entendido bien lo que quiere hacer, es probable que pueda utilizar +opts(title = XXX):

p1 <- ggplot(mtcars, aes(factor(cyl))) + geom_bar() 
p2 <- ggplot(mtcars, aes(wt, mpg)) + geom_point() 
p3 <- p2 + geom_line() 

pushViewport(viewport(layout = grid.layout(2, 2))) 
print(p1 + opts(title = "bar"), 
    vp = viewport(layout.pos.row = 1, layout.pos.col = 1))  
print(p2 + opts(title = "point"), 
    vp = viewport(layout.pos.row = 1, layout.pos.col = 2))  
print(p3 + opts(title = "point and line"), 
    vp = viewport(layout.pos.row = 2, layout.pos.col = 1:2)) 

enter image description here

ACTUALIZADO

Aquí se presenta una ejemplo:

pushViewport(viewport(layout = grid.layout(3, 2, heights = unit(c(1, 4, 4), "null")))) 
grid.text("title of this panel", vp = viewport(layout.pos.row = 1, layout.pos.col = 1:2)) 
print(p1, vp = viewport(layout.pos.row = 2, layout.pos.col = 1)) 
print(p2, vp = viewport(layout.pos.row = 2, layout.pos.col = 2)) 
print(p3, vp = viewport(layout.pos.row = 3, layout.pos.col = 1:2)) 

lo que hay que hacer es:

  1. Hacer una fila adicional en grid.layout
  2. ajustar el ancho
  3. textGrob Dibujar en la fila de visualización adicional.

enter image description here

+0

Esto no es lo que necesito, tal vez no lo explique bien. Los datos provienen de una estación meteorológica, luego quiero ubicar el nombre y la fecha de la estación (un título) en la parte superior del panel. No necesito un título en cada gráfico (los eliminé de mi primer intento) ya que el eje y también nombra el gráfico. Gracias. – pacomet

+0

OK, lo he actualizado. Por el momento, el diseño de ggplot2 no es sencillo. Tal vez será más fácil en el futuro. – kohske

+0

Gracias koshke, está funcionando ahora. – pacomet

19
library(gridExtra) 

p <- ggplot() 

grid.arrange(p,p,p,p,p, top = "Title", 
      layout_matrix = matrix(c(1,2,3,4,5,5), ncol=2, byrow=TRUE)) 

enter image description here

+2

¿Podría explicar esto un poco? –

+0

@ DavoudTaghawi-Nejad https://github.com/baptiste/gridextra/wiki/arrangeGrob#title-andor-annotations – rawr

Cuestiones relacionadas