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

时间:2016-02-02 00:15:44

标签: python matplotlib plot surface

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

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

其侧视图显示曲率enter image description here

我试图将其变成光滑的曲面图。我已经研究过这个例子matplotlib color但是这里的网格点是等间距的,而在我的情况下它们不是,也就是如何用这种不规则网格中的颜色来表示密度。我愿意尝试除matplotlib以外的其他软件包。

谢谢

1 个答案:

答案 0 :(得分:1)

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

编辑:在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')

散点图:

enter image description here

表面图:

enter image description here

相关问题