Я хотел бы расположить по сетке 2 гроба, один - это фасетный ggplot geom_raster, а другой - один ggplot geom_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))

enter image description here

# try with patchwork package
(g1|g2)

enter image description here

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

enter image description here

1
Sam 26 Фев 2021 в 19:15

2 ответа

Лучший ответ

Кажется, это работает с использованием 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)

enter image description here

1
user63230 27 Фев 2021 в 11:29

Я бы предложил использовать код лоскутного шитья и либо сделать окно графика шире, либо дать первому графику больше доступной ширины графика, используя:

library(patchwork)
g1 + g2 + plot_layout(widths = c(2,1))

enter image description here

1
Jon Spring 26 Фев 2021 в 17:56