web-dev-qa-db-fra.com

Tracer des points à la surface d'une sphère dans matplotlib de Python

J'essaie de générer un tracé d'une sphère, avec quelques points tracés à la surface de la sphère. (Plus précisément, les points sont les points de quadrature de Lebedev) Je souhaite que mon graphique ressemble à celui que j'ai trouvé en ligne:  enter image description here

Je procède en traçant une surface sphérique, puis en la superposant avec un nuage de points. Cependant, la plupart de mes arguments sont «absorbés» par la sphère sous-jacente, ce qui les rend difficiles à voir. Regarde:  enter image description here

Comment puis-je empêcher mes points d'être obscurcis par la sphère? Voici le script que j'utilise pour générer ce graphique: 

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

Modifier

J'ai trouvé un moyen de faire cela en utilisant mayavi de Python. Voici ce que je reçois: 

 enter image description here

et voici le code que j'ai utilisé:

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()
10
O Smith

Vous pouvez réduire l’alpha de la sphère si vous pensez que les points ne sont pas suffisamment visibles. Cependant, je pense que vous pouvez traiter les données avec des coordonnées x, y, z incorrectement. J'ai eu une liste de points à partir d'ici: http://people.sc.fsu.edu/~jburkardt/m_src/sphere_lebedev_rule_display/sphere_lebedev_rule_display.html , et ma sphère avait des points qui ressemblaient un peu à ce que vous avez vus jusqu'à ce que je réalise que le fichier contenait les valeurs pour thêta et phi et que je devais transformer les degrés en radians. 

Voici le code que j'ai utilisé:

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

9
Amy Teegarden

Essayez d’utiliser le paramètre zorder. Dans l'exemple donné ci-dessous, le tracé de lignes 3D sera affiché en haut du tracé de trisurf 3D. La raison pour laquelle zorder passe de 0 à 10 au lieu de 0 à 1 est donnée ici .

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)
0
Noel Farrugia