You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

grid.arrange垂直排布图表X轴无法对齐的问题求助

解决垂直排布图表X轴对齐问题

问题根源

你的代码逻辑本身没问题,但新数据中Item列是长因子名称,导致两个图表的Y轴标签宽度差异,加上ggplot版本更新后ggplotGrob的布局索引可能变动,原代码中固定的widths[2:5]不再能准确匹配X轴相关的宽度单元,最终造成X轴错位。

解决方案

方案1:使用patchwork包(推荐,更简洁可靠)

patchwork是专门用于组合ggplot图表的工具,默认会自动对齐共享轴,无需手动调整宽度:

library(patchwork)

# 保留原有的图表生成逻辑
the.max <- ceiling(max(c(tab.13.3$value, peeps$measure))) +1
the.min <- floor(min(c(tab.13.3$value, peeps$measure))) -1

items.pts <- ggplot(tab.13.3, aes(x=value, y=Item)) +
    geom_point() +
    scale_x_continuous(limits=c(the.min, the.max)) +
    theme(axis.title.x = element_blank()) # 去掉下方图表X轴标题,避免重复

peeps.hist <- ggplot(peeps, aes(x=measure)) +
    geom_histogram() +
    scale_x_continuous(limits=c(the.min, the.max))

# 组合图表并设置参数
peeps.hist / items.pts + 
  plot_layout(heights = c(3, 2)) +
  plot_annotation(title = paste("Persons and Items for", params$themeas))

方案2:修复原grid.arrange代码

如果坚持使用grid.arrange,需要调整宽度匹配的索引,并强制Y轴标签宽度一致:

library(gridExtra)
library(grid)

# 原图表生成代码不变
the.max <- ceiling(max(c(tab.13.3$value, peeps$measure))) +1
the.min <- floor(min(c(tab.13.3$value, peeps$measure))) -1

items.pts <- ggplot(tab.13.3, aes(x=value, y=Item)) +
    geom_point() +
    scale_x_continuous(limits=c(the.min, the.max)) +
    theme(axis.text.y = element_text(width = unit(3, "cm"))) # 强制Y轴标签宽度统一

peeps.hist <- ggplot(peeps, aes(x=measure)) +
    geom_histogram() +
    scale_x_continuous(limits=c(the.min, the.max))

ggpeeps <- ggplotGrob(peeps.hist)
ggitems <- ggplotGrob(items.pts)

# 动态获取面板和X轴的布局列索引,替代固定的2:5
panel_col <- which(ggpeeps$layout$name == "panel")
axis_col <- which(ggpeeps$layout$name == "axis-b")

# 统一面板和X轴的宽度
maxPanelWidth <- unit.pmax(ggpeeps$widths[panel_col], ggitems$widths[panel_col])
maxAxisWidth <- unit.pmax(ggpeeps$widths[axis_col], ggitems$widths[axis_col])

ggpeeps$widths[panel_col] <- as.list(maxPanelWidth)
ggitems$widths[panel_col] <- as.list(maxPanelWidth)
ggpeeps$widths[axis_col] <- as.list(maxAxisWidth)
ggitems$widths[axis_col] <- as.list(maxAxisWidth)

grid.arrange(ggpeeps, ggitems, ncol=1, 
             heights=c(3, 2),
             top=paste("Persons and Items for", params$themeas))

额外建议

  • 手动指定scale_x_continuous的breaks参数,确保两个图表的X轴刻度完全一致,避免自动生成的刻度数量差异导致对齐问题。
  • 检查ggplot2和gridExtra的版本,版本更新可能改变布局结构,原代码的固定索引会失效。

内容的提问来源于stack exchange,提问作者Stuart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:25:56