首页 > 解决方案 > 使用 plot_trisurf 绘制三个列表但得到 IndexError

问题描述

我想从四个列表中绘制两个曲面图,它们都是相互独立的。

我试过这个:

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

X = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
Y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  
Z1 = [0.735, 0.735, 0.735, 0.735, 0.735, 0.735, 0.735, 0.735, 0.735, 0.735] # the elements here happens to be the same, but could be different
Z2 = [0.8623, 0.9461, 0.9341, 0.976, 0.982, 0.976, 0.976, 0.976, 0.976, 0.976]
X = np.array(X)
Y = np.array(Y)
Z1 = np.array(Z1)
Z2 = np.array(Z2)

X, Y = np.meshgrid(X,Y)

fig = plt.figure(figsize=(8,8))
ax1 = fig.add_subplot(121,projection='3d')
surf1 = ax1.plot_trisurf(X.flatten(),Y.flatten(),Z1.flatten(),cmap = cm.jet, antialiased=True)        
ax2 = fig.add_subplot(122,projection='3d')
surf2 = ax2.plot_trisurf(X.flatten(),Y.flatten(),Z2.flatten(),cmap = cm.jet, antialiased=True)        

但是,会弹出一个 IndexError 说“索引 40 超出轴 0 的范围,大小为 10”。

鉴于所有列表的长度均为 10,我认为“索引 40”可能是由于meshgrid,但是当我删除该行时,“qhull Delauney 三角测量计算”中还有另一个错误。

根据我的搜索,似乎大多数 3d 图都是基于函数的,即 z=f(x,y)。我不确定这里的错误是否是因为在我的情况下不存在这种关系。

先感谢您。

标签: pythonarraysnumpymatplotlib3d

解决方案


Meshgrid 改变 X,Y 的形状:

>>> X, Y = np.meshgrid(X,Y)
>>> X.shape, Y.shape
(10,10) (10,10)

但是 Z1 和 Z2 仍然有形状(10,)。所以要沿所有轴提供相同的维度,网格 Z1 和 Z2:

X, Y = np.meshgrid(X,Y)
Z1,Z2 = np.meshgrid(Z1, Z2)

你会得到正确的情节:

在此处输入图像描述


推荐阅读