ValueError: неверный аргумент RGBA: что является причиной этой ошибки?
Я пытаюсь создать трехмерную цветную гистограмму, используя идеи из этого поста.
Сначала я создаю трехмерную гистограмму со следующим кодом:
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()
Следующий вывод:
Теперь я пытаюсь раскрасить столбики, используя дословный код из этого поста stackru. Вот код:
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)
и все же ошибка сохраняется.
Я проверил сообщения stackru относительно Invalid RGBA argument
(например, это, это, это и это) и ничего из этого, кажется, не отвечает моей проблеме.
Я хочу знать, что может быть причиной этой ошибки. Я использую стандарт Anaconda
распределение для python
на Ubuntu Mate 16
,
Может ли быть так, что из-за недавних обновлений в python решение, как в оригинальном сообщении stackru, устарело?
2 ответа
Сообщение об ошибке вводит в заблуждение. Вы получаете 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()
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)
будет одинаково работать.
Тогда результат будет