S3DlibΒΆ

../../_images/s3d_sph1.png

The figure is a clipped surface using the spherical harmonics function used in the Two methods of Representing example. The following is the colormap applied to the surface.

../../_images/cmap_gyoc.png
import numpy as np
from scipy import special as sp
from matplotlib import pyplot as plt
import s3dlib.surface as s3d
import s3dlib.cmap_utilities as cmu

#.. S3Dlib logo

# 1. Define function to examine .....................................
v = [ [ 1,-1,-1], [ 1, 1,-1], [-1, 1,-1],
      [-1, 1, 1], [-1,-1, 1], [ 1,-1, 1], [ 1,-1,-1] ]

def sphHar(rtp) :
    r, theta, phi = rtp
    m, l = 2,3
    r = sp.sph_harm(m, l, theta, phi).real
    return r, theta, phi

def sphHar_absR(rtp) :
    r, theta, phi = sphHar(rtp)
    return np.abs(r), theta, phi

# 2. Setup and map surface .........................................
colors = [ [0.03,1,0], [0.90,1,0], [1,0.40,0], [0,1,0.77] ]
cmu.stitch_color(*colors,name='gyoc')

rez, illum, scale = 6, [-2,3,3], 3.6
clip_pos = lambda c : sphHar(c)[0] > 0
fourValue_op = lambda c : [ int(2*t/np.pi+0.5)%4 for t in c[1] ]
sph_23_pos = s3d.SphericalSurface(rez,'octa')
sph_23_pos.map_geom_from_op(sphHar_absR).clip(clip_pos)
sph_23_pos.map_cmap_from_op(fourValue_op, 'gyoc' )
sph_23_pos.transform(scale=scale)
logo = sph_23_pos.shade(direction=illum).hilite(.8,direction=illum)

rez,lw,ec = 1, 0.5, '0.5'
X_plane = lambda c : [ c[1],c[2],c[0] ]
Y_plane = lambda c : [ c[2],c[0],c[1] ]
pl_x = s3d.PlanarSurface(rez,'squ',facecolor='0.8',lw=lw)
pl_x.map_geom_from_op(Y_plane).transform(translate=[-1,0,0])
pl_y = s3d.PlanarSurface(rez,'squ',facecolor='0.9',lw=lw)
pl_y.map_geom_from_op(X_plane).transform(translate=[0,-1,0])
pl_z = s3d.PlanarSurface(rez,'squ',facecolor='0.97',lw=lw)
pl_z.transform(translate=[0,0,-1])
planes = [pl_x,pl_y,pl_z]

brdr = s3d.SegmentLine(v,color='0.6',lw=3)
# 3. Construct figure, add surface, and plot ......................
minmax = (-1,1)
fig = plt.figure(figsize=(4,4))
ax = plt.axes(projection='3d', aspect='equal')
ax.set(xlim=minmax, ylim=minmax, zlim=minmax )
ax.set_axis_off()
ax.view_init(15,60)

for plane in planes :
    plane._sort_zpos = -99
    plane.set_edgecolor(ec)
    ax.add_collection3d(plane)
ax.add_collection3d(logo)
ax.add_collection3d(brdr)

fig.tight_layout(pad=-1)

plt.show()