title: Plotting points on the surface of a sphere in Python's matplotlib
body: <p>I'm trying to generate a plot of a sphere, with some points plotted on the surface of the sphere. (Specifically the points are the Lebedev quadrature points) I want my plot to look similar to this one that I found online: <a href="https://i.stack.imgur.com/zQiXI.png" rel="noreferrer"><img src="https://i.stack.imgur.com/zQiXI.png" alt="enter image description here"></a></p>
  
  <p>I proceed by plotting a spherical surface, and then overlaying it with a scatter plot. However, this results in most of my points being 'absorbed' by the underlying sphere, making them difficult to see. Take a look: <a href="https://i.stack.imgur.com/UylUt.png" rel="noreferrer"><img src="https://i.stack.imgur.com/UylUt.png" alt="enter image description here"></a></p>
  
  <p>How can I prevent my points from being obscured by the sphere? Here is the script I use to generate this plot: </p>
  
  <pre><code>import matplotlib.pyplot as plt
  from matplotlib import cm, colors
  from mpl_toolkits.mplot3d import Axes3D
  import numpy as np
  
  # Create a sphere
  r = 1
  pi = np.pi
  cos = np.cos
  sin = np.sin
  phi, theta = np.mgrid[0.0:pi:100j, 0.0:2.0*pi:100j]
  x = r*sin(phi)*cos(theta)
  y = r*sin(phi)*sin(theta)
  z = r*cos(phi)
  
  #Import data
  data = np.genfromtxt('leb.txt')
  xx, yy, zz = np.hsplit(data, 3) 
  
  #Set colours and render
  fig = plt.figure()
  ax = fig.add_subplot(111, projection='3d')
  
  ax.plot_surface(
      x, y, z,  rstride=1, cstride=1, color='c', alpha=0.6, linewidth=0)
  
  ax.scatter(xx,yy,zz,color="k",s=20)
  
  ax.set_xlim([-1,1])
  ax.set_ylim([-1,1])
  ax.set_zlim([-1,1])
  ax.set_aspect("equal")
  plt.tight_layout()
  #plt.show()
  </code></pre>
  
  <h2>Edit</h2>
  
  <p>I have found a way to do this using Python's mayavi. Here is what I get: </p>
  
  <p><a href="https://i.stack.imgur.com/f856M.png" rel="noreferrer"><img src="https://i.stack.imgur.com/f856M.png" alt="enter image description here"></a></p>
  
  <p>and here is the code I used:</p>
  
  <pre><code>from mayavi import mlab
  import numpy as np
  
  # Create a sphere
  r = 1.0
  pi = np.pi
  cos = np.cos
  sin = np.sin
  phi, theta = np.mgrid[0:pi:101j, 0:2 * pi:101j]
  
  x = r*sin(phi)*cos(theta)
  y = r*sin(phi)*sin(theta)
  z = r*cos(phi)
  
  mlab.figure(1, bgcolor=(1, 1, 1), fgcolor=(0, 0, 0), size=(400, 300))
  mlab.clf()
  
  data = np.genfromtxt('leb.txt')
  xx, yy, zz = np.hsplit(data, 3)
  
  
  mlab.mesh(x , y , z, color=(0.0,0.5,0.5))
  mlab.points3d(xx, yy, zz, scale_factor=0.05)
  
  
  mlab.show()
  </code></pre>