从Plotly 3D图中获取相机位置

9
我正在绘制plotly 3D图表并希望调整相机位置。对我来说,最好的方法是使用查看器,缩放和旋转场景,然后将相机位置作为JSON抓取并放入生成图片的脚本中,以默认方式实现相同的位置。
根据这条推文,它应该工作,但实际上并没有。
我的代码是:
from plotly.graph_objs import Scatter3d, Layout, Scene
from plotly.offline import iplot
import plotly
from numpy import sin, cos, linspace, pi, zeros_like

plotly.offline.init_notebook_mode()

t = linspace(0, 4*pi)

trace1 = Scatter3d(
    x = t,
    y = cos(t),
    z = sin(t),
    mode = 'lines'
)

layout = Layout(
                width = 600, 
                height = 600, 
                scene = Scene(
                    xaxis = {'title': 't'},
                    yaxis = {'title': 'x'},
                    zaxis = {'title': 'y'},
                    camera =
                      {'eye':{'x':0,'y':1,'z':0}, 
                       'up': {'x':0,'y':0,'z':1}, 
                       'center': {'x':0,'y':0,'z':0}}
                )
)
iplot(dict(data=[trace1], layout=layout))

然后我得到一张图片:

iplot

点击“保存并在云端编辑”,切换到Plotly界面,调整相机位置并点击查看JSON,仍然可以获得我在布局中指定的默认相机位置。

json


这是预期的行为。plotly.js在将相机位置发送到plot.ly云之前不会保存它。您需要在plot.ly/plot/上保存图形,以更新其“camera”属性。 - etpinard
1
@etpinard,谢谢!现在我明白了,如果我在plot.ly网页界面上保存我的图形,然后调整相机,再次保存,我就可以在JSON预览中得到正确的相机值。您能否根据这个评论回答一下,让我接受它呢? - Ilya V. Schurov
如何使用onClick事件获取相机位置? - Qbik
1
这个是6年前的版本,现在有更新吗? - ComputerScientist
3个回答

3
这里是Plotly 3D图的相机控制的完整说明和示例:

http://nbviewer.jupyter.org/github/etpinard/plotly-misc-nbs/blob/master/3d-camera-controls.ipynb

为了完整起见,这里是一个简短的总结:
可以使用camera代替cameraposition,因为它似乎有更简单的解释。
相机位置由三个向量确定:upcentereye
上向量确定页面上的上方向。默认值为(x=0, y=0, z=1),即z轴指向上方。
中心向量确定场景中心的平移。默认情况下,没有平移:中心向量为(x=0, y=0, z=0)
眼睛向量确定相机关于原点的视角。默认值为(x=1.25, y=1.25, z=1.25)
也可以通过减小眼睛向量的范数来进行缩放。
name = 'eye = (x:0.1, y:0.1, z:1)'
camera = dict(
    up=dict(x=0, y=0, z=1),
    center=dict(x=0, y=0, z=0),
    eye=dict(x=0.1, y=0.1, z=1)
)
fig = make_fig(camera, name)
py.iplot(fig, validate=False, filename=name)

11
这并没有回答问题。这可以设置初始位置,但问题是关于如何在鼠标交互后获得新的相机位置。 - Alex Maystrenko

1
如果您有一个Plotly的figure,您可以使用FigureWidget来交互式地获取和设置相机视图数据。
import plotly.graph_objects as go
fig = px.scatter_3d(...)  # your plotly figure

f = go.FigureWidget(fig)
f  # to see the figure in the Jupyter Notebook. Can rotate as you like

# Get the current orientation:
f.layout['scene']['camera']['eye']

# Set the current orientation:
f.layout['scene']['camera']['eye'] = dict(x=1.25, y=1.25, z=1.25)

替代方案(获取):
f.layout['scene']['camera']['eye']._props
f.get_state()['_layout']['scene']['camera']['eye']

来源:

https://community.plotly.com/t/getting-camera-view-data-for-3d-plots/18066

https://plotly.com/python/figurewidget/


谢谢您,弗拉基米尔。我需要重新创建一个非常特定的角度。通过读取go.FigureWidget的当前方向,这变得很容易。 - undefined

0

这是预期的行为。

plotly.js在将相机位置发送到plot.ly云之前不会保存它。您需要在plotly工作区plot.ly/plot中保存图形,以便更新其camera属性。


1
9年过去了,URL plot.ly/plot现在已经404了。不知道现在的解决方案是什么。 - sh37211

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接