在matplotlib 3D中绘制独立数据集

wgmfuz8q  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(117)

我对使用matplotlib绘制独立数据集感兴趣。为此,我在X、Y和Z列中加入了独立的数据坐标。
考虑下面的python代码-

import numpy as np
import matplotlib.pyplot as plt

X = np.array([[1, 2 ,5], [6, 1, 7]])
Y = np.array([[4, 6, 9], [7, 1, 5]])
Z = np.array([[5, 7, 4], [2, 1, 6]])

fig1, (ax) = plt.subplots(subplot_kw={"projection": "3d"})

ax.plot(X, Y, Z)

字符串
我相信对于二维数组,列表示单独的数据集,但行ax.plot(X, Y, Z)产生以下错误-

ValueError: operands could not be broadcast together with remapped shapes [original- 
>remapped]: (6,)  and requested shape (2,)
...
AttributeError: 'Line3D' object has no attribute '_verts3d'


我可以通过将ax.plot(X, Y, Z)替换为以下内容来生成所需的输出-

for i in range(X.shape[1]):
    ax.plot(X[:, i], Y[:, i], Z[:, i])


有没有办法避免循环。

ogsagwnx

ogsagwnx1#

TL;DR:ax.scatter可以,而ax.plot不可以;所以我们可以插值点并使用散点。该解决方案效率低下,但可以根据需要删除for循环。

例如,OP基于循环的解决方案的输出是:x1c 0d1x的数据
现在,让我们将OP原始代码中的ax.plot(X, Y, Z)行更改为ax.scatter(X, Y, Z)。为完整起见,如下所示:

import numpy as np
import matplotlib.pyplot as plt

X = np.array([[1, 2 ,5], [6, 1, 7]])
Y = np.array([[4, 6, 9], [7, 1, 5]])
Z = np.array([[5, 7, 4], [2, 1, 6]])

fig1, ax = plt.subplots(subplot_kw={"projection": "3d"})

ax.scatter(X.ravel(), Y.ravel(), Z.ravel())
plt.show()

字符串
输出量:



总的来说,ax.scatter的工作方式与ax.plot不同!
现在,如果我们简单地在线的端点之间插入几个点,我们可以获得与预期图相同的图。为了完整性,如下所示:

import numpy as np
import matplotlib.pyplot as plt

X = np.array([[1, 2 ,5], [6, 1, 7]])
Y = np.array([[4, 6, 9], [7, 1, 5]])
Z = np.array([[5, 7, 4], [2, 1, 6]])

N = 1000

interp_points = np.linspace(0, 1, N)

interp_points = interp_points.reshape(-1, 1)

# Interpolated values (total  count: N)
X_interp = X[:-1, :] + interp_points * (X[1:, :] - X[:-1, :])
Y_interp = Y[:-1, :] + interp_points * (Y[1:, :] - Y[:-1, :])
Z_interp = Z[:-1, :] + interp_points * (Z[1:, :] - Z[:-1, :])

fig1, ax = plt.subplots(subplot_kw={"projection": "3d"})

ax.scatter(X_interp.T.ravel(), Y_interp.T.ravel(), Z_interp.T.ravel(), s=0.1)   
plt.show()


输出量:



如果我们希望每一行都有不同的颜色,我们可以将一个颜色列表传递给ax.scatter,列表的长度=点的总数,列表中的前N个项目具有第一行的颜色,依此类推。因此,使用以下内容,我们得到:

ax.scatter(X_interp.T.ravel(), Y_interp.T.ravel(), Z_interp.T.ravel(), 
            color=['red'] * (N) + ['green'] * (N) + ['blue'] * (N), s=0.1)



它不使用for循环就完成了所需的绘图。

相关问题