Plotting points on the surface of a sphere
Asked Answered
N

2

27

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()
Navarre answered 2/8, 2015 at 2:27 Comment(3)
Sadly, I am not sure this is easily doable, mplot3d does not do well with depth perception and layering (not real z-buffer here). You'll have to go on MayaVI (you have Python =< 2.7) or VisPy.Remy
Do you think it would be possible in Gnuplot?Navarre
I think you should post your answer as a real answer instead of an edit of your question and self-accept it (see stackoverflow.com/help/self-answer). Great, post, thanks for sharing.Limnetic
A
21

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.

lebedev_071.txt, 1730 point rule, precision 71.

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

lebedev_025.txt, 230 point rule, precision 25.

   0.000000000000000    90.000000000000000    -0.055226399197273
 180.000000000000000    90.000000000000000    -0.055226399197273
  90.000000000000000    90.000000000000000    -0.055226399197273
 -90.000000000000000    90.000000000000000    -0.055226399197273
  90.000000000000000     0.000000000000000    -0.055226399197273
  90.000000000000000   180.000000000000000    -0.055226399197273
  45.000000000000000    54.735610317245346     0.004450274607445
  45.000000000000000   125.264389682754654     0.004450274607445
 -45.000000000000000    54.735610317245346     0.004450274607445
 -45.000000000000000   125.264389682754654     0.004450274607445
 135.000000000000000    54.735610317245346     0.004450274607445
 135.000000000000000   125.264389682754654     0.004450274607445
-135.000000000000000    54.735610317245346     0.004450274607445
-135.000000000000000   125.264389682754654     0.004450274607445
  45.000000000000000    39.440090784780402     0.004496841067921
  45.000000000000000   140.559909215219591     0.004496841067921
 -45.000000000000000    39.440090784780402     0.004496841067921
 -45.000000000000000   140.559909215219591     0.004496841067921
 135.000000000000000    39.440090784780402     0.004496841067921
 135.000000000000000   140.559909215219591     0.004496841067921
-135.000000000000000    39.440090784780402     0.004496841067921
-135.000000000000000   140.559909215219591     0.004496841067921
  59.815442273124063    63.307345060625650     0.004496841067921
 -59.815442273124063    63.307345060625650     0.004496841067921
  59.815442273124063   116.692654939374364     0.004496841067921
 -59.815442273124063   116.692654939374364     0.004496841067921
 120.184557726875937    63.307345060625650     0.004496841067921
-120.184557726875937    63.307345060625650     0.004496841067921
 120.184557726875937   116.692654939374364     0.004496841067921
-120.184557726875937   116.692654939374364     0.004496841067921
  30.184557726875941    63.307345060625650     0.004496841067921
 149.815442273124063    63.307345060625650     0.004496841067921
  30.184557726875941   116.692654939374364     0.004496841067921
 149.815442273124063   116.692654939374364     0.004496841067921
 -30.184557726875941    63.307345060625650     0.004496841067921
-149.815442273124063    63.307345060625650     0.004496841067921
 -30.184557726875941   116.692654939374364     0.004496841067921
-149.815442273124063   116.692654939374364     0.004496841067921
  45.000000000000000    20.881794557261646     0.005049153450479
  45.000000000000000   159.118205442738343     0.005049153450479
 -45.000000000000000    20.881794557261646     0.005049153450479
 -45.000000000000000   159.118205442738343     0.005049153450479
 135.000000000000000    20.881794557261646     0.005049153450479
 135.000000000000000   159.118205442738343     0.005049153450479
-135.000000000000000    20.881794557261646     0.005049153450479
-135.000000000000000   159.118205442738343     0.005049153450479
  74.903220296612005    75.401622829462283     0.005049153450479
 -74.903220296612005    75.401622829462283     0.005049153450479
  74.903220296612005   104.598377170537717     0.005049153450479
 -74.903220296612005   104.598377170537717     0.005049153450479
 105.096779703387995    75.401622829462283     0.005049153450479
-105.096779703387995    75.401622829462283     0.005049153450479
 105.096779703387995   104.598377170537717     0.005049153450479
-105.096779703387995   104.598377170537717     0.005049153450479
  15.096779703387996    75.401622829462283     0.005049153450479
 164.903220296612034    75.401622829462283     0.005049153450479
  15.096779703387996   104.598377170537717     0.005049153450479
 164.903220296612034   104.598377170537717     0.005049153450479
 -15.096779703387996    75.401622829462283     0.005049153450479
-164.903220296612034    75.401622829462283     0.005049153450479
 -15.096779703387996   104.598377170537717     0.005049153450479
-164.903220296612034   104.598377170537717     0.005049153450479
  45.000000000000000    80.891636123006165     0.003976408018052
  45.000000000000000    99.108363876993835     0.003976408018052
 -45.000000000000000    80.891636123006165     0.003976408018052
 -45.000000000000000    99.108363876993835     0.003976408018052
 135.000000000000000    80.891636123006165     0.003976408018052
 135.000000000000000    99.108363876993835     0.003976408018052
-135.000000000000000    80.891636123006165     0.003976408018052
-135.000000000000000    99.108363876993835     0.003976408018052
  12.774805990014807    45.717979481517574     0.003976408018052
 -12.774805990014807    45.717979481517574     0.003976408018052
  12.774805990014807   134.282020518482426     0.003976408018052
 -12.774805990014807   134.282020518482426     0.003976408018052
 167.225194009985188    45.717979481517574     0.003976408018052
-167.225194009985188    45.717979481517574     0.003976408018052
 167.225194009985188   134.282020518482426     0.003976408018052
-167.225194009985188   134.282020518482426     0.003976408018052
  77.225194009985188    45.717979481517574     0.003976408018052
 102.774805990014812    45.717979481517574     0.003976408018052
  77.225194009985188   134.282020518482426     0.003976408018052
 102.774805990014812   134.282020518482426     0.003976408018052
 -77.225194009985188    45.717979481517574     0.003976408018052
-102.774805990014812    45.717979481517574     0.003976408018052
 -77.225194009985188   134.282020518482426     0.003976408018052
-102.774805990014812   134.282020518482426     0.003976408018052
  45.000000000000000    68.685581154790029     0.004401400650381
  45.000000000000000   111.314418845209985     0.004401400650381
 -45.000000000000000    68.685581154790029     0.004401400650381
 -45.000000000000000   111.314418845209985     0.004401400650381
 135.000000000000000    68.685581154790029     0.004401400650381
 135.000000000000000   111.314418845209985     0.004401400650381
-135.000000000000000    68.685581154790029     0.004401400650381
-135.000000000000000   111.314418845209985     0.004401400650381
  28.889424740291254    48.796111385350962     0.004401400650381
 -28.889424740291254    48.796111385350962     0.004401400650381
  28.889424740291254   131.203888614649060     0.004401400650381
 -28.889424740291254   131.203888614649060     0.004401400650381
 151.110575259708753    48.796111385350962     0.004401400650381
-151.110575259708753    48.796111385350962     0.004401400650381
 151.110575259708753   131.203888614649060     0.004401400650381
-151.110575259708753   131.203888614649060     0.004401400650381
  61.110575259708753    48.796111385350962     0.004401400650381
 118.889424740291247    48.796111385350962     0.004401400650381
  61.110575259708753   131.203888614649060     0.004401400650381
 118.889424740291247   131.203888614649060     0.004401400650381
 -61.110575259708753    48.796111385350962     0.004401400650381
-118.889424740291247    48.796111385350962     0.004401400650381
 -61.110575259708753   131.203888614649060     0.004401400650381
-118.889424740291247   131.203888614649060     0.004401400650381
  45.000000000000000     3.274152069216487     0.017245443505444
  45.000000000000000   176.725847930783516     0.017245443505444
 -45.000000000000000     3.274152069216487     0.017245443505444
 -45.000000000000000   176.725847930783516     0.017245443505444
 135.000000000000000     3.274152069216487     0.017245443505444
 135.000000000000000   176.725847930783516     0.017245443505444
-135.000000000000000     3.274152069216487     0.017245443505444
-135.000000000000000   176.725847930783516     0.017245443505444
  87.683564415961172    87.685455250362111     0.017245443505444
 -87.683564415961172    87.685455250362111     0.017245443505444
  87.683564415961172    92.314544749637903     0.017245443505444
 -87.683564415961172    92.314544749637903     0.017245443505444
  92.316435584038842    87.685455250362111     0.017245443505444
 -92.316435584038842    87.685455250362111     0.017245443505444
  92.316435584038842    92.314544749637903     0.017245443505444
 -92.316435584038842    92.314544749637903     0.017245443505444
   2.316435584038771    87.685455250362111     0.017245443505444
 177.683564415961257    87.685455250362111     0.017245443505444
   2.316435584038771    92.314544749637903     0.017245443505444
 177.683564415961257    92.314544749637903     0.017245443505444
  -2.316435584038771    87.685455250362111     0.017245443505444
-177.683564415961257    87.685455250362111     0.017245443505444
  -2.316435584038771    92.314544749637903     0.017245443505444
-177.683564415961257    92.314544749637903     0.017245443505444
  54.381587934584054    90.000000000000000     0.004231083095357
 -54.381587934584054    90.000000000000000     0.004231083095357
 125.618412065415953    90.000000000000000     0.004231083095357
-125.618412065415953    90.000000000000000     0.004231083095357
  35.618412065415953    90.000000000000000     0.004231083095357
 -35.618412065415953    90.000000000000000     0.004231083095357
 144.381587934584047    90.000000000000000     0.004231083095357
-144.381587934584047    90.000000000000000     0.004231083095357
   0.000000000000000    35.618412065415953     0.004231083095357
   0.000000000000000   144.381587934584047     0.004231083095357
 180.000000000000000    35.618412065415953     0.004231083095357
 180.000000000000000   144.381587934584047     0.004231083095357
   0.000000000000000    54.381587934584054     0.004231083095357
   0.000000000000000   125.618412065415953     0.004231083095357
 180.000000000000000    54.381587934584054     0.004231083095357
 180.000000000000000   125.618412065415953     0.004231083095357
  90.000000000000000    35.618412065415953     0.004231083095357
  90.000000000000000   144.381587934584047     0.004231083095357
 -90.000000000000000    35.618412065415953     0.004231083095357
 -90.000000000000000   144.381587934584047     0.004231083095357
  90.000000000000000    54.381587934584054     0.004231083095357
  90.000000000000000   125.618412065415953     0.004231083095357
 -90.000000000000000    54.381587934584054     0.004231083095357
 -90.000000000000000   125.618412065415953     0.004231083095357
  69.231820019013028    90.000000000000000     0.005198069864064
 -69.231820019013028    90.000000000000000     0.005198069864064
 110.768179980986986    90.000000000000000     0.005198069864064
-110.768179980986986    90.000000000000000     0.005198069864064
  20.768179980986979    90.000000000000000     0.005198069864064
 -20.768179980986979    90.000000000000000     0.005198069864064
 159.231820019013014    90.000000000000000     0.005198069864064
-159.231820019013014    90.000000000000000     0.005198069864064
   0.000000000000000    20.768179980986979     0.005198069864064
   0.000000000000000   159.231820019013014     0.005198069864064
 180.000000000000000    20.768179980986979     0.005198069864064
 180.000000000000000   159.231820019013014     0.005198069864064
   0.000000000000000    69.231820019013028     0.005198069864064
   0.000000000000000   110.768179980986986     0.005198069864064
 180.000000000000000    69.231820019013028     0.005198069864064
 180.000000000000000   110.768179980986986     0.005198069864064
  90.000000000000000    20.768179980986979     0.005198069864064
  90.000000000000000   159.231820019013014     0.005198069864064
 -90.000000000000000    20.768179980986979     0.005198069864064
 -90.000000000000000   159.231820019013014     0.005198069864064
  90.000000000000000    69.231820019013028     0.005198069864064
  90.000000000000000   110.768179980986986     0.005198069864064
 -90.000000000000000    69.231820019013028     0.005198069864064
 -90.000000000000000   110.768179980986986     0.005198069864064
  64.963704081332708    32.473856655655446     0.004695720972569
  64.963704081332708   147.526143344344547     0.004695720972569
 -64.963704081332708    32.473856655655446     0.004695720972569
 -64.963704081332708   147.526143344344547     0.004695720972569
 115.036295918667292    32.473856655655446     0.004695720972569
 115.036295918667292   147.526143344344547     0.004695720972569
-115.036295918667292    32.473856655655446     0.004695720972569
-115.036295918667292   147.526143344344547     0.004695720972569
  74.926112157973748    60.891424466952714     0.004695720972569
  74.926112157973748   119.108575533047286     0.004695720972569
 -74.926112157973748    60.891424466952714     0.004695720972569
 -74.926112157973748   119.108575533047286     0.004695720972569
 105.073887842026252    60.891424466952714     0.004695720972569
 105.073887842026252   119.108575533047286     0.004695720972569
-105.073887842026252    60.891424466952714     0.004695720972569
-105.073887842026252   119.108575533047286     0.004695720972569
  25.036295918667289    32.473856655655446     0.004695720972569
  25.036295918667289   147.526143344344547     0.004695720972569
 -25.036295918667289    32.473856655655446     0.004695720972569
 -25.036295918667289   147.526143344344547     0.004695720972569
 154.963704081332708    32.473856655655446     0.004695720972569
 154.963704081332708   147.526143344344547     0.004695720972569
-154.963704081332708    32.473856655655446     0.004695720972569
-154.963704081332708   147.526143344344547     0.004695720972569
  60.030959593932515    76.866650451671518     0.004695720972569
  60.030959593932515   103.133349548328482     0.004695720972569
 -60.030959593932515    76.866650451671518     0.004695720972569
 -60.030959593932515   103.133349548328482     0.004695720972569
 119.969040406067492    76.866650451671518     0.004695720972569
 119.969040406067492   103.133349548328482     0.004695720972569
-119.969040406067492    76.866650451671518     0.004695720972569
-119.969040406067492   103.133349548328482     0.004695720972569
  15.073887842026251    60.891424466952714     0.004695720972569
  15.073887842026251   119.108575533047286     0.004695720972569
 -15.073887842026251    60.891424466952714     0.004695720972569
 -15.073887842026251   119.108575533047286     0.004695720972569
 164.926112157973762    60.891424466952714     0.004695720972569
 164.926112157973762   119.108575533047286     0.004695720972569
-164.926112157973762    60.891424466952714     0.004695720972569
-164.926112157973762   119.108575533047286     0.004695720972569
  29.969040406067499    76.866650451671518     0.004695720972569
  29.969040406067499   103.133349548328482     0.004695720972569
 -29.969040406067499    76.866650451671518     0.004695720972569
 -29.969040406067499   103.133349548328482     0.004695720972569
 150.030959593932522    76.866650451671518     0.004695720972569
 150.030959593932522   103.133349548328482     0.004695720972569
-150.030959593932522    76.866650451671518     0.004695720972569
-150.030959593932522   103.133349548328482     0.004695720972569
Albina answered 2/8, 2015 at 19:49 Comment(2)
Thanks, that looks great! However, I should say the data I use is not in polar coords like yours - it is already in cartestian x, y, z. I have found another solution to my problem - I will edit my post to include it :)Navarre
An update for newer versions of matplotlib; instead of ax.set_aspect("equal"), use ax.set_box_aspect((1,1,1)) to get equally-scaled axes.Whale
S
1

Try using the zorder parameter. In the example given below the 3D line plot will be shown on top of the 3D trisurf plot. The reason why zorder goes from 0 to 10 instead of 0 to 1 is given here.

plt_axes.plot_trisurf(x, y, z, shade=False, color='blue', cmap='Blues', zorder=0)
plt_axes.plot(x, y, z, marker='.', linestyle='None', label='Label', color='red', zorder=10)
Saberio answered 16/10, 2018 at 13:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.