如何用lattice包的splom函数复现car包的散点图矩阵?
用lattice包复现car包散点图矩阵的解决方案
原car包代码(目标效果)
car包的scatterplotMatrix实现了带线性回归线、loess平滑曲线和对角线箱线图的散点图矩阵:
require(car) scatterplotMatrix(~Week+Cases+Egg.Pr+Beef.Pr+Pork.Pr+Chicken.Pr+Cereal.Pr, reg.line = lm, smooth = TRUE, spread = FALSE, span = 0.5, id.n = 0, diagonal = 'boxplot', data = Eggs)
你的splom代码问题分析
你写的代码有几个核心错误:
- panel函数参数错误:splom的每个子面板只处理一对变量(x和y),不需要把所有变量都列作参数,应该用
x, y, ...作为panel函数的参数。 - 变量集不匹配:直接传入
Eggs给splom会包含数据集中所有列,必须用公式明确指定和car包一致的变量列表。 - 面板函数调用错误:
panel.lmline和panel.smooth只需要接收当前子图的x、y变量,不需要传入所有变量。 - 对角线面板设置错误:splom没有
diagonal参数,需要用diag.panel指定绘制箱线图的面板函数。
正确的splom实现代码
library(lattice) splom(~Week+Cases+Egg.Pr+Beef.Pr+Pork.Pr+Chicken.Pr+Cereal.Pr, data = Eggs, # 自定义子面板:散点+回归线+平滑曲线 panel = function(x, y, ...) { # 绘制基础散点图 panel.xyplot(x, y, ...) # 添加线性回归直线(对应car的reg.line=lm) panel.lmline(x, y, col = "black", ...) # 添加loess平滑曲线(对应car的smooth=TRUE,span=0.5) panel.smooth(x, y, span = 0.5, col = "blue", ...) }, # 对角线绘制箱线图(对应car的diagonal='boxplot') diag.panel = function(x, ...) { panel.bwplot(x, horizontal = FALSE, box.ratio = 0.5, ...) }, # 关闭异常点标签(对应car的id.n=0) id.n = 0, # 关闭分散度线条(对应car的spread=FALSE) spread = FALSE )
代码细节解释
- 变量指定:用
~Week+...+Cereal.Pr明确指定变量,和car包的变量集完全一致,避免包含无关列。 - panel函数逻辑:
panel.xyplot绘制基础散点,对应car的默认散点展示。panel.lmline添加线性回归线,对应car的reg.line=lm。panel.smooth添加loess平滑曲线,span=0.5和car的参数保持一致,控制平滑程度。
- 对角线面板:用
diag.panel调用panel.bwplot绘制垂直箱线图,box.ratio=0.5调整箱线宽度,和car的对角线箱线图效果匹配。 - 其他参数:
id.n=0关闭点的标签显示,对应car的id.n=0。spread=FALSE关闭分散度相关线条,和car的设置一致。
内容的提问来源于stack exchange,提问作者Jelena5
相关产品推荐
相关产品推荐

