Trazando la distribución de la temperatura en una esfera con python

Tengo el siguiente problema:

a tiene N puntos en una esfera especificada por una matriz x, con x.shape = (N, 3). Esta matriz contiene sus coordenadas cartesianas. Además, en cada punto, tengo una temperatura específica. Esta cantidad se guarda en una matriz T, con T. forma = (N,).

¿Hay alguna forma directa de mapear esta distribución de temperatura en el plano usando diferentes colores?

Si simplifica la tarea, la posición también se puede dar en coordenadas polares (\ theta, \ phi).

Para trazar sus datos, puede utilizar el mapa base. El único problema es que las rutinas tanto de contour como de contourf necesitan datos reticulados. Aquí hay un ejemplo con una interpolación tipo IDW ingenua (y lenta) en una esfera. Cualquier comentario es bienvenido.

 import numpy as np from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt def cart2sph(x, y, z): dxy = np.sqrt(x**2 + y**2) r = np.sqrt(dxy**2 + z**2) theta = np.arctan2(y, x) phi = np.arctan2(z, dxy) theta, phi = np.rad2deg([theta, phi]) return theta % 360, phi, r def sph2cart(theta, phi, r=1): theta, phi = np.deg2rad([theta, phi]) z = r * np.sin(phi) rcosphi = r * np.cos(phi) x = rcosphi * np.cos(theta) y = rcosphi * np.sin(theta) return x, y, z # random data pts = 1 - 2 * np.random.rand(500, 3) l = np.sqrt(np.sum(pts**2, axis=1)) pts = pts / l[:, np.newaxis] T = 150 * np.random.rand(500) # naive IDW-like interpolation on regular grid theta, phi, r = cart2sph(*pts.T) nrows, ncols = (90,180) lon, lat = np.meshgrid(np.linspace(0,360,ncols), np.linspace(-90,90,nrows)) xg,yg,zg = sph2cart(lon,lat) Ti = np.zeros_like(lon) for r in range(nrows): for c in range(ncols): v = np.array([xg[r,c], yg[r,c], zg[r,c]]) angs = np.arccos(np.dot(pts, v)) idx = np.where(angs == 0)[0] if idx.any(): Ti[r,c] = T[idx[0]] else: idw = 1 / angs**2 / sum(1 / angs**2) Ti[r,c] = np.sum(T * idw) # set up map projection map = Basemap(projection='ortho', lat_0=45, lon_0=15) # draw lat/lon grid lines every 30 degrees. map.drawmeridians(np.arange(0, 360, 30)) map.drawparallels(np.arange(-90, 90, 30)) # compute native map projection coordinates of lat/lon grid. x, y = map(lon, lat) # contour data over the map. cs = map.contourf(x, y, Ti, 15) plt.title('Contours of T') plt.show() 

introduzca la descripción de la imagen aquí

Una forma de hacerlo es configurar los facecolors de la facecolors mediante el mapeo de sus datos de calor a través del mapa de colores.

Aquí hay un ejemplo:

introduzca la descripción de la imagen aquí

 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np from matplotlib import cm fig = plt.figure() ax = fig.add_subplot(111, projection='3d') u = np.linspace(0, 2 * np.pi, 80) v = np.linspace(0, np.pi, 80) # create the sphere surface x=10 * np.outer(np.cos(u), np.sin(v)) y=10 * np.outer(np.sin(u), np.sin(v)) z=10 * np.outer(np.ones(np.size(u)), np.cos(v)) # simulate heat pattern (striped) myheatmap = np.abs(np.sin(y)) ax.plot_surface(x, y, z, cstride=1, rstride=1, facecolors=cm.hot(myheatmap)) plt.show() 

Aquí, mi “mapa de calor” es solo rayas a lo largo del eje y, que hice usando la función np.abs(np.sin(y)) , pero cualquier cosa que pase de 0 a 1 funcionará (y, por supuesto, funcionará). necesita coincidir con las formas en x , etc.