我想绘图:
production.ts(31, .002, 10,12,125313.93,211,95,x,"2014-02-01","2014-05-14",z,y)
作为x,y,z的函数
像Mathematica这样的情节,(如果可能在R中): http://i.stack.imgur.com/3PRaf.png
我有一个功能:
library("lubridate"); library("rgl")
production.ts <- function(a, b, z, c, d, e,
f, g, h, j, r, k) {
elapsed <- (4-z)*10 + (4-c)
un.days <- 100 - elapsed
gone.days <- day(as.Date(h))
rem.days <- day(as.Date(j))
r.days <- as.numeric(as.Date(j) - as.Date(h))
m.r <- f/100*d
inputs <- d * a * (gone.days - 1)/365 + r
prin <- m.r + inputs
costs <- (r.days/365 * r + 1) * prin
added.p <- a/100*d + r
due <- d * 1-un.days
tomr.f <- 1- due + k^2
acct.paid <- (d - due)*tomr.f
net <- added.p + due + acct.paid
pv.net <- net/(1+r*(e-30-day(as.Date(j)))/365)
end <- d - due - acct.paid
more.add.p <- end*a*(rem.days-1)/365
rem <- (f-g)/100 * end
total.fv <- pv.net + rem + more.add.p
out <- costs - total.fv
out
}
x<-seq(-10,10,by=.1)
y<-seq(0,1000,by=.1)
z<-seq(0,90,by=.1)
我试过了:
func.3d<-Vectorize(production.ts(31, .002, 10,12,125313.93,211,95,x,"2014-02-01","2014-05-14",z,y))
c <- func.3d; c <- cut(c,breaks=64); cols <- rainbow(64)[as.numeric(c)]
open3d()
plot3d(x, y, z, col=cols,type="s",size=1)
但是这会绘制线条,颜色不会与函数输出的值对齐。
有谁知道我怎么做到这一点?谢谢,我真的很感谢你的时间!
答案 0 :(得分:3)
喜欢这个吗?
x<-seq(-10,10,length=100)
y<-seq(0,1000,length=100)
z<-seq(0,90,length=100)
df <- expand.grid(x=x,y=y,z=z)
f <- function(x,y,z) {production.ts(31, .002, 10,12,125313.93,211,95,x,"2014-02-01","2014-05-14",z,y)}
df$c <- f(df$x,df$y,df$z)
c <- cut(df$c,breaks=64)
cols <- rainbow(64)[as.numeric(c)]
open3d()
plot3d(df$x, df$y, df$z, col=cols,type="p",size=1)
您的代码没有绘制线条。当您将x,y和z传递给plot3d(...)
时,它会循环遍历所有元素,因此x[1],y[1],z[1]
是一个点,x[2],y[2],z[2]
是另一个点, 等等。由于矢量长度不同,较短的矢量可以循环使用,以填充最长的长度。这样做的视觉效果就是点在一条线上。
您想要绘制 x,y和z的每个组合,并根据该组合为每个点添加颜色。上面的代码就是这样。情节看起来不像你的,但我不知道这是否是因为你定义了你的功能。
此外,您定义x,y和z的方式将是201 X 10001 X 901 = 1,811,191,101点,这太多而无法处理。上面的代码显示了1,000,000点。
最后,在这种情况下,绘制球体(type="s"
)非常昂贵且不必要。