【问题标题】:Place title of multiplot panel with ggplot2用 ggplot2 放置多图面板的标题
【发布时间】:2011-12-23 11:27:38
【问题描述】:

从这里找到的帮助中,我设法创建了这个多图面板: 使用以下代码:

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

现在我错过了我想要满足的多重情节的标题。站名。我还没有找到如何在 grid.newpage 或 viewport 上设置主标题。我已经阅读了有关 grid.arrange 的信息,但不知道如何在我的情况下使用它。

如何做到这一点?当然,这对你来说是一个简单的问题。

您可以在http://ubuntuone.com/4G01ifn7cJ1jMIOKh找到源数据

提前致谢

更新:感谢 koshke,我找到了解决方案。工作代码是:

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

【问题讨论】:

  • 来自this document 我找到了命令(最后一页,但只有一个),但我不确定它是否是您正在寻找的grid.text("The user adds a title!", gp = gpar(fontsize = 20))
  • @Seb,也许可以适应。我想我必须命名视口,然后寻找我想要放置文本的视口。不确定它是否会起作用,但会尝试。谢谢
  • 链接的文档描述了如何获得您正在寻找的视口 - 抱歉,我帮不上忙,但我没有这方面的经验!
  • 试过但没有完全工作,它在页面中心绘制标题可能是因为只有一个视口。这是有希望的,所以我必须更深入地了解视口。谢谢

标签: r ggplot2


【解决方案1】:
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))

【讨论】:

  • 你能解释一下吗?
  • @rawr,这个链接恐怕已经失效了
  • @DaveRGP 我认为this 是它,this 也可能有用。我不确定为什么 baptiste 的 repo 从他的 github 页面上消失了
【解决方案2】:

如果我理解正确你想做什么,也许你可以使用+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))

更新

这是一个例子:

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

你需要做的是:

  1. 在 grid.layout 中多做一行
  2. 调整宽度
  3. 在额外的视口行上绘制 textGrob。

【讨论】:

  • 这不是我需要的,可能我没有解释好。数据来自气象站,然后我想将站名和日期(标题)放在面板顶部。我不需要每个图表中的标题(我从第一次尝试中删除了它们),因为 y 轴也为图表命名。谢谢。
  • 好的,我已经更新了。目前,ggplot2 的布局并不简单。也许以后会更容易。
猜你喜欢
  • 2013-07-08
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多