Построение четырехмерных данных с использованием matplotlib - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть трехмерный массив с размерами 1400x1400x29.Тем не менее, данные являются 4D, потому что для каждого x, y, z существует другое значение (4-е измерение).Я полагаю, что это можно сделать примерно так:

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

//some calculation that creates a 3D array  called "cube"

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for x in range(1400):
    for y in range(1400):
        for z in range(29):
            ax.scatter(x, y, z, c=cube[x,y,z])
plt.show()

Однако вышеприведенный скрипт выдает мне сообщение об ошибке «TypeError: объект типа 'numpy.float64' не имеет len ()"

РЕДАКТИРОВАТЬ 1 Полное сообщение об ошибке

File "cube.py", line 57, in <module>
    ax.scatter(x, y, z, c=cube[z , x , y], cmap=plt.hot())
  File "/pawsey/cle60up05/python/2.7.14/matplotlib/2.1.0/lib/python2.7/site-packages/matplotlib-2.1.0-py2.7-linux-x86_64.egg/mpl_toolkits/mplot3d/axes3d.py", line 2353, in scatter
    xs, ys, s=s, c=c, *args, **kwargs)
  File "/pawsey/cle60up05/python/2.7.14/matplotlib/2.1.0/lib/python2.7/site-packages/matplotlib-2.1.0-py2.7-linux-x86_64.egg/matplotlib/__init__.py", line 1710, in inner
    return func(ax, *args, **kwargs)
  File "/pawsey/cle60up05/python/2.7.14/matplotlib/2.1.0/lib/python2.7/site-packages/matplotlib-2.1.0-py2.7-linux-x86_64.egg/matplotlib/axes/_axes.py", line 4050, in scatter
    colors = mcolors.to_rgba_array(c)
  File "/pawsey/cle60up05/python/2.7.14/matplotlib/2.1.0/lib/python2.7/site-packages/matplotlib-2.1.0-py2.7-linux-x86_64.egg/matplotlib/colors.py", line 231, in to_rgba_array
    result = np.empty((len(c), 4), float)
TypeError: object of type 'numpy.float64' has no len()

Спасибо

1 Ответ

0 голосов
/ 25 февраля 2019

Таким образом, понимание cube - это numpy.ndarray формы (1400, 1400, 29), правильный способ построения трехмерного рассеяния будет следующим:

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

//some calculation that creates a 3D array  called "cube"

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = np.mgrid[:1400, :1400, :29]
ax.scatter(X, Y, Z, c=cube.ravel())
plt.show()

Вы должны вызывать ax.scatter с массивами, а не сскаляры.Кроме того, он принимает массив 1D в качестве c ввода, поэтому я назвал ravel().np.mgrid - это просто быстрый способ создания равномерных сеток N-размеров.Это эквивалентно np.meshgrid из np.arange.Я предлагаю вам прочитать документацию каждого из них, если вы хотите узнать больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...