r - 将 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)
解决方案
这似乎可以使用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)
推荐阅读
- assembly - 如何在 32 位内核中静态定义低 16 位地址的 IDT(使用 gcc 内联汇编)
- c - 构建 json-c 时更改库输出目录
- java - 如何在点击 android 推送通知时在外部浏览器中打开 url?
- java - 使用 Docker 容器访问 Accumulo 2.0.0
- r - 基于其他列值的行单元格值
- reactjs - 最大更新深度超出错误,React-image-crop
- visual-studio-code - LaTex 不会在 VS Code 中的 jupyter notebook 中呈现,但会运行 jupyter notebook
- adonis.js - Adonis factory TypeError:无法读取未定义的属性“名称”
- r - 在函数内的 data.table 对象中插入数据
- google-chrome-extension - chrome.storage.X.get 很慢。如何在页面加载开始工作之前获取值?