绘制散点图矩阵(Scatterplot matrix)时遇Viewport未找到错误,求解决方案
修复splom散点图矩阵中的Viewport错误
嘿,我看到你在用lattice包的splom()绘制散点图矩阵时遇到了这个视图端口找不到的错误,这个问题通常和自定义对角线面板函数里的默认调用冲突有关,我来帮你搞定它!
错误原因分析
你遇到的Viewport 'plot_01.panel.1.1.off.vp' was not found错误,核心原因是自定义的diag.panel函数里调用了diag.panel.splom()——这个默认对角线面板函数内部会尝试访问一个特定的视图端口,但当你先绘制了密度线之后,这个视图端口的状态已经被改变,导致程序找不到对应的端口。
修复方案
核心思路是替换diag.panel.splom()的调用,手动实现它的核心功能(显示变量名),避免视图端口冲突。同时确保依赖包已正确加载。
步骤1:确保加载必要的包
panel.hexbinplot依赖hexbin包,所以先加载:
library(lattice) library(hexbin)
步骤2:修改自定义对角线面板函数
把原来调用diag.panel.splom()的部分,换成手动绘制变量名的代码:
onDiag <- function(x, varname, ...){ # 保留你原来的密度曲线绘制逻辑 yrng <- current.panel.limits()$ylim d <- density(x, na.rm = TRUE) d$y <- with(d, yrng[1] + 0.95 * diff(yrng) * y / max(y) ) panel.lines(d, col = rgb(.83,.66,1), lwd = 2) # 手动添加对角线的变量名称,替代默认的diag.panel.splom() grid.text(varname, x = 0.5, y = 0.5, gp = gpar(cex = 0.8, font = 2)) }
步骤3:完整修复后的代码
把所有代码整合起来,就是这样:
library(lattice) library(hexbin) # 你的变量索引函数(保留不变) varNum <- function(x){ val <- 1:ncol(x) names(val) <- colnames(x) return(val) } varNum(house) # 数据子集处理(保留不变) house1 <- house[,c(7,1:6)] # 自定义非对角线面板(保留不变,可按需取消loess线注释) offDiag <- function(x,y,...){ panel.grid(h = -1, v = -1, ...) panel.hexbinplot(x,y,xbins = 15,...,border = gray(.7), trans = function(x)x^.5) # panel.loess(x , y, ..., lwd=2, col='red') } # 修改后的对角线面板函数 onDiag <- function(x, varname, ...){ yrng <- current.panel.limits()$ylim d <- density(x, na.rm = TRUE) d$y <- with(d, yrng[1] + 0.95 * diff(yrng) * y / max(y) ) panel.lines(d, col = rgb(.83,.66,1), lwd = 2) # 手动绘制变量名 grid.text(varname, x = 0.5, y = 0.5, gp = gpar(cex = 0.8, font = 2)) } # 调用splom生成散点图矩阵 splom(house1, as.matrix = TRUE, xlab = '', main = "Beijing Housing Variables", pscale = 0, varname.cex = 0.8, axis.text.cex = 0.6, axis.text.col = "purple", axis.text.font = 2, axis.line.tck = .5, panel = offDiag, diag.panel = onDiag )
额外排查提示
如果还是遇到问题,可以试试这些点:
- 用
house1 <- na.omit(house1)处理数据中的缺失值,避免密度计算或绘图时的异常 - 暂时去掉
pscale=0参数,排查是否是轴缩放设置导致的视图端口异常
内容的提问来源于stack exchange,提问作者Grace
相关产品推荐
相关产品推荐

