使用R的layout布局:在热图上方叠加降水趋势图的实现问题
R语言:组合热图与上方降水折线图的布局方案
你遇到的核心问题是基础绘图系统(wtr.heat.map属于这类)和ggplot绘图系统不兼容layout布局,同时原代码的layout矩阵定义有误。下面给出两种可行的解决方案:
方案一:统一用基础绘图系统(推荐,适合已有基础热图的情况)
调整layout矩阵,并将降水图改用基础绘图函数绘制,这样可以正常使用layout布局:
# 定义布局:2行1列,第一行放降水图(高度占1份),第二行放热图(高度占2份) layout(matrix(c(2, 1), nrow = 2, ncol = 1), heights = c(1, 2)) # 绘制热图(下方图) par(mar = c(4, 4, 0, 1)) # 上方边距设为0,避免和降水图重叠;右边留少量边距 TalusNorthHeatMap <- wtr.heat.map(TalusNorthdf, zlim = c(0, 20), xlab = "Date", ylab = "Depth (m)") # 绘制降水折线图(上方图),隐藏x轴、保留y轴 par(mar = c(0, 4, 1, 1)) # 下方边距设为0,隐藏x轴空间 plot(PrecipTS$Date, PrecipTS$Precip...mm., type = "l", xlab = "", ylab = "Precipitation (mm)", xaxt = "n") # xaxt="n" 隐藏x轴刻度与标签
方案二:用patchwork组合ggplot与基础热图(如果坚持用ggplot画降水图)
需要借助patchwork和gridGraphics包,将基础热图转换为ggplot兼容的对象:
# 安装并加载所需包 install.packages(c("patchwork", "gridGraphics")) library(patchwork) library(gridGraphics) # 绘制基础热图并转换为grob对象 wtr.heat.map(TalusNorthdf, zlim = c(0, 20), xlab = "Date", ylab = "Depth (m)") heatmap_grob <- grid.grab() # 捕获当前绘图为grob # 绘制ggplot降水图,隐藏x轴元素 precip_plot <- ggplot(data = PrecipTS, aes(x=Date, y=Precip...mm.))+ geom_line()+ labs(y="Precipitation (mm)")+ theme( axis.title.x = element_blank(), # 隐藏x轴标题 axis.text.x = element_blank(), # 隐藏x轴刻度文本 axis.ticks.x = element_blank() # 隐藏x轴刻度线 ) # 组合两个图,设置高度比例1:2 precip_plot / heatmap_grob + plot_layout(heights = c(1, 2))
关键说明
layout仅支持基础绘图系统,ggplot属于独立的grid绘图系统,两者不能直接混用layout。- 边距调整(
par(mar)或ggplot的theme)是避免轴标签重叠的关键,根据你的实际图大小可微调数值。
内容的提问来源于stack exchange,提问作者Heather Shaw
相关产品推荐
相关产品推荐

