首页 > 解决方案 > 使用 Cowplot 将绘图与不同的轴垂直对齐

问题描述

我正在尝试在左侧 y 轴上对齐三个图(在 y 轴上具有不同的比例)。换句话说,我希望红轴对齐:

在此处输入图像描述

但是,第一个图的 y 轴与左下图的 y 轴不对齐。

代码

# Libraries
library(tidyverse)
library(cowplot)

df1 <- data.frame(x = seq(0, 100, 1), 
                  y = seq(100, 0, -1))

df2 <- data.frame(x = seq(0, 10, 0.1), 
                  y = seq(1, 10^9, length.out = 101 ) )

p1 <- ggplot(data = df1) + 
  geom_line(aes(x = x, y = y))

p2 <- ggplot(data = df2) + 
  geom_line(aes(x = x, y = y))

combi_p2 <- plot_grid(p2, p2, nrow = 1)
plot_grid(p1, combi_p2, ncol = 1, axis = "l", align = "v")

尝试修复它

使用此处提供的信息,我重写了代码的最后一部分:

require(grid)                    # for unit.pmax()
p1 <- ggplotGrob(p1)             # convert to gtable
combi_p2 <- ggplotGrob(combi_p2) # convert to gtable

p1.widths <- p1$widths[1:3]      # extract the first three widths, 
                                 # corresponding to left margin, y lab, and y axis
combi_p2.widths <- combi_p2$widths[1:3]                 # same for combi_p2 plot
max.widths <- unit.pmax(p1.widths, combi_p2.widths)     # calculate maximum widths
p1$widths[1:3] <- max.widths                            # assign max. widths to p1 gtable
combi_p2$widths[1:3] <- max.widths                      # assign max widths to combi_p2 gtable

# plot_grid() can work directly with gtables, so this works
plot_grid(p1, combi_p2, labels = "AUTO", ncol = 1)

可悲的是,我无法修复对齐:

在此处输入图像描述

问题

如何使用R中的cowplot将顶部图的y轴与左下图对齐?

标签: rggplot2cowplot

解决方案


此处cowplot介绍了 Claus O. Wilke的解决方案。

它基于align_plot函数,它首先将顶部图与左底部图沿 y 轴对齐。然后将对齐的图传递给plot_grid函数。

# Libraries
library(tidyverse)
library(cowplot)

df1 <- data.frame(x = seq(0, 100, 1), 
                  y = seq(100, 0, -1))

df2 <- data.frame(x = seq(0, 10, 0.1), 
                  y = seq(1, 10^9, length.out = 101 ) )

p1 <- ggplot(data = df1) + 
  geom_line(aes(x = x, y = y))

p2 <- ggplot(data = df2) + 
  geom_line(aes(x = x, y = y))

plots <- align_plots(p1, p2, align = 'v', axis = 'l')
bottom_row <- plot_grid(plots[[2]], p2, nrow = 1)

plot_grid(plots[[1]], bottom_row, ncol = 1)

在此处输入图像描述


推荐阅读