How to build a 3d animation with plotly in python

Delforge Source

I am interested in animating 3d trajectories using plotly python api.

By mixing some codes from the documentation about both plotly animation and plotly 3d line plot, I have came up with the following implementation that should animate a brownian motion in 3d within a jupyter notebook.

# Cell 1
import numpy as np
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.grid_objs import Grid, Column

Here I create the random motion using numpy. Each row represents a point of the trajectory with its 3 coordinates. (I put a random seed to scale the axes later on)

# Cell 2
np.random.seed(0)
brownian_motion = np.cumsum(np.random.uniform(low=-0.5, high=0.5, size=(25,3)), axis=0)

I tried to use this np.array directly as input to create an animation but I got an error specifying that I cannot create an animation using raw data and that I should use a grid instead. I am building this grid in the next cell of the notebook using plotly Column and Grid classes.

# Cell 3
my_columns = []
nr_frames = brownian_motion.shape[0]
for k in range(nr_frames):
    my_columns.extend(
        [Column(brownian_motion[:k+1,0], 'x{}'.format(k+1)),
         Column(brownian_motion[:k+1,1], 'y{}'.format(k+1)),
         Column(brownian_motion[:k+1,2], 'z{}'.format(k+1))
        ])
grid = Grid(my_columns)    

Finally, I try to build the animated scatter3d line plot.

# Cell 4
data = [dict(
    type='scatter3d',
    xsrc = grid.get_column_reference('x1'),
    ysrc = grid.get_column_reference('y1'),
    zsrc = grid.get_column_reference('z1'),
    marker=dict(
        size=4
    ),
    line=dict(
        color='#1f77b4',
        width=1
    )
)]


frames = []

for k in range(nr_frames):
    frames.append(
        dict(
            data = dict(
                xsrc=grid.get_column_reference('x{}'.format(k+1)),
                ysrc=grid.get_column_reference('y{}'.format(k+1)),
                zsrc=grid.get_column_reference('z{}'.format(k+1))
            )
        )
    )

layout = dict(
    width=800,
    height=700
)

fig = dict(data=data, frames= frames, layout=layout)
py.create_animations(fig)

However, I am getting this hardly understandable error:

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
~\AppData\Local\Continuum\anaconda3\lib\site-packages\plotly\api\v2\utils.py in validate_response(response)
     65     try:
---> 66         parsed_content = response.json()
     67     except ValueError:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\requests\models.py in json(self, **kwargs)
    891                     pass
--> 892         return complexjson.loads(self.text, **kwargs)
    893 

~\AppData\Local\Continuum\anaconda3\lib\json\__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    353             parse_constant is None and object_pairs_hook is None and not kw):
--> 354         return _default_decoder.decode(s)
    355     if cls is None:

~\AppData\Local\Continuum\anaconda3\lib\json\decoder.py in decode(self, s, _w)
    338         """
--> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    340         end = _w(s, end).end()

~\AppData\Local\Continuum\anaconda3\lib\json\decoder.py in raw_decode(self, s, idx)
    356         except StopIteration as err:
--> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
    358         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

PlotlyRequestError                        Traceback (most recent call last)
<ipython-input-3-dc743f0d5686> in <module>()
     33 
     34 fig = dict(data=data, frames= frames, layout=layout)
---> 35 py.create_animations(fig)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\plotly\plotly\plotly.py in create_animations(figure, filename, sharing, auto_open)
   1796         )
   1797 
-> 1798     response = v2.plots.create(body)
   1799     parsed_content = response.json()
   1800 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\plotly\api\v2\plots.py in create(body)
     16     """
     17     url = build_url(RESOURCE)
---> 18     return request('post', url, json=body)
     19 
     20 

~\AppData\Local\Continuum\anaconda3\lib\site-packages\plotly\api\v2\utils.py in request(method, url, **kwargs)
    151         content = response.content if response else 'No content'
    152         raise exceptions.PlotlyRequestError(message, status_code, content)
--> 153     validate_response(response)
    154     return response

~\AppData\Local\Continuum\anaconda3\lib\site-packages\plotly\api\v2\utils.py in validate_response(response)
     67     except ValueError:
     68         message = content if content else 'No Content'
---> 69         raise exceptions.PlotlyRequestError(message, status_code, content)
     70 
     71     message = ''

PlotlyRequestError: <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Plotly</title>

    <style>
        body { background-color: #f3f3f3; }

        .error-page {
            margin-top: 5%;
        }

        .error-page-logo {
            width: 350px;
            margin: auto;
        }

        .error-page-logo img {
            max-width: 100%;
        }

        .error-page-text,
        .error-page-subtext {
            text-align: center;
            color: #1d3b84;
            font-family: 'Open Sans', verdana, arial, sans-serif;
            font-size: 24px;
            font-weight: 400;
            line-height: 1.5;
        }

        .error-page-subtext {
            color: #69738a;
            font-size: 16px;
        }

        a {
            font-size: 14px;
            text-decoration: none;
            color: #447bdc;
        }


        a:hover {
            color: #1d3b84;
        }
    </style>
</head>

<body>
    <div class="error-page">
        <div class="error-page-logo">
            <img alt="plotly" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABfsAAAaoCAMAAAADMfG1AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAbUExURUxpcUR620R620R620R620R620R620R620R622eKAaIAAAAIdFJOUwBAwYHpFqZnPYlNDwAAN+lJREFUeNrswIEAAAAAgKD9qRepAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgduBAAAAAAADI/7URqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoKO3AgAAAAAADk/9oIVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWFnTqmAQAIgQDGDSTvX/ErYCRhaEUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEHnoi4A9uRdlALA/QC4HwD3A+B+ANwPgPsB3O9+APe7H8D97gdwv/sB3O9+APe7H8D97gdwv/sB3O9+gM9OHQgAAAAACPK3HuSCyP3uB3A/AO4HwP0AuB8A9wPgfgD3ux/A/e4HcL/7AdzvfgD3ux/A/e4HcL/7AdzvfgD3ux/A/e4HcD8A7gfA/QC4HwD3A+B+gDv3A7jf/QDudz+A+90P4H73A7jf/QDudz+A+90P4H73A7jf/QDuB8D9ALgfAPcD4H4A3A+A+wHcHzt1IAAAAAAA5P/aCBHeX/X+91e9//1V739/1fvfX/X+91e9//1V739/1fvfX/X+qt5f1furen9V76/q/VW9v+r97696//ur3v/+qve/v+r97696//ur3v/+qve/v+r97696f1Xvr+r9Vb2/qvdX9f6q3l/1/vdXvf/9Ve9/f9X731/1/vdXvf/9Ve9/f9X731/1fuzUMQ0AAAjEQAID/h2jguSHOwkd6v0A3g+A9wPg/QB4PwDeD4D3A+D9AN7v/QDe7/0A3u/9AN7v/QDe7/0A3u/9AN7v/QDe7/0A3u/9AN4PgPcD4P0AeD8A3h9tO9AU4P3e/2gSm3cB3u/93g94v/d7P+D93u/9gPd7v/cD3u/93g94v/d7P+D93u/9gPd7v/cD3u/93g94v/d7P+D93u/9gPd7v/cD3u/93g94v/d7P+D93u/94P3e7/3eD97v/d4PeL/3Hzt1IAAAAAAgyN96kAsi9wPud7/7Afe73/2A+93vfsD97nc/4H73ux9wv/vdD7jf/e4H3O9+9wPud7/7Afe73/2A+93vfsD97nc/4H73ux/c7373ux/c7373A+53v/sB97vf/YD73e9+wP3udz/gfve7H3C/+90PuN/97gfc7373A+53v/sB97vf/YD73e9+wP3udz/gfve7H3C/+90Pd+53v/vB/e53P+B+97sfcL/73Q+43/3uB9zvfvcD7ne/+wH3u9/9gPvd737A/e53P+B+98dOHQgAAAAAAPm/NkKE91fvf//7q/e///3V+9///ur9739/9f73v796//vfX+9///ur97///dX73//+6v3vf3/1/ve/v3r/+99fvf/976/e//73V+9///ur97///dX73//+6v3vf3/1/ve/v3r/+99fvf/976/e//731/vf//7q/e9/f/X+97+/ev/731+9//3vr97//vdX73//+6v3v//91fvf//7q/e9/f/X+97+/ev/731+9//3vr97//vdX73//+6v3v//99f73v796//vfj506pgEAAIEYGCD4t4wKkh+uCjqdJPazn/2S2M9+9ktiP/vZL4n97Ge/JPazn/2S2M9+9ktiP/vZL4n97Ge/JPazn/2S2M9+9ktiP/vZL4n97Ge/JPazn/2S2M9+9kvsZz/7JbGf/eyXxH72s18S+wPsr8SW/ZLY/2l/J54P+yWxn/3sl8R+9rNfEvvZz35J7Gc/+yWxn/3sl8R+9rNfEvvZz35J7Gc/+yWxn/3sl8R+9rNfEvvZz36J/exnvyT2s5/9ktjPfvZLYj/72S+J/exnvyT2s5/9ktjPfvZLYj/72S+J/exnvyT2s5/9x04dCAAAAAAI2p96kYIIcL/73Q+43/3uB9zvfvcD7ne/+wH3u9/9gPvd735wv/vdD7jf/e4H3O9+9wPud7/7Afe73/2A+93vfsD97nc/4H73ux9wv/vdD7jf/e4H3O9+9wPud7/7Afe73/2A+93vfsD97nc/4H73ux/c7373A+53v/sB97vf/YD73e9+wP3udz/gfve7H3C/+90PuN/97gfc7373A+53v/sB97vf/YD73e9+wP3udz/gfve7H3C/+90PuN/97gf3u9/9Ae53v/uZnToQAAAAAADyf22ECPX+97+/ev/731+9//3vr97//vdX73//+6v3v//91fvf//7q/e9/f/X+97+/ev/731+9//3vr97//vdX73//+6v3v//99f73v//99f73v796//vfX73//e+v3v/+91fvf//7q/e///3V+9///ur9739/9f73v796//vfX73//e+v3v/+91fvf//7q/e///3V+9///nr/+9///nr/+99fvf/976/e//73V+9///ur97///dX73//+6v3vf3/1/ve/v3r/+98fdupAAAAAAECQv/UgF0Tgfve7H3C/+90PuN/97gfc7373A+53v/sB97vf/XDnfve7H9zvfvcD7ne/+wH3u9/9gPvd737A/e53P+B+97sfcL/73Q+43/3uB9zvfvcD7ne/+wH3u9/9gPvd737A/e53P+B+97sfcL/73Q+43/3uB/e73/2A+93vfsD97nc/4H73ux9wv/vdD7jf/e4H3O9+9wPud7/7Afe73/2A+93vfsD97nc/4H73ux9wv/vdD7jf/e4H3O9+9wPud7/7wf3udz/ETh0IAAAAAAD5vzZChN7//vdX73//+6v3v//91fvf//7q/e9/f/X+97+/ev/731+9//3vr97//vdX73//+6v3v//91fvf//7q/e9/f/X+97+/ev/731/vf//7q/e///3V+9///ur9739/9f73v796//vfX73//e+v3v/+91fvf//7q/e///3V+9///ur9739/9f73v796//vfX73//e+v3v/+99f73//+6v3vf3/1/ve/v3r/+99fvf/976/e//73V+9///ur97///dX73//+wk4dCAAAAAAI8rce5III97vf/YD73e9+wP3udz/gfve7H3C/+90PuN/97gfc7373g/vd7373g/vd737A/e53P+B+97sfcL/73Q+43/3uB9zvfvcD7ne/+wH3u9/9gPvd737A/e53P+B+97sfcL/73Q+43/3uB9zvfvcD7ne/+8H97ne/+8H97nc/4H73ux9wv/vdD7jf/e4H3O9+9wPud7/7Afe73/2A+93vfsD97nc/4H73ux9wv/vdD7jf/e4H3O9+9wPud7/7Afe73/1w5373ux9ipw5IAABAIAYqYP/KphAevGUYx372s18S+9nPfknsZz/7JbGf/eyXxH72s18S+9nPfknsZz/7JbGf/eyXxH72s18S+9nPfknsZz/7JbGf/eyXxH7239rfiU1JYj/7D+0P3UUS+9nPfknsZz/7JbGf/eyX3sd+9rNfYj/72c9+if3sZz/7Jfazn/3sl9jPfvazX2I/+9nPfon97Gc/+yX2s5/97JfYz372s19iP/vZz36J/exnP/sl9rOf/eyX2M9+9rNfYj/72S+J/exnvyT2s5/9ktjPfvZL7Gc/+9kvsZ/97Ge/xH72s5/9EvvZz372S+xnP/vZL7Gf/exnv7Ts1IEAAAAAAJD/ayNEeP/73//+ev/73//+ev/73//+ev/73//+ev/73//+ev/73//+ev/731+9//3vr97//vdX73//++v973//++v973//++v973//++v973//++v973//++v973//++v973//++v973//++v973//++v973//++v973//++v973//++v9739/9f73v796//vfX73//e+v97///e+v97///e+v97///e+v97///e+v97///e+v97///e+v97///e+v97///e+v97///e+v97///e+v97///e+v97///e+v97///dX73//+Cjt1IAAAAAAA5P/aCBHe//73V+9///vr/e9///vr/e9///vr/e9///vr/e9///vr/e9///vr/e9///vr/e9///vr/e9///vr/e9///vr/e9///vr/e9///vr/e9///vr/e9/f/X+97+/ev/731+9//3vr/e///3vr/e///3vr/e///3vr/e///3vr/e///3vr/e///3vr/e///3vr/e///3vr/e///3vr/e///3vr/e///3vr/e///3vr/e///3V+9///ur9739/9f73v7/e//73v7/e//73v7/e//73v7/e//73v7/e//73v7/e//73v7/ej506tgEABgEYJrUD/3/MD4gBhPNDzH72s19iP/vZz36J/exnP/sl9rOf/eyX2M9+9rNfYj/72c9+if3sZ78k9rOf/ZLYz372S2I/+9kv9RRvYJ/97Ge/VG3vzOxnP/sl9rOf/eyX2M9+9rNfYj/72c9+if3sZz/7Jfazn/3sl9jPfvazX+xnP/vZz36xn/3sZz/7xX72s5/97Bf72c9+9rNf7Gc/+9nPfrGf/exnP/vFfvazn/3sF/vZz372s1/sZz/72S+xn/3sZ7/Efvazn/0S+9nPfvZL7Gc/+9kvsZ/97Ge/xH72s5/9EvvZz37263rsZz/72S/2s5/97Ge/2M9+9rOf/WI/+9nPfvaL/exnP/vZL/azn/3sZ7/Yz/5kpw4EAAAAAID8Xxshwvvf//7e//73v//9vf/9739/vf/9739/vf/9739/vf/9739/vf/9739/vf/9739/vf/9739/vf/9739/vf/9739/73//+9///t7//ve///29//3vf//7e//73//+9/f+97///e/v/e9///vf3/vf//73v7/3v//976/3v//976/3v//976/3v//976/3v//976/3v//976/3v//976/3v//976/3v//97+/973//+9/f+9///ve/v/e///3vf3/vf//73//+3v/+97///b3//e9///t7//vf//739/73v//99f73v//99f73v//99f73v//99f73v//99f73v//99f73Y6cOBAAAAAAE7U+9SEHkfveD+93vfveD+93vfvfjfve73/3ux/3ud7/73Y/73e9+97sf97vf/e53P+53v/vd737c7373u9/9uN/97ne/+3G/+93v/sD97ne/+8H97ne/+8H97ne/+8H97ne/+8H97ne/+8H97ne/+8H97ne/+8H97ne/+3G/+93vfvfjfve73/3ux/3ud7/73Y/73e9+97sf97vf/e53P+53v/vd737c7373u9/9uN/97ne/+3G/+93vfnC/+93vfnC/+93vfnC/+93vfnC/+93vfnC/+93vfnC/+93vfnC/+93vftzvfve73/243/3ud7/7cb/73e9+9+N+97vf/e7H/e53v/vdj/vd7/7Zq2MjAGAQBmKXKuw/MRU7mEPM8BbsZ79jP/vZz372O/azn/3sZ79jP/vZz37n2M9+9rPfOfazn/3sd4797Gc/+12CoIn32M9+9u+3/yfq4mtNV8bMfvazXy7sN2b2s5/9xX72GzP72c9+9rPfmNkvF/azn/3GzH65sJ/97Ddm9suF/exnvzGzXy7sZz/7jZn9cmE/+9nPfmOWC/vZz372G7Nc2M9+9rPfmNkvF/azn/3GzH65sJ/97Ddm9suF/exnvzGzXy7sZz/7jZn9cmE/+9nPfvbLxbGf/exnv1zYb8zsZz/7r+fCfmNmP/vZz372GzP75cJ+9rPfmNkvF/azn/3GzH65sJ/97Ddm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" />
        </div>


        <p class="error-page-text">Uh oh. An error occurred while loading this page.</p>
        <p class="error-page-subtext">
            Try refreshing the page. If the problem persists, open an issue at <a href="https://support.plot.ly">support.plot.ly</a>.
            Thanks for your patience and sorry for the delay.
        </p>

        <p class="error-page-subtext">
            <a href="//plot.ly/">Main site</a>
            &nbsp; &nbsp; &nbsp;
            <a href="//twitter.com/plotlygraphs">@plotlygraphs</a>
            &nbsp; &nbsp; &nbsp;
            <a href="//twitter.com/plotlystatus">@PlotlyStatus</a>
        </p>
    </div>
</body>
</html>

Any idea how I could make it ?

pythonanimation3djupyter-notebookplotly

Answers

comments powered by Disqus