# Cylindrical ContoursΒΆ

```import numpy as np
from matplotlib import pyplot as plt
import s3dlib.surface as s3d

#.. Cylindrical Surface Contours

# 1. Define functions to examine ....................................

def twistFunction(rtz,twists) :
r,t,z = rtz
# Note: sliced surface needed due to discontinuity @ t=0 if twists is odd
thickness = 0.33
w = thickness*z
phi = 0.5*t*twists
R = 1 + w * np.cos(phi)
Z = w * np.sin(phi)
return R,t,Z

def ribbonFunc(rtz) :
r,t,z = rtz
R = d + min_radius + d*z
Z = np.cos(R)*np.sin(3*t)
return R,t,Z

rtz = s3d.CylindricalSurface.coor_convert(xyz,False)
return rtz[0]

# 2. Setup and map surfaces .........................................
rez = 5

twist = s3d.CylindricalSurface(rez, basetype='squ_s')
twist.map_geom_from_op( lambda rtz : twistFunction(rtz,1) )
tline = twist.contourLineSet(8,coor=1, name='Twist Contours')

ribbon = s3d.CylindricalSurface(rez, basetype='tri')
ribbon.map_geom_from_op( ribbonFunc )
rline = ribbon.contourLineSet(8,coor=1, name='Ribbon Contours')

# 3. Construct figure, add surfaces, and plot ......................

contours = [ tline, rline ]
minmax = (-.8,0.8)

fig = plt.figure(figsize=[10,4],facecolor='k')
fig.text(0.25,0.05,str(tline), ha='center', va='bottom', color='w',
fontsize='smaller', multialignment='right')
fig.text(0.75,0.05,str(rline), ha='center', va='bottom', color='w',
fontsize='smaller', multialignment='right')

for i in range(2) :
ax.set(xlim=minmax, ylim=minmax, zlim=minmax )
ax.set_axis_off()
cSet = contours[i]
ax.set_title(cSet.name,color='w')

cbar = plt.colorbar(cSet.stcBar_ScalarMappable(8), ax=ax, shrink=0.6 )
cbar.set_label(tline.cname, rotation=270, labelpad = 15, color='w')
cbar.outline.set_edgecolor('dimgrey')
plt.setp(plt.getp(cbar.ax.axes, 'yticklabels'), color='w')