2

R我正在尝试通过car包制作三维散点图。MWE 如下所示。

pdf(file = "Hyperellipsoid.pdf")
library(car)
scatter3d(
    prestige ~ income + education
  , xlab = ""
  , ylab = ""
  , zlab = ""
  , surface=FALSE
  , fill=FALSE
  , grid=TRUE
  , axis.scales=FALSE
  , ellipsoid=TRUE
  , axis.col= "white"
  , square.col= "white"
  , point.col = "white"
  , data=Duncan
  )
dev.off()

在此处输入图像描述

问题

  1. 如何从图中删除数据圈?
  2. 如何将绘图保存为pdf格式?
4

2 回答 2

1

似乎更改色点没有效果。一个解决方案是破解该功能。当我想破解一些 R 函数时,我会给出以下一般情况下的做法。因此,这是关于如何破解您自定义使用的函数的一般答案。

  1. capture.output(getS3method('scatter3d','default'),file='my.scatter3d.R'). 这将使用该函数创建一个新文件。
  2. 然后,您打开文件并删除最后 2 行。你给这个函数起一个名字。例如:my.scatter3d
  3. 更改您呼叫的线路rgl.points
  4. 最后你像这样调用函数:

     source('my.scatter3d.R')
     scatter3d(
            z= Duncan$prestige 
            x= Duncan$income ,
            y = Duncan$education,
            ....
    

如果你想调用散点公式函数,你需要破解......

  `capture.output(getS3method('scatter3d','formula'),file='my.scatter3dformlua.R')` 

并更改线路

  scatter3d(X[, 2], X[, 1], X[, 3], xlab = xlab, ylab = ylab, 
            zlab = zlab, labels = labels, radius = radius, ...)

  my.scatter3d(X[, 2], X[, 1], X[, 3], xlab = xlab, ylab = ylab, 
            zlab = zlab, labels = labels, radius = radius, ...)

附言

如果函数抱怨找不到函数,一般我们将包名添加为 anemspace,例如:

 rgl:::FUNCTION_
于 2013-03-16T13:03:15.797 回答
1

你真的不需要破解完整的散点图函数(你可以通过 更容易地看到car:::scatter3d.default);你可以使用car:::ellipsoid.

library("car")
dmat <- subset(Duncan,select=c(income,education,prestige))
dfn <- 3
dfd <- nrow(Duncan) - 1
level <- 0.95
ell.radius <- sqrt(dfn * qf(level, dfn, dfd))
library("rgl")
open3d()
rgl.material(color="blue")
ellips <- car:::ellipsoid(center = colMeans(dmat),
            shape = cov(dmat),
            radius = ell.radius)
wire3d(ellips)
rgl.postscript("ell3d.pdf",fmt="pdf")

在此处输入图像描述

于 2013-03-16T15:30:47.813 回答