Strips on sphere

In [1]:
import numpy as np

We generate a sphere from 12 strips. The basic strip is parameterized and discretized below:

In [12]:
theta=np.linspace(0, 5*np.pi/36, 30)  #5pi/36=25 degrees
phi=np.linspace(-np.pi/2, np.pi/2, 100)
theta, phi=np.meshgrid(theta, phi)
x=np.cos(theta)*np.cos(phi)
y=np.sin(theta)*np.cos(phi)
z=np.sin(phi)

This strip is rotated about Oz, with integer multiple of $\pi/6$ radians. Since z-rotation does not change z values, we define only a planar rotation of alpha radians:

In [13]:
def Rot(alpha):
    return np.array([[np.cos(alpha), -np.sin(alpha)], [np.sin(alpha), np.cos(alpha)]])

Instead of applying this rotation successively to each point in the basic strip, we make use of the numpy function einsum (Einstein summation), and rotate simultaneously all points with coordinates in two equally shaped meshgrids (x,y, in our case):

In [14]:
def rotate_z_mesh(x, y, alpha):
    return np.einsum('ji, mni -> jmn', Rot(alpha), np.dstack([x, y]))

The colorscale to plot the sphere's strips:

In [15]:
cofee_green=[[0.0,u'#543005'],
[0.1,u'#8c510a'],
[0.2, u'#bf812d'],
[0.3, u'#dfc27d'],
[0.4, u'#f6e8c3'],
[0.5, u'#f5f5f5'],
[0.6, u'#c7eae5'],
[0.7, u'#80cdc1'],
[0.8, u'#35978f'],
[0.9, u'#01665e'],
[1.0, u'#003c30']]
In [16]:
import plotly.plotly as py
import plotly.tools as tls
from plotly.graph_objs import *
In [17]:
def make_trace(x,y,z, colsc):# this function creates the trace for each strip on sphere
    return Surface(
        x=x,
        y=y,
        z=z,
        colorscale=colsc,         
        name=''            
    )
In [18]:
dt=[make_trace(x,y,z, cofee_green)]#initial strip
for k in range(1,12):
    rez=rotate_z_mesh(x, y, k*np.pi/6)
    dt+=[make_trace(rez[0], rez[1], z, cofee_green)]
In [19]:
data=Data(dt)
In [20]:
axis = dict(
showbackground=True, 
backgroundcolor='rgb(20, 20, 20)', 
gridcolor='rgb(75, 75, 75)',      
zerolinecolor='rgb(75, 75, 75)'
    )

layout = Layout(
         title='Strips on sphere', 
         width=800,
         height=800,
         scene=Scene(  
         xaxis=XAxis(axis),
         yaxis=YAxis(axis), 
         zaxis=ZAxis(axis), 
        )
        )
        
fig = Figure(data=data, layout=layout)
py.sign_in('empet', 'my_api_key')
py.plot(fig, filename='spherical-strips')
The draw time for this plot will be slow for clients without much RAM.
Out[20]:
u'https://plot.ly/~empet/4759'
In [31]:
from IPython.core.display import HTML
def  css_styling():
    styles = open("./custom.css", "r").read()
    return HTML(styles)
css_styling()
Out[31]: