Размер конусов в трехмерном анимированном конусном графике с переменной скоростью анимации - PullRequest
0 голосов
/ 05 апреля 2019

Строка документа свойства sizeref в plotly.graph_objs._cone.py гласит:

        Adjusts the cone size scaling. The size of the cones is
        determined by their u/v/w norm multiplied a factor and
        `sizeref`. This factor (computed internally) corresponds to the
        minimum "time" to travel across two successive x/y/z positions
        at the average velocity of those two successive positions. All
        cones in a given trace use the same factor. With `sizemode` set
        to "scaled", `sizeref` is unitless, its default value is 0.5
        With `sizemode` set to "absolute", `sizeref` has the same units
        as the u/v/w vector field, its the default value is half the
        sample's maximum vector norm.

        The 'sizeref' property is a number and may be specified as:
          - An int or float in the interval [0, inf]

        Returns
        -------
        int|float

, где есть этот таинственный фактор, который вычисляется, и я не могу найти, где он на самом деле вычисляется.Поскольку я не понимаю, как вычисляется этот странный фактор, я получаю очень странное поведение в моих анимациях:

import numpy as np
import plotly.graph_objs as go
import plotly.offline as pl

###np.around used because plotly.js doesn't like full precision float64s
t = np.linspace(0,2*np.pi,100)
x = np.around(np.vstack((np.cos(t), np.cos(t+np.pi))),decimals=6)
y = np.around(np.vstack((np.sin(t), np.sin(t+np.pi))),decimals=6)
z = np.around(np.vstack((np.ones(len(t)),np.ones(len(t)))),decimals=6)

v = np.around(np.vstack((np.cos(t), np.cos(t+np.pi))),decimals=6)
u = np.around(-np.vstack((np.sin(t), np.sin(t+np.pi))),decimals=6)
w = np.around(np.vstack((np.zeros(len(t)),np.ones(len(t)))),decimals=6)

fig3=go.Figure([dict(anchor="cm",showscale=False,sizemode="scaled",type="cone",x=x[:,0],y=y[:,0]
                                        ,z=z[:,0]
                                        ,u=u[:,0],v=v[:,0]
                                        ,w=w[:,0])],layout=go.Layout(
    scene=dict(aspectratio=dict(x=1,y=1,z=0.25),
                    xaxis=dict(range=[-2,2], tickmode="linear"),
                    yaxis=dict(range=[-2,2], tickmode="linear"),
                    zaxis=dict(range=[0,5]))))

fig3.frames= [go.Frame(data=[dict(type="cone",x=x[:,i],y=y[:,i],z=z[:,i],u=u[:,i],v=v[:,i],w=w[:,i])], 
                             layout=go.Layout(annotations=[dict(text="frame {}".format(i))]))for i in np.array(range(len(t)))]

pl.plot(fig3, animation_opts="{frame: {duration: 1}}")

Обратите внимание, что сначала вы должны либо удалить animation_opts kwarg, либо использовать plotly из мой репо , поскольку официальная версия еще не поддерживает animation_opts ( см. проблему, которую я поднял здесь ).

The plot that results from the above code (haven't figured out how to convert to video format yet!)

Где рассчитывается этот коэффициент?Я искал код, но ничего не нашел.Заранее спасибо!

PS Да, я включил много посторонней информации.Я никогда не видел пример трехмерной конусной анимации в сюжете, поэтому я хотел предоставить ее, и я работал над интерфейсом анимации в plotly.py, который определенно будет кому-то полезен!

РЕДАКТИРОВАТЬ: см. выпуск на github

1 Ответ

0 голосов
/ 12 апреля 2019

Обнаружено, что в Plotly.js существует внутренний масштабирующий фактор, который вызывает эту неразбериху.Я исправил это в моей текущей репо-версии plotly здесь .

...