ValueError: Неверный аргумент RGBA: что является причиной этой ошибки? - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь создать трехмерную цветную гистограмму, используя идеи из: этой публикации в стеке .

Сначала я создаю трехмерную гистограмму со следующим кодом:

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

samples = np.random.randint(91,size=(5000,2))

F = np.zeros([91,91])
for s in samples:
    F[s[0],s[1]] += 1

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x_data, y_data = np.meshgrid( np.arange(F.shape[1]),
                              np.arange(F.shape[0]) )
x_data = x_data.flatten()
y_data = y_data.flatten()
z_data = F.flatten()

ax.bar3d(x_data,y_data,np.zeros(len(z_data)),1,1,z_data )
plt.show()

Следующий вывод:

enter image description here

Теперь я пытаюсь раскрасить столбцы с помощью кода дословно из: этот стековый пост .Вот код:

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

samples = np.random.randint(91,size=(5000,2))

F = np.zeros([91,91])
for s in samples:
    F[s[0],s[1]] += 1

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x_data, y_data = np.meshgrid( np.arange(F.shape[1]),
                              np.arange(F.shape[0]) )
x_data = x_data.flatten()
y_data = y_data.flatten()
z_data = F.flatten()

dz = F
offset = dz + np.abs(dz.min())
fracs = offset.astype(float)/offset.max()
norm = colors.Normalize(fracs.min(), fracs.max())
colors = cm.jet(norm(fracs))

# colors = np.random.rand(91,91,4)

ax.bar3d(x_data,y_data,np.zeros(len(z_data)),1,1,z_data,color=colors )
plt.show()

Однако я получаю: ValueError: Invalid RGBA argument:

Теперь я не могу отладить Invalid RGBA argument, потому что я не понимаю, что является причиной ошибки.Я даже попытался использовать случайные цвета вместо colors = np.random.rand(91,91,4), но ошибка все еще сохраняется.

Я проверил сообщения stackoverflow относительно Invalid RGBA argument (например, это , это , это и это )и ничего из этого, похоже, не отвечает моей проблеме.

Я хочу знать, что может быть причиной этой ошибки.Я использую стандартный Anaconda дистрибутив для python на Ubuntu Mate 16.

Может ли быть так, что из-за недавних обновлений в python, решение, как в оригинальной записи stackoverflow , становитсяустарели?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Сообщение об ошибке вводит в заблуждение.Вы получаете ValueError, потому что форма colors неправильная, а не потому, что значение RGBA недопустимо.

При окрашивании каждого столбца одним цветом, color должен быть массивом длины Nгде N - количество баров.Поскольку имеется 8281 баров,

In [121]: x_data.shape
Out[121]: (8281,)

colors должны иметь форму (8281, 4).Но вместо этого, опубликованный код генерирует массив формы (91, 91, 4):

In [123]: colors.shape
Out[123]: (91, 91, 4)

Таким образом, чтобы решить проблему, используйте color=colors.reshape(-1,4).


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

samples = np.random.randint(91,size=(5000,2))

F = np.zeros([91,91])
for s in samples:
    F[s[0],s[1]] += 1

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x_data, y_data = np.meshgrid( np.arange(F.shape[1]),
                              np.arange(F.shape[0]) )
x_data = x_data.flatten()
y_data = y_data.flatten()
z_data = F.flatten()

dz = F
offset = dz + np.abs(dz.min())
fracs = offset.astype(float)/offset.max()
norm = colors.Normalize(fracs.min(), fracs.max())
colors = cm.jet(norm(fracs))

ax.bar3d(x_data,y_data,np.zeros(len(z_data)),1,1,z_data,color=colors.reshape(-1,4) )
plt.show()

enter image description here

0 голосов
/ 29 ноября 2018

Аргумент color ожидает одномерный массив, аналогичный всем остальным аргументам bar3d.

Следовательно, вам нужно заменить строку offset = dz + np.abs(dz.min())

на

offset = z_data + np.abs(z_data.min())

для вашего случая.dz здесь бесполезен (возможно, это было в связанном примере).
Обратите внимание, что color=np.random.rand(len(z_data),4) будет одинаково работать.

Тогда результат будет

enter image description here

...