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

基础R语言多图排版时如何正确设置边距避免图形挤压变形

问题核心原因

你现在的排版混乱、图形被挤压本质是三个低级错误导致的:

  • layout()布局定义完全不合理:你写的matrix(c(1,2,3,4,5,6,7,8,9,0), 5, 2, byrow = TRUE)是5行2列共10个绘图位,9张图按行填充后,最后1个位置留空,相当于把整张画布的纵向高度拆成5等份、横向拆成2等份,单张子图的宽高比达到2.5:1,是非常扁的横向矩形,直方图自然会被压扁。
  • 边距设置和布局不匹配:你一开始把mar设为全0,标题、坐标轴标签根本没有预留显示空间,直接被裁掉;后来加了边距,但因为子图本身的绘图区形状太扁,边距占了一部分高度后,留给直方图的空间就更窄了。
  • 标题表达式写法错误:你写的substitute(paste("Empirical distribution of"), list(h=...))没有把序号参数嵌入文本,所有图的标题都不会显示对应的β下标序号。
可直接运行的修正代码

9张子图最合理的布局是3行3列等大小网格,刚好匹配9张图的数量,单张子图宽高比接近1:1,完全适配直方图的展示需求,不会出现挤压变形:

# 提前开足够大的绘图窗口,避免R/RStudio默认小窗格压缩图形
# 如果要导出为本地图片,直接把dev.new替换为png/pdf等设备函数,在参数里固定宽高即可
dev.new(width = 11, height = 10, noRStudioGD = TRUE)

# 定义3*3等分布局,按行填充9张子图
layout(matrix(1:9, nrow = 3, ncol = 3, byrow = TRUE))

# 统一设置每个子图的边距和字号,给标签、标题留足空间又不浪费
par(
  mar = c(4, 4, 3, 1), # 边距顺序:下、左、上、右,单位为文本行数
  cex.main = 0.9, # 适当缩小标题字号避免溢出
  cex.lab = 0.85,
  cex.axis = 0.75
)

# 循环绘图,修正标题表达式
for(k in 1:9){
  dat <- rnorm(200)
  hist(
    dat, 
    prob = TRUE,
    main = substitute(paste("Empirical distribution of ", beta[h]), list(h = k)),
    xlab = substitute(beta[h], list(h = k)),
    ylab = "Density"
  )
  lines(density(dat), lwd = 2, col = "steelblue")
}

# 用png/pdf导出时最后加dev.off()关闭设备即可
可选调整说明
  • 如果你坚持要用非33的布局(比如你原来的5行2列),需要在layout()里加heights参数调整每行的高度占比,同时把空位置对应的区域做合并处理,但这种布局天然不均衡,9张图用33是视觉效果最舒服、空间利用率最高的选择。
  • 如果需要所有子图的坐标轴范围完全统一,直接在hist()里加固定的xlim、ylim参数即可,避免不同子图因数据范围不同导致的视觉大小差异。
  • 觉得边距不合适直接调整mar的四个数值即可,因为3*3布局下每个子图的绘图区形状方正,调整边距只会增减标签区的空间,不会把直方图压扁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:06:27