2 votes

Comment tracer une carte thermique sur une surface sphérique avec l'azimut et l'élévation et une valeur correspondante pour chaque position ?

J'ai trois valeurs : azimut, élévation et une valeur d'erreur à cette position. Et à partir de là, j'ai un certain nombre de combinaisons de ces trois valeurs. Donc trois tableaux d'azimuts, d'élévations et d'erreurs correspondantes.

Je veux tracer une sphère avec une carte thermique de sorte que la couleur d'une région représente l'erreur dans cette région de la sphère. Cela permettrait de déterminer quelle partie de la sphère présente l'erreur la plus élevée.

Comment puis-je le tracer ? J'ai essayé de créer une grille de maillage

r = 2
u, v = np.mgrid[0:2.01 * np.pi:(1/10)* np.pi, 0:1.01*np.pi:(1/10)* np.pi]
X = r * np.cos(u) * np.sin(v)
Y = r * np.sin(u) * np.sin(v)
Z = r * np.cos(v)

Cela créerait un maillage. Comment intégrer l'azimut, l'élévation et l'erreur à chaque position dans cette classification en sous-régions ?

2voto

Vous pourriez le faire de cette façon :

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams["figure.figsize"] = [15.00, 6.0]
plt.rcParams["figure.autolayout"] = True
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
r = 2
u, v = np.mgrid[0:2.01 * np.pi:(1/10)* np.pi, 0:1.01*np.pi:(1/10)* np.pi]
X = r * np.cos(u) * np.sin(v)
Y = r * np.sin(u) * np.sin(v)
Z = r * np.cos(v)
ax.plot_surface(X, Y, Z, cmap=plt.cm.YlGnBu_r)
plt.show()

Qui revient :

enter image description here

UPDATE

D'une autre manière, si vous voulez introduire des points comme ceux que vous voulez (ici, je randomise, mais vous devrez formater vos points exactement de la même manière si vous voulez utiliser le code inchangé), vous pouvez faire ceci :

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm

def random_point(r=2):
    ct = 2*np.random.rand() - 1
    st = np.sqrt( 1 - ct**2 )
    phi = 2* np.pi *  np.random.rand()
    x = r * st * np.cos( phi)
    y = r * st * np.sin( phi)
    z = r * ct
    return np.array( [x, y, z ] )

def near( p, pntList, d0 ):
    cnt=0
    for pj in pntList:
        dist=np.linalg.norm( p - pj )
        if dist < d0:
            cnt += 1 - dist/d0
    return cnt

Azimuth_points = np.array([ random_point(2.02) for i in range(23) ] )

fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1, projection='3d')

u = np.linspace( 0, 2 * np.pi, 120)
v = np.linspace( 0, np.pi, 60 )
r = 2
X = r * np.outer( np.cos( u ), np.sin( v ) )
Y = r * np.outer( np.sin( u ), np.sin( v ) )
Z = r * np.outer( np.ones( np.size( u ) ), np.cos( v ) )

W = X.copy()
for i in range( len(X) ):
    for j in range( len(X[0]) ):
        x = X[ i, j ]
        y = Y[ i, j ]
        z = Z[ i, j ]
        W[ i, j ] = near(np.array( [x, y, z ] ), Azimuth_points, 3)
W = W / np.amax( W )
myheatmap = W

ax.plot_surface( X, Y,  Z, cstride=1, rstride=1, facecolors=cm.jet( myheatmap ) )
plt.show() 

ce qui donne :

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X