How to draw ellipsoid with plotly

前端 未结 3 443
走了就别回头了
走了就别回头了 2021-01-14 06:36

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 Mes

相关标签:
3条回答
  • 2021-01-14 07:00

    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
    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
    })])
    

    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')))
    
    0 讨论(0)
  • 2021-01-14 07:08

    Why not solve for z in this equation grabbed from the Mathematic item on ellipsoids:

    require(plotly)
    a=5; b=7; c=9
    x=rep(seq(-10,10,by=1), each=21)
    y=rep( seq(-10,10,by=1), times=21)
    z <- c^2*sqrt(1-x^2/a^2-y^2/b^2)
    #Warning message:
    #In sqrt(1 - x^2/a^2 - y^2/b^2) : NaNs produced
    
     plot_ly(z = matrix(z,21,21), type = "surface")
    

    0 讨论(0)
  • 2021-01-14 07:20

    Assuming the ellipsoid is given by the equation (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) 
    
    0 讨论(0)
提交回复
热议问题