在R中使用绘图功能结果不一致

4

我在尝试使用 R 语言进行绘图,但是我想弄清楚它为什么会出现以下行为。

我将一个表格发送给 plot 函数,它就给我生成了一个非常好的变宽图,这相当有洞察力。然而,当我重新排列表格的列并再次发送到 plot 中时,我得到了一个奇怪的散点图。在重新排序中发生了什么?我该如何避免这种情况?

smoke <- matrix(c(51,43,22,92,28,21,68,22,9),ncol=3,byrow=TRUE)
colnames(smoke) <- c("High","Low","Middle")
rownames(smoke) <- c("current","former","never")
smoke <- as.table(smoke)
plot(smoke)  # This gives me a variwidth plot
smoke = smoke[,c("Low", "Middle", "High")] # I reorder the columns
plot(smoke)  # This gives me a weird scatter plot
2个回答

5

研究这个问题的方法是对“smoke”的两个实例执行str():

> str(smoke)
 table [1:3, 1:3] 51 92 68 43 28 22 22 21 9
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:3] "current" "former" "never"
  ..$ : chr [1:3] "High" "Low" "Middle"

> str( smoke[,c("Low", "Middle", "High")] )
 num [1:3, 1:3] 43 28 22 22 21 9 51 92 68
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:3] "current" "former" "never"
  ..$ : chr [1:3] "Low" "Middle" "High"

第一个是表格对象,而第二个是矩阵。你也可以对两者都执行class(),并得到更紧凑的答案。要理解这为什么很重要,还需要看一下。
methods(plot) 

浏览代码并发现有一个plot.table*方法。 '*'表示它是不可见的,如果你需要查看代码,你需要使用:

getAnywhere(plot.table)

正如Ananda所示,您可以将表格类恢复到那个smoke对象中,然后让分派系统将该对象发送到plot.table*

我有一个疑问,也许你可以指点我一下。假设我们将“smoke”的类更改如下:class(smoke) <- c(class(smoke), "table")。现在R使用plot.table方法进行绘图。类的顺序是否重要(至少在这种情况下似乎不是)?还是说没有特定的plot.matrix方法? - A5C1D2H2I1M1N2O1R2T1
调度方法按顺序搜索第一个类,直到找到与命名方法匹配的类,但是没有 plot.matrix 方法。有一个 plot.default 方法可以“捕获”矩阵对象。 - IRTFM

4
当您重新排列列时,将“smoke”的类从“table”更改为“matrix”,因此plot函数根据其输入返回不同的默认结果,因此绘制出了不同的图形。
请尝试:
plot(as.table(smoke))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接