使用 R ggplot2 右对齐多个图的水平 y 轴标题

标签 r ggplot2 gridextra cowplot ggdendro

我在正确对齐 R ggplot2 中多个绘图的水平 y 轴标题时遇到问题。我有一个主图,它是使用 ggdendro 包创建的带有叶子标签的树状图,并且主图下方有多个颜色条,标题位于左侧。如果我使用 grid.arrange 将图放置在同一页面上,我能够在图之间获得良好的垂直间距,但我无法一致地右对齐颜色条的 y 轴标题。如果我使用plot_grid,我可以一致地右对齐 y 轴标题,但我无法在图之间获得适当的垂直间距。任何帮助将不胜感激!

更新:两个建议的解决方案同样有效,因此我接受第一个作为答案。使用 Egg 包中的 ggarrange 并使用 plot_gridalign = "v" 而不是 align = "hv"两者都解决了我的问题。

创建主图和颜色条:

require(ggplot2)
require(gridExtra)
require(cowplot)
require(ggdendro)

hc = hclust(dist(USArrests), "ave")
df = data.frame(cluster = cutree(hc, 6),
                states = factor(hc$labels, levels = hc$labels[hc$order]))
p1_dendro = dendro_data(hc)

p1 = ggdendrogram(hc) +
  coord_cartesian(xlim = c(-1, nrow(df) + 1), ylim = c( -1, max(p1_dendro$segments$y)), expand = F)

p2 = ggplot(df, aes(states, y = 1, fill = factor(cluster))) + 
  ylab("y label") +
  geom_tile() + theme_minimal() +
  coord_cartesian(xlim = c(-1, nrow(df) + 1), expand = F) +
  theme(axis.title.x = element_blank(),
        axis.title.y = element_text(angle = 0, vjust = 0.5, hjust = 1),
        axis.ticks = element_blank(),
        axis.text = element_blank(),
        legend.position = "none",
        line = element_blank())

p3 = ggplot(df, aes(states, y = 1, fill = factor(cluster))) +
  ylab("a longer y label") +
  geom_tile() + theme_minimal() +
  coord_cartesian(xlim = c(-1, nrow(df) + 1), expand = F) +
  theme(axis.title.x = element_blank(),
        axis.title.y = element_text(angle = 0, vjust = 0.5, hjust = 1),
        axis.ticks = element_blank(),
        axis.text = element_blank(),
        legend.position = "none",
        line = element_blank())

grid.arrange方法:

gp1 = ggplotGrob(p1)
gp2 = ggplotGrob(p2)  
gp3 = ggplotGrob(p3)

maxWidth = grid::unit.pmax(gp1$widths[2:5], gp2$widths[2:5], gp3$widths[2:5])
gp1$widths[2:5] = as.list(maxWidth)
gp2$widths[2:5] = as.list(maxWidth)
gp3$widths[2:5] = as.list(maxWidth)

grid.arrange(gp1, gp2, gp3, ncol = 1, heights = c(8,1,1))

enter image description here

plot_grid方法:

plot_grid(p1, p2, p3, ncol = 1, align = "hv", axis = "tblr", rel_heights = c(8,1,1))

enter image description here

最佳答案

egg包将完成工作

require(ggplot2)
require(ggdendro)

hc = hclust(dist(USArrests), "ave")
df = data.frame(cluster = cutree(hc, 6),
                states = factor(hc$labels, levels = hc$labels[hc$order]))
p1_dendro = dendro_data(hc)

p1 = ggdendrogram(hc) +
  coord_cartesian(xlim = c(-1, nrow(df) + 1), ylim = c( -1, max(p1_dendro$segments$y)), expand = F)

p2 = ggplot(df, aes(states, y = 1, fill = factor(cluster))) + 
  ylab("y label") +
  geom_tile() + theme_minimal() +
  coord_cartesian(xlim = c(-1, nrow(df) + 1), expand = F) +
  theme(axis.title.x = element_blank(),
        axis.title.y = element_text(angle = 0, vjust = 0.5, hjust = 1),
        axis.ticks = element_blank(),
        axis.text = element_blank(),
        legend.position = "none",
        line = element_blank())

p3 = ggplot(df, aes(states, y = 1, fill = factor(cluster))) +
  ylab("a longer y label") +
  geom_tile() + theme_minimal() +
  coord_cartesian(xlim = c(-1, nrow(df) + 1), expand = F) +
  theme(axis.title.x = element_blank(),
        axis.title.y = element_text(angle = 0, vjust = 0.5, hjust = 1),
        axis.ticks = element_blank(),
        axis.text = element_blank(),
        legend.position = "none",
        line = element_blank())

使用 ggarrange()p1p2p3 堆叠在一起

# install.packages("egg", dependencies = TRUE)
library(egg)
ggarrange(p1, p2, p3, 
          ncol = 1,
          heights = c(8, 1, 1))

reprex package于2020年8月6日创建(v0.3.0)

关于使用 R ggplot2 右对齐多个图的水平 y 轴标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63277439/

相关文章:

r - 在箱线图中标记一个点

r - 如何用tableGrob显示表格的标题?

r - 在 grid.draw 中显示美元符号

r - 我如何摆脱 arrangeGrob 中的随机背景网格

r - 如何在 bookdown::gitbook 中使用自定义 pandoc HTML 模板

regex - R:gsub 和捕获

r - gridsvg 在函数内部使用时不起作用

r - ggplot热图无法填充瓷砖

r - Highcharter 不同系列的数据标签

r - 找不到 gfortran 4.8 来构建包