拼布中色标的水平对齐

Horizontal alignment of colour scales in patchwork

我正在使用包 patchwork 垂直组合多个 ggplot2 图。我希望每个图的比例都直接在另一个上方,而不管比例名称的长度如何。目前,比例尺并未相互对齐。

如果可以的话,我愿意使用 ggpubrfacet_grid(),但我已经看到这些方面 doesn't allow multiple scales,但我还没有找到任何解决方案使用 ggpubr

library(ggplot2)
library(patchwork)

set.seed(0)
testdata <- data.frame(x=1:10, y=1:10, col=runif(10))

g1 <- ggplot(testdata, aes(x=x,y=y,col=col)) + geom_point() + 
  scale_color_gradient(name="Short")
g2 <- ggplot(testdata, aes(x=x,y=y,col=col)) + geom_point() + 
  scale_color_gradient(name="A rather longer name")
g1/g2

ggsave("testfile.tiff", units = "mm", device="tiff", 
       width=100, height=100, dpi = 100)

理想输出:

我也很想知道可以解决这个问题的拼凑参数,但我认为没有(如果我错了请纠正我)。您可能已经注意到 Hadley 的回答已有 10 多年历史,从那时起人们就一直在研究 ggplot2。 ggnewscale 包解决了每个图有多个比例的问题。这是使用多个色阶的多面方法:

library(ggplot2)
library(ggnewscale)

set.seed(0)
testdata <- data.frame(x=1:10, y=1:10, col=runif(10))

ggplot(mapping = aes(x = x, y, y)) +
  geom_point(data = transform(testdata, 
                              facet = factor("Top", c("Top", "Bottom"))),
             aes(colour = col)) +
  scale_colour_continuous(name = "Short") +
  new_scale_colour() +
  geom_point(data = transform(testdata,
                              facet = factor("Bottom", c("Top", "Bottom"))),
             aes(colour = col)) +
  scale_colour_continuous(name = "A rather longer name") +
  facet_wrap(~ facet, ncol = 1)

使用plot_layout你可以“收集”传说。这用作默认 theme(legend.position = 'right')。您可以在 plot_layout 和 & theme(legend.position = 'right') 之后添加它,如果您想更改图例的位置,可以调整位置。

g1/g2 + plot_layout(guides = 'collect') # & theme(legend.position = 'right') <- adjust position here!

ggsave("testfile.tiff", units = "mm", device="tiff", 
       width=100, height=100, dpi = 100)