Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plotting points on the surface of a sphere in Python's matplotlib

Tags:

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: enter image description here

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: enter image description here

How can I prevent my points from being obscured by the sphere? Here is the script I use to generate this plot:

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() 

Edit

I have found a way to do this using Python's mayavi. Here is what I get:

enter image description here

and here is the code I used:

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() 
like image 927
O Smith Avatar asked Aug 02 '15 02:08

O Smith


People also ask

What matplotlib function can be used to draw a surface plot?

Surface plots are created by using ax. plot_surface() function.

How do I show points in matplotlib?

Set the figure size and adjust the padding between and around the subplots. Create lists of x and y data points. Set some axis properties. Iterate x and y to show the coordinates on the plot.

How do you plot points on a graph in Python?

Use plt. scatter() to plot points Call plt. scatter(x, y) with x as a sequence of x-coordinates and y as a corresponding sequence of y-coordinates to plot the points.


1 Answers

You can lower the alpha of the sphere if you think the points aren't showing up well enough. However, I think you may be processing the data into x, y, z coordinates incorrectly. I got a list of points from here: http://people.sc.fsu.edu/~jburkardt/m_src/sphere_lebedev_rule_display/sphere_lebedev_rule_display.html, and my sphere had points that looked kind of like yours until I realized that the file contained the values for theta and phi, and that I needed to turn degrees into radians.

Here's the code I used:

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') theta, phi, r = np.hsplit(data, 3)  theta = theta * pi / 180.0 phi = phi * pi / 180.0 xx = sin(phi)*cos(theta) yy = sin(phi)*sin(theta) zz = cos(phi)  #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.3, 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() 

Spherical graph

like image 176
Amy Teegarden Avatar answered Sep 29 '22 09:09

Amy Teegarden