我想使用 matplotlib 创建一个分散的 3D 图,其投影表面看起来像这个演示,但使用我从 excel 创建的 CSV 文件,该文件在 3 列数字中具有 X Y Z 数据。
这是演示代码...
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3)
cset = ax.contourf(X, Y, Z, zdir='z', offset=-100, cmap=cm.coolwarm)
cset = ax.contourf(X, Y, Z, zdir='x', offset=-40, cmap=cm.coolwarm)
cset = ax.contourf(X, Y, Z, zdir='y', offset=40, cmap=cm.coolwarm)
ax.set_xlabel('X')
ax.set_xlim(-40, 40)
ax.set_ylabel('Y')
ax.set_ylim(-40, 40)
ax.set_zlabel('Z')
ax.set_zlim(-100, 100)
plt.show()
您可以使用csv.reader
加载数据,然后将它们映射到浮点数。然后,您需要将它们放入numpy的形状中。
import csv
from itertools import groupby
data = []
with open('my.csv') as my_csv:
csv_reader = csv.reader(my_csv)
for line in csv_reader:
data.append(map(float, line))
data.sort()
X, Z = [], []
for x, g in groupby(data, key=lambda line: line[0]):
X.append(x)
Y = []
new_Z = []
for y, gg in groupby(g, key=lambda line: line[1]):
Y.append(y)
new_Z.append(list(gg)[-1][2])
Z.append(new_Z)
X, Y = np.meshgrid(X, Y) # transform into 2D index numpy arrays
Z = np.array(Z) # transform into 2D values numpy array
编辑:忘记重塑值;更新了代码。