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

如何在R中绘制共享X/Y轴的Tufte式多rug图?

解决方案:用patchwork包实现Tufte式多图对齐布局

核心思路

要实现《定量信息的视觉展示》中那种紧凑的多图布局,核心是统一共享轴的数值范围,并精准控制图间空白与对齐逻辑。patchwork是ggplot生态中处理多图组合的高效工具,能完美解决轴对齐和空白保留问题。

步骤1:安装并加载依赖包

install.packages("patchwork")
library(ggplot2)
library(patchwork)

步骤2:统一共享轴的范围(关键)

先计算所有需要共享轴的极值,确保不同子图的轴范围完全一致,这是对齐的基础:

# 计算Var1的X轴范围(所有以Var1为X轴的图共享)
x_var1_range <- range(df$Var1)
# 计算Var2的Y轴范围(plot1和plot2共享)
y_var2_range <- range(df$Var2)
# 计算其他Y轴的独立范围
y_var3_range <- range(df$Var3)
y_var4_range <- range(df$Var4)
y_var5_range <- range(df$Var5)

步骤3:绘制标准化子图

给每个子图设置统一轴范围,同时去掉冗余视觉元素(如轴标题、网格),贴近Tufte的极简风格:

# 修正你代码中重复定义plot4的问题,新增plot5
plot1 <- ggplot(df) +
  geom_point(aes(x = Var1, y = Var2)) +
  xlim(x_var1_range) +
  ylim(y_var2_range) +
  theme_minimal() +
  theme(axis.title = element_blank(), panel.grid = element_blank())

plot2 <- ggplot(df) +
  geom_point(aes(x = Var3, y = Var2)) +
  ylim(y_var2_range) +
  theme_minimal() +
  theme(axis.title = element_blank(), panel.grid = element_blank())

plot3 <- ggplot(df) +
  geom_point(aes(x = Var1, y = Var5)) +
  xlim(x_var1_range) +
  ylim(y_var5_range) +
  theme_minimal() +
  theme(axis.title = element_blank(), panel.grid = element_blank())

plot4 <- ggplot(df) +
  geom_point(aes(x = Var1, y = Var3)) +
  xlim(x_var1_range) +
  ylim(y_var3_range) +
  theme_minimal() +
  theme(axis.title = element_blank(), panel.grid = element_blank())

plot5 <- ggplot(df) +
  geom_point(aes(x = Var1, y = Var4)) +
  xlim(x_var1_range) +
  ylim(y_var4_range) +
  theme_minimal() +
  theme(axis.title = element_blank(), panel.grid = element_blank())

步骤4:用patchwork组合布局

按照Tufte图的结构(Var1为X轴的图垂直堆叠,共享Y轴的图水平对齐),用简洁语法组合:

# 左侧垂直堆叠所有以Var1为X轴的图,右侧放置与plot1共享Y轴的plot2
final_layout <- (plot1 / plot4 / plot5 / plot3) + plot2 +
  plot_layout(ncol = 2, widths = c(3, 1),  # 调整列宽比例,左侧占更大空间
              guides = "collect")  # 统一图例(如果有)

# 收紧整体空白,贴合紧凑风格
final_layout + plot_annotation(theme = theme(plot.margin = margin(5,5,5,5)))

替代方案:用cowplot实现

若偏好cowplot,可通过plot_grid的align参数强制对齐:

install.packages("cowplot")
library(cowplot)

# 垂直堆叠左侧图,对齐X轴
left_column <- plot_grid(plot1, plot4, plot5, plot3, ncol = 1, align = "v")
# 组合左右部分,对齐Y轴
final_plot <- plot_grid(left_column, plot2, ncol = 2, align = "h", rel_widths = c(3,1))
print(final_plot)

关键注意事项

  • 必须统一共享轴的范围:轴范围不一致会直接导致对齐失效。
  • 简化主题:去掉冗余元素,减少视觉噪音,契合Tufte的可视化原则。
  • 控制布局比例:通过宽度参数调整列占比,保证共享轴的图有合理展示空间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:40:03