【发布时间】:2016-06-19 16:41:26
【问题描述】:
有没有办法用 plotly 3D 绘制像椭球这样的表面?
目前文档中只讨论了 z=f(x,y) 形式的表面。还有Mesh 3D,但我没有找到它的例子。似乎可以手动对椭球进行三角剖分,然后使用 Mesh 得到椭球,但这对我来说似乎有点困难。有没有更好的办法?
【问题讨论】:
标签: python r 3d plotly r-plotly
有没有办法用 plotly 3D 绘制像椭球这样的表面?
目前文档中只讨论了 z=f(x,y) 形式的表面。还有Mesh 3D,但我没有找到它的例子。似乎可以手动对椭球进行三角剖分,然后使用 Mesh 得到椭球,但这对我来说似乎有点困难。有没有更好的办法?
【问题讨论】:
标签: python r 3d plotly r-plotly
好吧,这比我想象的要容易。有alphahull 选项要求自动计算相应的三角剖分。
from plotly.offline import iplot, init_notebook_mode
from plotly.graph_objs import Mesh3d
from numpy import sin, cos, pi
# some math: generate points on the surface of ellipsoid
phi = np.linspace(0, 2*pi)
theta = np.linspace(-pi/2, pi/2)
phi, theta=np.meshgrid(phi, theta)
x = cos(theta) * sin(phi) * 3
y = cos(theta) * cos(phi) * 2
z = sin(theta)
# to use with Jupyter notebook
init_notebook_mode()
iplot([Mesh3d({
'x': x.flatten(),
'y': y.flatten(),
'z': z.flatten(),
'alphahull': 0
})])
这是 R 版本:
library(pracma)
theta <- seq(-pi/2, pi/2, by=0.1)
phi <- seq(0, 2*pi, by=0.1)
mgrd <- meshgrid(phi, theta)
phi <- mgrd$X
theta <- mgrd$Y
x <- cos(theta) * cos(phi) * 3
dim(x) <- NULL
y <- cos(theta) * sin(phi) * 2
dim(y) <- NULL
z <- sin(theta) * scale
dim(z) <- NULL
ell <- cbind(x, y, z)
ell <- setNames(ell, c('x', 'y', 'z'))
library(plotly)
p <- plot_ly(as.data.frame(ell), x=x, y=y, z=z, type='mesh3d', alphahull = 0)
p %>% layout(scene = list(aspectmode = 'data'))
编辑:也可以使用type='surface' 生成参数图:在这种情况下,必须提供二维x 和y。
library(plotly)
library(pracma)
mgrd <- meshgrid(seq(-pi, pi, length.out = 100), seq(-pi/2, pi/2, length.out = 100))
U <- mgrd$X
V <- mgrd$Y
frame <- list(x=cos(V)*cos(U)*3, y=cos(V)*sin(U)*2, z=sin(V))
plot_ly(frame, type='surface', x=x, y=y, z=z, showlegend=F, showscale=F,
colorscale=list(list(0, 'blue'), list(1, 'blue')))
【讨论】:
假设椭圆体由公式(X-c)'A(X-c) = r 给出。
library(Rvcg)
sphr <- vcgSphere()
library(rgl)
ell <- scale3d(transform3d(sphr, chol(A)), r, r, r)
vs <- ell$vb[1:3,] + c
idx <- ell$it - 1
library(plotly)
p <- plot_ly(type="mesh3d",
x = vs[1,], y = vs[2,], z = vs[3,],
i = idx[1,], j = idx[2,], k = idx[3,],
opacity = 0.3)
【讨论】:
【讨论】:
type="surface",但提供二维x 和y 并以这种方式获得参数图。 (请参阅我的答案的更新。)