用python绘制球体上的温度分布

时间:2014-03-02 14:34:37

标签: python matplotlib plot

我有以下问题:

a由数组x指定的球体上有N个点,x.shape =(N,3)。该数组包含它们的笛卡尔坐标。此外,在每个点,我都有一个指定的温度。此数量保存在数组T中,T.shape =(N,)。

有没有直接的方法将这种温度分布映射到使用不同颜色的平面?

如果它简化了任务,也可以在极坐标(\ theta,\ phi)中给出位置。

2 个答案:

答案 0 :(得分:5)

要绘制数据,您可以使用Basemap。唯一的问题是,contourcontourf例程都需要网格化数据。这是在球体上进行类似IDW的天真(和慢速)插值的示例。欢迎提出任何意见。

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

enter image description here

答案 1 :(得分:4)

执行此操作的一种方法是通过将热量数据映射到色彩映射来设置facecolors

以下是一个例子:

enter image description here

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

在这里,我的“热图”只是沿着y轴的条纹,我使用函数np.abs(np.sin(y))制作,但是从0到1的任何形状都可以工作(当然,它需要匹配x等上的形状