首页 > 解决方案 > 将 ggplot 多面栅格地图与单个地图对齐(单独的图例)

问题描述

我想网格排列 2 个 grobs,一个是多面 ggplot,geom_raster另一个是单个 ggplotgeom_raster

问题是它们的尺寸非常不同;

# make some dummy rasters
r1 <- raster(xmn=0,xmx=100,ymn=0,ymx=150,res=1)
r1[] <- sample(50:60,ncell(r1),replace = T)
r2 <- raster(xmn=0,xmx=100,ymn=0,ymx=150,res=1)
r2[] <- sample(50:60,ncell(r2),replace = T)

# delta (will be on a very different scale to the originals and i dont want that info dampened)
r3 <- r1-r2

# stack rasters and send to melted DT
st_1 <- stack(r1,r2)
names(st_1) <- c("raster_1","raster_2")
dt_st_1 <- as.data.frame(st_1, xy=T)
dt_st_1_m <- setDT(melt(dt_st_1, id.vars = c("x","y")))

# melt the delta raster
dt_diff <- as.data.frame(r3, xy=T)
dt_diff_m <- setDT(melt(dt_diff, id.vars = c("x","y")))

# plot one is the two data surfaces, faceted geom_rasters
g1 <- ggplot() +
  geom_raster(data = dt_st_1_m , aes(x = x, y = y, fill = value))+
  scale_fill_viridis() + 
  coord_fixed()+
  facet_wrap(~variable)+
  guides(fill = guide_colourbar(barwidth = 1.5, barheight = 10))+
  theme(axis.line = element_blank(),
        axis.text = element_blank(),
        axis.title = element_blank(),
        panel.grid.major = element_line(colour = "transparent"),
        panel.background = element_rect(fill = NA, colour = NA),
        strip.text.x = element_text(size = 20),
        strip.background = element_rect(fill=NA),
        legend.text = element_text(hjust = 0, size = 12),axis.ticks = element_blank(),
        legend.title = element_text(size = 22, hjust = 1))

# plot two is just the single delta raster
g2 <- ggplot() +
  geom_raster(data = dt_diff_m , aes(x = x, y = y, fill = value))+
  scale_fill_viridis() + 
  coord_fixed()+
  ggtitle(bquote(Delta~layer)) +
  guides(fill = guide_colourbar(barwidth = 1.5, barheight = 10))+
  theme(axis.line = element_blank(),
        axis.text = element_blank(),
        axis.title = element_blank(),
        plot.title = element_text(size=20,hjust = 0.5,margin=margin(b = 1, unit = "pt")),
        panel.grid.major = element_line(colour = "transparent"),
        panel.background = element_rect(fill = NA, colour = NA),
        strip.text.x = element_blank(),
        strip.background = element_blank(),
        legend.text = element_text(hjust = 0, size = 12),axis.ticks = element_blank(),
        legend.title = element_text(size = 22, hjust = 1))

# now try to arrange the two plots/grobs in a single row
ggarrange(g1, g2, widths = c(2,1))

在此处输入图像描述

# try with patchwork package
(g1|g2)

在此处输入图像描述

# try with grid.arrange
gs <- list(g1,g2)
lay <- rbind(c(1,1,1,1,2,2),
             c(1,1,1,1,2,2))
grid.arrange(grobs=gs, layout_matrix = lay)

在此处输入图像描述

标签: rggplot2raster

解决方案


这似乎可以使用cowplot::plot_grid. 我敢肯定,您可以通过使用此处rel_widths检查每个图的高度来获得要使用的确切值,但看起来还可以:gtable_show_layout() 0.56

library(cowplot)
dd <- plot_grid(g1, g2, rel_widths = c(1, .56))
save_plot("test.png", dd, base_height = 9)

在此处输入图像描述


推荐阅读