You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Plotly显示空间设置及3D动画固定视图与轴范围技术问询

Fixing 3D View and Axes in Plotly Animation

Absolutely! You can lock both the axis ranges and camera view in your Plotly 3D animation to keep the spatial frame fixed while your detector path moves. The issue you're seeing is that Plotly's default behavior auto-scales axes and adjusts the camera for each frame, which breaks the fixed perspective you need. Here's how to fix it:

First, let's break down the key adjustments:

  • Fixed Axis Ranges: Explicitly define the min/max bounds for each axis based on your data. For your detector path, since Sx and Sy range from -1 to 1, and Sz goes from 0 to 1, we can hardcode these ranges to prevent auto-scaling.
  • Locked Camera View: Set a static camera position so the perspective doesn't shift as the animation plays. You can tweak these values to get the exact angle you want for your visualization.

Here's the modified version of your code with these fixes:

library(plotly)

N <- 360
u = seq(0, pi/2, length.out = 30)
w = seq(0, 2*pi, length.out = N)
datalist = list()

for (i in 1:N) {
  Sx = cos(u) * cos(w[i])
  Sy = cos(u) * sin(w[i])
  Sz = sin(u)
  df <- data.frame(Sx, Sy, Sz, t=i)
  datalist[[i]] <- df
}

data = do.call(rbind, datalist)

# Define fixed axis ranges that match your data's full extent
x_range <- c(-1, 1)
y_range <- c(-1, 1)
z_range <- c(0, 1)

plot_ly(data, x=~Sx, y =~Sy, z=~Sz, frame=~t, type = 'scatter3d', mode = 'lines') %>%
  layout(
    scene = list(
      xaxis = list(range = x_range, title = "X Axis"),
      yaxis = list(range = y_range, title = "Y Axis"),
      zaxis = list(range = z_range, title = "Z Axis"),
      # Lock camera position to maintain consistent view
      camera = list(
        eye = list(x = 1.5, y = 1.5, z = 0.8), # Adjust these values to tweak your view angle
        center = list(x = 0, y = 0, z = 0.5),
        up = list(x = 0, y = 0, z = 1)
      )
    )
  ) %>%
  animation_opts(frame = 50) # Optional: Adjust frame speed (lower = faster)

Why this works:

  • The scene.xaxis.range (and corresponding y/z settings) tells Plotly to keep the axis bounds static instead of recalculating them for each frame. This ensures your coordinate system stays fixed.
  • The camera parameters set a permanent perspective:
    • eye controls where the camera is positioned relative to the origin (higher values = farther away).
    • center defines the point the camera is looking at.
    • up sets which direction is "up" in the view.
  • The animation_opts line is optional but helps smooth out the animation speed—feel free to adjust the frame value (in milliseconds) to match your needs.

If you want to tweak the view further, just adjust the eye values. For example, a top-down view might use eye = list(x=0, y=0, z=2), while a side view could use eye = list(x=2, y=0, z=0).

内容的提问来源于stack exchange,提问作者complete_beginer

火山引擎 最新活动