r - 是否有 ggplot2 类似于 R 中的 avPlots 函数?
问题描述
在进行回归建模时,为模型中的解释变量生成附加变量图很有用,以检查与响应变量的假定关系是否适合数据。包中的avPlots
函数接受模型输入,并使用基本图形系统生成一个添加变量图的网格。这个函数非常用户友好,只要你需要做的就是将模型对象作为参数放入,它会自动为每个解释变量生成所有添加的变量图。这个绘图矩阵包含所有需要的信息,但不幸的是,绘图看起来很糟糕,因为它使用基本图形系统而不是car
R
ggplot2
包裹。例如,使用在此处找到的数据(作为文件下载Trucking.csv
)是avPlots
函数的输出。
#Load required libraries
library(car);
#Import data, fit model, and show AV plots
DATA <- read.csv('Trucking.csv');
MODEL <- lm(log(PRICPTM) ~ DISTANCE + PCTLOAD + ORIGIN + MARKET + DEREG + PRODUCT,
data = DATA);
avPlots(MODEL);
问题:是否有一个等效函数ggplot2
可以为模型生成每个附加变量图的矩阵,但具有“更漂亮”的图?是否可以生成这些图,然后使用标准ggplot
语法对其进行自定义?
解决方案
我不知道任何使用ggplot
. 但是,除了作为函数调用的副作用avPlots
提供绘图输出外,该函数还会生成一个对象,该对象是一个列表,其中包含每个添加的变量绘图中使用的数据值。提取这些变量的数据框并使用它们生成添加的变量图相对简单ggplot
。这可以使用以下函数为通用模型对象完成。
avPlots.invis <- function(MODEL, ...) {
ff <- tempfile()
png(filename = ff)
OUT <- car::avPlots(MODEL, ...)
dev.off()
unlink(ff)
OUT }
ggAVPLOTS <- function(MODEL, YLAB = NULL) {
#Extract the information for AV plots
AVPLOTS <- avPlots.invis(MODEL)
K <- length(AVPLOTS)
#Create the added variable plots using ggplot
GGPLOTS <- vector('list', K)
for (i in 1:K) {
DATA <- data.frame(AVPLOTS[[i]])
GGPLOTS[[i]] <- ggplot2::ggplot(aes_string(x = colnames(DATA)[1],
y = colnames(DATA)[2]),
data = DATA) +
geom_point(colour = 'blue') +
geom_smooth(method = 'lm', se = FALSE,
color = 'red', formula = y ~ x, linetype = 'dashed') +
xlab(paste0('Predictor Residual \n (',
names(DATA)[1], ' | others)')) +
ylab(paste0('Response Residual \n (',
ifelse(is.null(YLAB),
paste0(names(DATA)[2], ' | others'), YLAB), ')')) }
#Return output object
GGPLOTS }
该函数ggAVPLOTS
将采用输入模型并ggplot
为每个添加的变量图生成对象列表。这些已被构建为给出带有蓝色点的“漂亮”图和通过每个图的红色虚线回归线。如果您希望所有添加的变量图都显示在一个图中,使用包grid.arrange
中的函数执行此操作相对简单gridExtra
。下面我们将其应用于您的模型并显示结果图。
#Produce matrix of added variable plots
library(gridExtra)
PLOTS <- ggAVPLOTS(MODEL)
K <- length(PLOTS)
NCOL <- ceiling(sqrt(K))
AVPLOTS <- do.call("arrangeGrob", c(PLOTS, ncol = NCOL, top = 'Added Variable Plots'))
ggsave('AV Plots - Trucking.jpg', width = 10, height = 10)
可以在上面的代码中对这些绘图进行任何更改ggplot
,因此如果用户喜欢更改颜色、字体大小等,可以使用ggplot
. 此方法通过从avPlots
函数导入添加的变量图的数据来工作,但是一旦你这样做了,你就可以使用这些数据来生成任何类型的图。
推荐阅读
- python - 在绘图中将 x 或 y 轴调整为所需的数字
- python - 如何在不延迟 Tkinter 中的 GUI 元素的情况下一次执行两个或多个功能?
- android - tflite BuildFromFile() 从 assets 文件夹中读取的 Android 本机文件
- java - 如何在 Spring 中获取 Keycloak 令牌
- php - html 表单中的提交按钮显示 php 脚本,而不是将表单数据发送到数据库
- c# - 页面间发送敏感数据的常用方法asp.net core
- python - 函数问题 - else 语句出错
- jquery - 如何在 django 中使用 ajax 更新绘图图
- javascript - jQuery on change 事件是否仅在用户操作时触发?
- azure - Azure 异地复制存储以允许在次要区域中写入