当两个图表具有相同的X轴时,如何对齐双线图和条形图在X轴上。ggplot2

8

我今天尝试了相当长一段时间,仍然无法通过它们相同的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)

到目前为止,我所绘制的是一个双线图表,使用以下代码和下面的图片显示:

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

双线图表

我还绘制了一张柱状图,显示了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)

柱状图

有了这两张图,我想把它们融合在X轴上,线图在柱状图之上。最好两者之间无缝连接,但我一直没有办法让它们靠近对齐。

我已经尝试使用gridExtra包中的grid.draw函数,代码如下:

  grid.newpage() 
grid.draw(rbind(ggplotGrob(low_line), ggplotGrob(low_bar), recording= T)) 

但我收到错误信息:错误:ncol(x)== ncol(y)不为TRUE

我还使用了grid.arrange,这能给我更好的结果,但两个图表之间的x轴和无缝集成远远达不到预期。

我想避免在这里运行,但我尝试将上面的数据框融合并成功绘制了线图。但在这个领域任何帮助也将不胜感激。

我主要参考以下示例运行:https://gist.github.com/tomhopper/faa24797bb44addeba79

非常感谢您对此问题的帮助!


也许 "facet" 可以作为一个替代方案? - mts
@mts 当你在不同的图形中使用不同的几何对象时,让 facets(分面)起作用变得非常困难。 - Gregor Thomas
2个回答

12

你可以使用gridExtra中的combine()(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))

使用 gtable 可以得到相同的结果,但不太方便,因为 i) join 有错误(dev 版本已经修复),ii) rbind 不喜欢使用 unit.pmax 来比较单位。这就是为什么我现在在 gridExtra 中复制了这些函数。

enter image description here


非常有趣,感谢回复。我确实喜欢这里的布局,但希望第一张图上的点保持颜色编码,那将是理想的情况。我会进一步尝试你的解决方案,看看是否可以实现。谢谢你的帮助。 - user3720887
3
我认为 join 现在被称为 combine - Gebb

3
这将会对齐x轴并修复布局。但是,图形之间仍然存在间隙。
## Specify the xlimits
xlims <- as.Date(c("2015-07-21", "2015-08-06"))

## low_bar as you had it, except the ylimits are adjusted for labels and xlims added
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) +
  ylim(-4, 5) +
  xlim(xlims)

## low_line, legend is changed and xlims is added
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") +
  theme(legend.position = c(0.9,0.8)) +
  xlim(xlims)

## Construct the layout, 2 rows one column
grid.newpage()
pushViewport(viewport(layout = grid.layout(2, 1)))
print(low_bar, vp = viewport(layout.pos.row = 2, layout.pos.col=1))
print(low_line, vp = viewport(layout.pos.row = 1, layout.pos.col=1))

enter image description here


这很棒,虽然我希望能够通过X轴合并它们,但这也可以完美地工作。感谢您的帮助,非常感激! - user3720887

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接