Are there any way to plot a surface like ellipsoid with plotly 3D?
Currently only surfaces of the form z=f(x,y) are discussed in the docs. There is also Mesh 3D, but I found no examples for it. It seem to be possible to make a triangulation of ellipsoid manually and then use Mesh to get ellipsoid, but it looks a bit difficult for me. Are there any better way to do it?
Okay, it is easier than I thought. There is alphahull
option that asks plotly to calculate the corresponding triangulation automatically.
from plotly.offline import iplot, init_notebook_mode
from plotly.graph_objs import Mesh3d
import numpy as np
# some math: generate points on the surface of the ellipsoid
phi = np.linspace(0, 2*pi)
theta = np.linspace(-pi/2, pi/2)
phi, theta=np.meshgrid(phi, theta)
x = np.cos(theta) * np.sin(phi) * 3
y = np.cos(theta) * np.cos(phi) * 2
z = np.sin(theta)
# to use with Jupyter notebook
init_notebook_mode()
iplot([Mesh3d({
'x': x.flatten(),
'y': y.flatten(),
'z': z.flatten(),
'alphahull': 0
})])
And this is R version:
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'))
EDIT: it is also possible to use type='surface'
to produce parametric plots: in this case one have to provide two-dimensional x
and 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')))