# 3D surface animation the diameter of a wire/cylinder

**URL:** <https://community.plotly.com/t/3d-surface-animation-the-diameter-of-a-wire-cylinder/8615>\
**Category:** 📊 Plotly Python\
**Created:** [February 26, 2018, 1:07pm UTC](https://community.plotly.com/t/3d-surface-animation-the-diameter-of-a-wire-cylinder/8615 "2018-02-26T13:07:48Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Predetorajes](https://avatars.discourse-cdn.com/v4/letter/p/f07891/32.png) [@Predetorajes](https://community.plotly.com/u/Predetorajes)\
**Post date:** [February 26, 2018, 1:07pm UTC](https://community.plotly.com/t/3d-surface-animation-the-diameter-of-a-wire-cylinder/8615/1 "2018-02-26T13:07:48Z")

</div>

Hello,

I am trying to recreate a 3D model of a wire and add a slider for one the axis.  
I am able to this with the code below (sorry for the length, I didnt have time to remove/correct things yet since I am still in the first part of my project).  
As I did not see anything like the range slider, I tried using sliders with for each frame a different part of the wire.  
However I cant get this to work and I cant find the error. I based this code on codes that I found:

> **[Jupyter Notebook Viewer](https://nbviewer.jupyter.org/gist/empet/365cf202391bf7a58021388fadd52004)**
>
> Check out this Jupyter notebook!

  

> <https://stackoverflow.com/questions/35143115/3d-plot-of-cylindrical-surface-in-python>

–  
import plotly.graph\_objs as go  
import random  
import plotly.plotly as py  
import numpy as np  
MaxDiameter=s = np.random.uniform(2.85,2.95,1000)  
MinDiameter=s = np.random.uniform(2.75,2.85,1000)  
x=[]  
y=[]  
z=[]

xx=[]  
yy=[]  
zz=[]

xxlist=[]  
yylist=[]  
zzlist=[]  
pixels=20  
t = np.linspace(0, 2 \* np.pi, pixels)#gives 2\*20  
iteration=0  
iterationadd=1  
seconditer=0  
framesize=20

for Max,Min in zip(MaxDiameter,MinDiameter):  
if iteration\<(framesize+seconditer) and iteration\>=(0+seconditer):  
print(iteration)  
us = np.linspace(0, 2 \* np.pi, pixels)  
zs = np.linspace(iteration,iteration+iterationadd, 2)  
iteration+=iterationadd  
us, zs = np.meshgrid(us, zs)

```
# xs = (Dia+Ovality) * np.cos(us)
# ys = (Dia-Ovality) * np.sin(us)
    xs = Max* np.cos(us)
    ys = Min * np.sin(us)
    x.append(xs)
    y.append(ys)
    z.append(zs)
else:
    print('hmm ',iteration)
    seconditer+=framesize
    print('second',seconditer)

```

# xx=xs\*0

# yy=ys\*0

# zz=ys\*0

```
    for a,s,d,leng in zip(x,y,z,range(len(z))):
        if leng==0:
            zz=d
            yy=s
            xx=a
            continue
        zz=np.concatenate((zz,d))
        yy=np.concatenate((yy,s))
        xx=np.concatenate((xx,a))
    zz,xx=xx,zz#swap
    xxlist.append(xx)
    yylist.append(yy)
    zzlist.append(zz)
    x=[]
    y=[]
    z=[]

    xx=[]
    yy=[]
    zz=[]

```

for a,s,d,leng in zip(x,y,z,range(len(z))):  
if leng==0:  
zz=d  
yy=s  
xx=a  
continue  
zz=np.concatenate((zz,d))  
yy=np.concatenate((yy,s))  
xx=np.concatenate((xx,a))  
zz,xx=xx,zz#swap  
xxlist.append(xx)  
yylist.append(yy)  
zzlist.append(zz)  
x=[]  
y=[]  
z=[]  
xx=[]  
yy=[]  
zz=[]  
surface = go.Surface(x=xxlist[1], y=yylist[1], z=zzlist[1])#cartensian coordiantes  
data = [surface]

datalist=[]  
for v in range(len(xxlist)):  
surface = go.Surface(x=xxlist[v], y=yylist[v], z=zzlist[v])  
thedata = [surface]  
datalist.append(thedata)  
theframes=[dict(data= datalist[k],  
traces= [0],  
name=‘frame{}’.format(k)  
) for k in range(len(xxlist))]

sliders=[dict(steps= [dict(method= ‘animate’,  
args= [[‘frame{}’.format(k)],  
dict(mode= ‘immediate’,  
frame= dict( duration=50, redraw= False ),  
transition=dict( duration= 0)  
)  
]  
) for k in range(len(xxlist))],  
transition= dict(duration= 0 ),  
x=0,  
y=0,  
currentvalue=dict(font=dict(size=12),  
prefix='Time: ',  
visible=True,  
xanchor= ‘center’  
),  
len=1.0))  
]

rangehx=4  
rangelx=-4  
layout = go.Layout(  
title=‘Wire’,  
scene=dict(  
xaxis=dict(  
gridcolor=‘rgb(255, 255, 255)’,  
zerolinecolor=‘rgb(255, 255, 255)’,  
showbackground=True,  
backgroundcolor=‘rgb(230, 230,230)’,  
yaxis=dict(  
gridcolor=‘rgb(255, 255, 255)’,  
zerolinecolor=‘rgb(255, 255, 255)’,  
showbackground=True,  
backgroundcolor=‘rgb(230, 230,230)’,  
range=[rangelx,rangehx]  
),  
zaxis=dict(  
gridcolor=‘rgb(255, 255, 255)’,  
zerolinecolor=‘rgb(255, 255, 255)’,  
showbackground=True,  
backgroundcolor=‘rgb(230, 230,230)’,  
range=[rangelx,rangehx]  
),

```
),
updatemenus=[dict(type='buttons', showactive=False,
            y=0,
            x=1.15,
            xanchor='right',
            yanchor='top',
            pad=dict(t=0, r=10),
            buttons=[dict(label='Play',
                          method='animate',
                          args=[None, 
                                dict(frame=dict(duration=30, 
                                                redraw=True),
                                     transition=dict(duration=0),
                                     fromcurrent=True,
                                     mode='immediate'
                                    )
                               ]
                         )
                    ]
           )
      ],
sliders=sliders,

```

fig = go.Figure(data=data, layout=layout,frames=theframes)  
py.iplot(fig, filename=‘Diameter3’)
