R语言新增直方图无法显示在已有图表下方的问题求助
解决方法:将新增直方图显示在已有图表下方
问题核心原因
你之前的代码有两个关键错误:
- 图形布局参数
par(mfrow=c(5,1))必须放在所有绘图代码之前,否则R不会应用这个布局设置。 - 新增直方图时使用了
add=TRUE,这个参数是用来在同一个绘图区域叠加内容的,而非新建子图。
修正后的完整代码
# 先设置多图布局:5行1列,调整边距让排版更合理 par(mfrow=c(5,1), mar = c(2,4,2,1), oma = c(3,0,0,0)) # ---------------------- 第一幅图:原始叠加直方图 ---------------------- x <- rnorm(1000,1,1) x1 <- rnorm(1000,100,1) y <- hist(x, plot=FALSE, breaks=20) y1 <- hist(x1, plot=FALSE, breaks=20) mean_x <- mean(x) mean_x1 <- mean(x1) # 初始化绘图区域 plot(0,0, ylim=range(c(y$counts, y1$counts)), xlim=range(c(y$breaks, y1$breaks)), xlab="", ylab="counts", type="n", main="原始叠加直方图") corners <- par('usr') x_left <- corners[1] x_right <- quantile(x,0.95) x1_left <- x_right x1_right <- quantile(x1,0.05) rect(xleft=x_left, xright=x_right, ybottom=corners[3], ytop=corners[4], col='lightblue', density=100) rect(xleft=x1_left, xright=x1_right, ybottom=corners[3], ytop=corners[4], col='pink', density=100) plot(y, col='lightgray', add=TRUE) plot(y1, col='gray48', add=TRUE) abline(v=mean_x, col='forestgreen', lwd=3) abline(v=mean_x1, col='forestgreen', lwd=3) abline(v=x_right, col='steelblue', lwd=3) abline(v=x1_right, col='firebrick', lwd=3) # ---------------------- 第二幅图:C=10的直方图 ---------------------- V <- function(C, H, n) { 1 + (C / H)^n # 简化原代码的1/1为1 } V_10 <- V(10,1,1) x3 <- rnorm(1000, V_10, 1) # 直接绘制,无需add=TRUE,自动进入下一个子图区域 hist(x3, breaks=20, col='gray48', main="C=10的直方图", xlab="", ylab="counts") mean_x3 <- mean(x3) abline(v=mean_x3, col='forestgreen', lwd=3) # ---------------------- 第三幅图:C=50的直方图 ---------------------- V_50 <- V(50,1,1) x4 <- rnorm(1000, V_50, 1) hist(x4, breaks=20, col='gray48', main="C=50的直方图", xlab="", ylab="counts") mean_x4 <- mean(x4) abline(v=mean_x4, col='forestgreen', lwd=3) # ---------------------- 可选:补充剩余子图(如果需要5行) ---------------------- plot(0,0, type="n", axes=FALSE, xlab="", ylab="", main="") plot(0,0, type="n", axes=FALSE, xlab="", ylab="", main="") # 为所有子图添加统一的底部x轴标签 mtext("x", side=1, outer=TRUE, line=1)
关键调整说明
- 布局设置提前:
par(mfrow=c(5,1))放在代码最开头,R会按从上到下的顺序依次填充每个子图区域。 - 移除
add=TRUE:新增直方图直接调用hist(),R会自动切换到下一个空白子图区域绘制。 - 边距优化:调整
mar(子图内边距)和oma(全局外边距),避免标签重叠;用mtext添加统一的x轴标签,提升可读性。 - 简化函数:原函数
1/1可简化为1,不影响结果。
内容的提问来源于stack exchange,提问作者user20459226
相关产品推荐
相关产品推荐

