Python:Curved 具有密度颜色的曲面图

Python:Curved surface plot with density colors

我有 [[xi1,yi1,zi1], [xi2,yi2,zi2],....] 形式的不规则间隔网格点数据。它们构成了球体的一部分

我也有数据 [[x1,y1,z1,n1],[x2,y2,z2,n2]...] 其中 (x1,y1,z1) 等告诉中点的坐标每个网格 bin 和 ni 是相应位置的密度。带有数据方形标记的 3d 散点图如下所示(颜色显示 n 的值)

侧视图显示曲率

我正在尝试将其制作成平滑的曲面图。我已经研究了这个例子 matplotlib color 但这里的网格点是等间距的,而在我的情况下它们不是,还有如何在这样一个不规则的网格中使用颜色来表示密度。我愿意尝试除 matplotlib 以外的其他软件包。

谢谢

一种方法是手动创建和绘制一组三角形:

编辑: 围绕 bin 中点手动创建和着色三角形)

import numpy

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.tri import Triangulation
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import matplotlib.cm as cm

# Generate a dataset

R = 1

# bin midpoints
theta = numpy.linspace(numpy.pi/6, numpy.pi/3, 20) + numpy.pi / 2
phi = numpy.linspace(numpy.pi/6, numpy.pi/3, 20)

ttheta, pphi = numpy.meshgrid(theta, phi)
x = R * numpy.sin(ttheta) * numpy.cos(pphi)
y = R * numpy.sin(ttheta) * numpy.sin(pphi)
z = R * numpy.cos(ttheta)

n = numpy.exp(-(ttheta - numpy.pi/4 - numpy.pi/2)**2 * 20 - (pphi - numpy.pi/4)**2 * 20)

mappable = cm.ScalarMappable(cmap=cm.coolwarm, norm=matplotlib.colors.Normalize(vmin=0, vmax=1))
colors = mappable.to_rgba(n)

# Scatter plot

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
ax.scatter(x.flatten(), y.flatten(), z.flatten(), c=colors.reshape(x.size, 4))
ax.set_xlim(0.2, 0.8)
ax.set_ylim(0.2, 0.8)
ax.set_zlim(-0.9, -0.45)
ax.elev = 50
fig.savefig('t.png')

# Surface plot

# bin vertex spherical coordinates
dtheta = theta[1] - theta[0]
dphi = phi[1] - phi[0]
v_theta = numpy.concatenate([theta - dtheta/2, numpy.array([theta[-1] + dtheta/2])])
v_phi = numpy.concatenate([phi - dphi/2, numpy.array([phi[-1] + dphi/2])])

# bin vertex Cartesian coordinates
v_ttheta, v_pphi = numpy.meshgrid(v_theta, v_phi)
vx = R * numpy.sin(v_ttheta) * numpy.cos(v_pphi)
vy = R * numpy.sin(v_ttheta) * numpy.sin(v_pphi)
vz = R * numpy.cos(v_ttheta)

# Creating triangles and corresponding face colors

triangles = []
facecolors = []

for i in range(v_theta.size - 1):
    for j in range(v_phi.size - 1):
        triangles.extend([
            [(i, j), (i + 1, j), (i, j + 1)],
            [(i + 1, j), (i + 1, j + 1), (i, j + 1)]])
        facecolors.extend([
            colors[i, j],
            colors[i, j]
            ])

triangle_vertices = numpy.array(
    [[[vx[i,j], vy[i,j], vz[i,j]] for i, j in t] for t in triangles])
coll = Poly3DCollection(triangle_vertices, facecolors=facecolors, edgecolors=(0,0,0,0))

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
ax.add_collection(coll)
ax.set_xlim(0.2, 0.8)
ax.set_ylim(0.2, 0.8)
ax.set_zlim(-0.9, -0.45)
ax.elev = 50
fig.savefig('t2.png')

散点图:

曲面图: