`plot` 如何知道如何在没有进一步说明的情况下绘制对象?

Posted

技术标签:

【中文标题】`plot` 如何知道如何在没有进一步说明的情况下绘制对象?【英文标题】:How does `plot` know how to plot an object without further specification? 【发布时间】:2022-01-16 22:45:02 【问题描述】:

使用 R 基函数 plot,我们只需提供数据即可制作不同的绘图,而无需指定进一步的参数。例如,如果我们绘制一个时间序列,使用plot(my_ts) 调用plot.ts(my_ts) 因为my_ts 是类ts

同样,我们可以使用不带任何参数的 plot ANOVA 结果。这里有一些 ANOVA 模型:

data <- data.frame(group = c(rep("group_1",25),rep("group_2",25)), scores = c(runif(25,0,1),runif(25,1.5,2.5)))
mod1 <- aov(scores~group,data=data)

使用plot(mod1) 有效,但plot(summary(mod1)) 会导致错误

"xy.coords(x, y, xlabel, ylabel, log) 中的错误: 'x' 是一个列表,但没有组件 'x' 和 'y'"。

似乎plot 函数在尝试自动创建不带任何参数的绘图时查找名为xy 的数据。我尝试了names(mod1),但找不到任何xy。那么plot(mod1) 工作而plot(summary(mod1)) 不工作是怎么来的呢?

【问题讨论】:

因为summary(mod1)返回一个c类的对象(summary.aov,listof)并且没有内置的plot.summary.aov函数。出于兴趣,您期望显示什么是方差分析的摘要图? 你看到的是S3 method dispatch(或者没有,对于摘要对象)。 @Limey 实际上我的问题不是关于绘制一个 aov 夏季对象,而是关于 S3 方法调度的问题。我构建了一个包,它会根据提供的类做出不同的反应。这就是我的问题的背景。 啊!很公平。 【参考方案1】:

在键入plot(x) 时,根据class(x) 调用了多个方法。这称为方法分派。也可以创建新的自己的方法,例如plot.summary.aov 用于摘要对象:

data <- data.frame(group = c(rep("group_1",25),rep("group_2",25)), scores = c(runif(25,0,1),runif(25,1.5,2.5)))
mod1 <- aov(scores~group,data=data)

plot(mod1)

让我们定义一个新的存根绘图函数

plot.summary.aov <- function(x) 
  plot(iris)


plot(summary(mod1))

methods(plot)
#>  [1] plot.acf*           plot.data.frame*    plot.decomposed.ts*
#>  [4] plot.default        plot.dendrogram*    plot.density*      
#>  [7] plot.ecdf           plot.factor*        plot.formula*      
#> [10] plot.function       plot.hclust*        plot.histogram*    
#> [13] plot.HoltWinters*   plot.isoreg*        plot.lm*           
#> [16] plot.medpolish*     plot.mlm*           plot.ppr*          
#> [19] plot.prcomp*        plot.princomp*      plot.profile.nls*  
#> [22] plot.R6*            plot.raster*        plot.spec*         
#> [25] plot.stepfun        plot.stl*           plot.summary.aov   
#> [28] plot.table*         plot.ts             plot.tskernel*     
#> [31] plot.TukeyHSD*     
#> see '?methods' for accessing help and source code

【讨论】:

以上是关于`plot` 如何知道如何在没有进一步说明的情况下绘制对象?的主要内容,如果未能解决你的问题,请参考以下文章

mysql - 如何在没有索引的情况下运行查询

在 Plotly 中将回归平面添加到 3d 散点图

如何使用R在plot_ly中为子图提供字幕

如何查询API函数 在知道中文意思的情况下如何查英文的API函数

熊猫 .plot.hist() 和 .groupby()

如何知道一项活动是不是在没有过渡的情况下开始?