将 ggplot 多面栅格地图与单个地图对齐(单独的图例)
aligning ggplot faceted raster maps with a single map (separate legends)
我想用网格排列 2 个 grob,一个是 geom_raster
的多面 ggplot,另一个是 geom_raster
的单个 ggplot
问题是它们的尺寸差异很大;
# 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)
我建议使用拼凑代码并使绘图 window 更宽或使用以下方法为第一个绘图提供更多可用绘图宽度:
library(patchwork)
g1 + g2 + plot_layout(widths = c(2,1))
这似乎可以使用 cowplot::plot_grid
。我确定您可以通过使用 gtable_show_layout()
检查每个地块的高度来获得要在 rel_widths
中使用的确切值,但是 0.56
看起来不错:
library(cowplot)
dd <- plot_grid(g1, g2, rel_widths = c(1, .56))
save_plot("test.png", dd, base_height = 9)
我想用网格排列 2 个 grob,一个是 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))
# 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)
我建议使用拼凑代码并使绘图 window 更宽或使用以下方法为第一个绘图提供更多可用绘图宽度:
library(patchwork)
g1 + g2 + plot_layout(widths = c(2,1))
这似乎可以使用 cowplot::plot_grid
。我确定您可以通过使用 gtable_show_layout()
rel_widths
中使用的确切值,但是 0.56
看起来不错:
library(cowplot)
dd <- plot_grid(g1, g2, rel_widths = c(1, .56))
save_plot("test.png", dd, base_height = 9)