具有非均匀网格的 3 维绘图

计算科学 Python 数值建模 绘图 网格 3d
2021-11-29 10:26:47

我正在考虑 3 个变量:时间 (t)、一维空间 (x) 和强度 (I)。我想将 z 轴上的强度绘制为 t 和 x 的函数(后两个变量将形成 xy 平面)。对于我拥有的当前数据,这些变量本身是二维数组,其中来自不同数组的每个对应索引都与单个数据点(即(x,t,I) = (x[k,i],t[k,i],I[k,i]))适当匹配。(理想情况下,这种方法将扩展到维数大于 2 的数组。)

这是一组示例数据:

I = [[  10.55   0.   0.]
[  0.   0.   0.01]
[  0.2   -0.1   3.33]
[  0.  2.14   0.]
[  0.   3.80   0.]
[  9.02   0.   0.]]

t = [[   0.  400.  1000.]
[   1.  300.  800.]
[   0.  500.  900.]
[   200.  400.  0.]
[   100.  700.  0.]
[   0.  0.    0.]]

x = [[    0.     0.     0.]
[ 500.  1500.  1500.]
[ 3000.  3000.  8000.]
[ 3300.  4500.  0.]
[ 6000.  6000.  0.]
[ 7500.  0.     0.]]

z[k,i] = t[k,i] = 0.请注意:每行的长度已在数组中等效,但如果ifk != 0和 ,则理想情况下它们应该为 null i != 0如您所知,在上面的示例中,有 4 个这样的元素对应于索引:[k,i] = [3,2], [4,2], [5,1], [5,2]. 虽然这些只会影响坐标(0,0,0)

重申我的目标:我想将 t、x 和 I 绘制为 3 维曲面。过去,使用如下代码:

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

X, Y = np.meshgrid(t,x)
ax = fig.add_subplot(1,1,1, projection='3d')
surf = ax.plot_surface(X,Y,I, rstride=4, cstride=4, alpha=0.1)

适用于 x 和 t 是一维数组的情况。但是我很好奇将上面显示的示例数据建模为 3 维表面的任何好的方法,其中存在不均匀的网格。

1个回答

您的数据已经处于正确的形状,那么您无需创建meshgrid. 请参阅下面的代码

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


I = np.array([
    [10.55, 0., 0.],
    [0., 0., 0.01],
    [0.2, -0.1, 3.33],
    [0., 2.14, 0.],
    [0., 3.80, 0.],
    [9.02, 0., 0.]])

t = np.array([
    [0., 400., 1000.],
    [1., 300., 800.],
    [0., 500., 900.],
    [200., 400., 0.],
    [100., 700., 0.],
    [0., 0., 0.]])

x = np.array([
    [ 0.,  0.,  0.],
    [ 500., 1500., 1500.],
    [ 3000., 3000., 8000.],
    [ 3300., 4500., 0.],
    [ 6000., 6000., 0.],
    [ 7500., 0.,  0.]])

fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
surf = ax.plot_surface(x, t, I, rstride=1, cstride=1,
                       alpha=0.4, cmap="viridis")
plt.show()

这使得下面的情节

在此处输入图像描述