R语言同一窗口绘制Glass数据集9个直方图报错问题咨询
报错原因
- 「figure margins too large」:和代码逻辑无关,是当前R绘图设备(比如RStudio右下角绘图面板)尺寸过小,3行3列排布9张子图时,默认边距分配后单图无有效绘图空间导致。
- 「'x' must be numeric」:
hist()仅接受单个数值型原子向量作为输入,传入的Glass2是数据框(本质是列向量构成的列表),即使内部所有列都是数值型,数据框本身不符合入参要求。另外subset(Glass[1:9])是冗余写法,Glass[1:9]本身就是取前9列的操作,subset()一般用于按条件筛选行,不需要在这里嵌套。
正确实现方案
方案1:Base R 循环批量绘图(最稳妥)
提前调整边距参数、指定足够大的画布,循环遍历所有预测列绘制直方图,不需要手动重复写9次hist()调用:
library(mlbench) data(Glass) # 提前开足够大的画布避免边距报错,根据自身系统选对应函数 # Windows系统用:windows(width = 9, height = 9) # Mac系统用:quartz(width = 9, height = 9) # Linux系统用:x11(width = 9, height = 9) # 如果用RStudio,直接把右下角绘图面板拖大也能解决边距问题 # 设置3*3子图排布,缩小默认边距(边距顺序为下、左、上、右,单位是文本行数) par(mfrow = c(3,3), mar = c(4, 4, 2, 1)) # 批量遍历前9列绘图 for (col_name in names(Glass)[1:9]) { hist( Glass[[col_name]], main = paste0("Histogram of ", col_name), xlab = col_name, col = "lightblue", border = "white" ) } # 绘图结束后恢复默认绘图参数 par(mfrow = c(1,1), mar = c(5,4,4,2) + 0.1)
方案2:lapply 简化写法
不想写显式循环可以用lapply逐列传入绘图,用invisible()避免控制台打印多余的返回值:
par(mfrow = c(3,3), mar = c(4,4,2,1)) invisible( lapply(names(Glass)[1:9], function(col_name) { hist(Glass[[col_name]], main = paste0("Histogram of ", col_name), xlab = col_name, col = "lightblue") }) ) par(mfrow = c(1,1), mar = c(5,4,4,2) + 0.1)
注意事项
- 如果还是触发边距报错,优先把绘图面板尺寸拉大,或者继续调小
mar参数的数值,比如改成mar = c(3,3,2,1),同时给直方图加标签时适当缩小字体即可。 - 不要直接把多列数据框传入只接受单向量的绘图/统计函数,这类函数不会自动逐列遍历数据框,必须手动逐列传入。
内容的提问来源于stack exchange,提问作者bandcar
相关产品推荐
相关产品推荐

