当两个图表具有相同的X轴时,在x轴上对齐双线图和条形图.GGPLOT2

use*_*887 8 r ggplot2 gtable

我今天已经尝试了很长一段时间,但仍然无法通过X轴将两种不同的图表类型对齐,这些图表是相同的.当两个图表具有相同的X轴时,我只需要条形图顶部的双线图表.

下面的数据以及我到目前为止编写的代码以及一些不同的尝试.

我的数据:

Date <- c("2015-07-22", "2015-07-23", "2015-07-24", "2015-07-25", "2015-07-26", "2015-07-27", "2015-07-28", "2015-07-29", "2015-07-30", "2015-07-31", "2015-08-01", "2015-08-02", "2015-08-03", "2015-08-04", "2015-08-05")

Mean_temp12z <- c(66.6, 64.6, 67.6, 69.6, 72.0, 71.8, 73.0, 72.2, 72.8, 71.8, 69.4, 64.2, 61.2, 62.0, 63.4)

Mean_temp0z <- c(62.8, 65.0, 67.4, 71.6, 72.4, 71.6, 71.0, 71.8, 71.6, 69.6, 69.2, 66.2, 60.6, 63.6, 66.4)  

temp_deltalow <- c( 3.8, -0.4,  0.2, -2.0, -0.4,  0.2,  2.0,  0.4,  1.2,  2.2,  0.2, -2.0,  0.6, -1.6, -3.0)


GFS_low_changes <- data.frame(Date, Mean_temp12z, Mean_temp0z, temp_deltalow)
Run Code Online (Sandbox Code Playgroud)

到目前为止我绘制的是一个双线图,显示的代码如下图所示:

low_line <- ggplot(GFS_low_changes, aes(Date))+ geom_line(aes(y= Mean_temp12z, colour= "Mean_temp12z" ))+ geom_line(aes(y= Mean_temp0z, colour= "Mean_temp0z"))+
  geom_point(aes(y= Mean_temp12z))+ geom_point(aes(y= Mean_temp0z))+
  theme(legend.title= element_text(colour="black", size=12))+
  scale_color_discrete(name="GFS Models")+ labs(y= "Temperature °F")
Run Code Online (Sandbox Code Playgroud)

双线图

我还绘制了一个条形图,显示了0z模型和12z模型之间的增量,显示的代码和图像如下:

low_bar <- ggplot(data = GFS_low_changes, aes(x= Date, y = temp_deltalow)) + 
  geom_bar(colour= "black", fill= ifelse(temp_deltalow>0,"red","blue"), stat= "identity", position = "identity") +
  geom_text(aes(label= paste(temp_deltalow, "°F"),hjust= 0.4, vjust= ifelse(temp_deltalow>0,-0.5,1)), size= 5)
Run Code Online (Sandbox Code Playgroud)

酒吧情节

因此,在创建了这两个图形的情况下,我想将它们在X轴上与条形图顶部的折线图合并.两者之间的无缝间距是可取的,但我无法让它们接近排队.

我尝试使用grid.drawgridExtra包中的函数和代码:

  grid.newpage() 
grid.draw(rbind(ggplotGrob(low_line), ggplotGrob(low_bar), recording= T)) 
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误告诉我:错误:ncol(x)== ncol(y)不为TRUE

我也使用过grid.arrange哪种方式可以获得更好的结果,但是没有接近相同的x轴和两个图表之间的无缝集成.

我想避免在这里运行,但我确实试图融化上面的数据框,只能成功绘制折线图.但是,这方面的任何帮助也非常感谢.

我在尝试期间主要是运行这个例子:https://gist.github.com/tomhopper/faa24797bb44addeba79

任何有关此问题的帮助非常感谢!

bap*_*ste 12

你可以使用combine()gridExtra(gtable :: join的修改版本),

library(gridExtra)

g1 <- ggplotGrob(low_line)
g2 <- ggplotGrob(low_bar)
colnames(g1) <- paste0(seq_len(ncol(g1)))
colnames(g2) <- paste0(seq_len(ncol(g2)))

grid.draw(combine(g1, g2, along=2))
Run Code Online (Sandbox Code Playgroud)

可以获得相同的结果gtable,但它不太方便,因为i)join有bug(dev版本是固定的),ii)rbind不喜欢比较单位unit.pmax.这就是我现在在gridExtra中复制这些函数的原因.

在此输入图像描述

  • 我相信`join`现在被称为`combine`. (3认同)

pic*_*ick 3

这将对齐 x 轴并修复布局。然而,数字之间仍然存在间距。

\n\n
## Specify the xlimits\nxlims <- as.Date(c("2015-07-21", "2015-08-06"))\n\n## low_bar as you had it, except the ylimits are adjusted for labels and xlims added\nlow_bar <- ggplot(data = GFS_low_changes, aes(x= Date, y = temp_deltalow)) + \n  geom_bar(colour= "black", fill= ifelse(temp_deltalow>0,"red","blue"), stat= "identity", position = "identity") +\n  geom_text(aes(label= paste(temp_deltalow, "\xc2\xb0F"),hjust= 0.4, vjust= ifelse(temp_deltalow>0,-0.5,1)), size= 5) +\n  ylim(-4, 5) +\n  xlim(xlims)\n\n## low_line, legend is changed and xlims is added\nlow_line <- ggplot(GFS_low_changes, aes(Date)) +\n  geom_line(aes(y= Mean_temp12z, colour= "Mean_temp12z" )) +\n  geom_line(aes(y= Mean_temp0z, colour= "Mean_temp0z"))+\n  geom_point(aes(y= Mean_temp12z))+\n  geom_point(aes(y= Mean_temp0z))+\n  theme(legend.title= element_text(colour="black", size=12))+\n  scale_color_discrete(name="GFS Models")+ labs(y= "Temperature \xc2\xb0F") +\n  theme(legend.position = c(0.9,0.8)) +\n  xlim(xlims)\n\n## Construct the layout, 2 rows one column\ngrid.newpage()\npushViewport(viewport(layout = grid.layout(2, 1)))\nprint(low_bar, vp = viewport(layout.pos.row = 2, layout.pos.col=1))\nprint(low_line, vp = viewport(layout.pos.row = 1, layout.pos.col=1))\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述

\n