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')
Out[20]:
In [31]:
from IPython.core.display import HTML
def css_styling():
styles = open("./custom.css", "r").read()
return HTML(styles)
css_styling()
Out[31]: