python matplotlib中的4D图

时间:2019-07-17 22:40:27

标签: python matplotlib

我对python编程很陌生,所以我对此有些迷惑。

我正在尝试创建一个scatter3D图,该图绘制时间位置的X,Y,Z坐标,并使用颜色作为4维来绘制值。

我面临的问题是...我似乎无法将变量添加为颜色并添加颜色栏以寻求帮助。

我在这里解释背景:我已经为X,Y,Z创建了一个网格,并为X,Y,Z坐标的每个位置(这是一个修整数组)创建了一个用于计算值的数组。

它遵循一个循环,用每个X,Y,Z组合的值填充数组,然后尝试创建图形。

x <- f; ...

执行代码时,出现以下错误:

  

'c'参数包含15个元素,不适用于大小为3375的'x',大小为3375的'y'。

似乎当我将数组sum_total放在此处时,它无法识别它的形状。

我尝试将颜色添加为x = np.linspace(0, 15, 15) y = np.linspace(0, 30, 15) z = np.linspace(5, 45, 15) X, Y, Z = np.meshgrid(x, y, z) sumatorio = np.zeros(shape=(len(X[0, :, 0]), len(Y[:, 0, 0]))) sumatorio_1 = np.zeros(shape=(len(Y[:, 0, 0]), len(Z[0, 0, :]))) sum_total = np.zeros(shape=(len(X[:, 0, 0]), len(Y[0, :, 0]), len(Z[0, 0, :]))) c = np.array([]) for i in range(len(X[0, :, 0])): for j in range(len(Y[:, 0, 0])): sum_1 = X[0, i, 0] + Y[j, 0, 0] sumatorio[i, j] = sum_1 for k in range(len(Z[0, 0, :])): sum_2 = sum_1 ** 2.0 + Z[0, 0, k] + X[0, i, 0] sumatorio_1[j, k] = sum_2 sum_total[i, j, k] = sumatorio[i, j] + sumatorio_1[j, k] fig = plt.figure(figsize=(50.0, 50.0)) ax = fig.add_subplot(111, projection='3d') ax.scatter3D(X, Y, Z, c=sum_total, cmap='coolwarm', depthshade=0) fig.colorbar(sum_total) plt.title("DV at departure from Earth") ax.set_xlabel("Beginning") ax.set_ylabel("Time of flight") ax.set_zlabel("Time of flight 2") plt.show() ,这会给我返回带有颜色的图形,但是我认为没有为每个点都提供适当的颜色。

此外,当我使用c=np.ravel(sum_total)创建图形时,颜色栏会显示以下错误:

  

'numpy.ndarray'对象没有属性'get_array'

1 个答案:

答案 0 :(得分:0)

我已经检查了您的代码,并做了几件事。

首先,我添加了我猜想要使用的导入:

import matplotlib
matplotlib.use('Agg')

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

我还添加了一些变量,以使所有内容都更易于阅读,并且不太可能导致错误:

x = np.linspace(0, 15, 15)
y = np.linspace(0, 30, 15)
z = np.linspace(5, 45, 15)

X, Y, Z = np.meshgrid(x, y, z)

lenX = len(X[0, :, 0])
lenY = len(Y[:, 0, 0])
lenZ = len(Z[0, 0, :])

并在代码中实现了这些变量:

sumatorio = np.zeros(shape=(lenX, lenY))
sumatorio_1 = np.zeros(shape=(lenY, lenZ))
sum_total = np. zeros(shape=(lenX, lenY, lenZ))
c = np.array([])

for i in range(lenX):
    for j in range(lenY):
       sum_1 = X[0, i, 0] + Y[j, 0, 0]
       sumatorio[i, j] = sum_1
       sum_1_2 = sum_1 * sum_1

我更改了“ k for loop”的缩进:

        for k in range(lenZ):
            sum_2 = sum_1_2 + Z[0, 0, k] + X[0, i, 0]
            sum_total[i, j, k] = sumatorio[i, j] + sumatorio_1[j, k]

fig = plt.figure(figsize=(50.0, 50.0))
ax = fig.add_subplot(111, projection='3d')

ax.scatter3D(X, Y, Z, c=sum_total, cmap='coolwarm', depthshade=0)

fig.colorbar对我来说并没有什么意义,我不太确定您希望通过此实现什么,所以我将其注释掉。

#fig.colorbar(sum_total)

plt.title("DV at departure from Earth")
ax.set_xlabel("Beginning")
ax.set_ylabel("Time of flight")
ax.set_zlabel("Time of flight 2")

plt.show()

这段代码对我来说很好。我真的不明白它的作用,但是我敢肯定您对此有更多了解。