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

绘制散点图矩阵(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:29:57