ValueError: Invalid RGBA argument: What is causing this error?

ValueError: Invalid RGBA argument: What is causing this error?

我正在尝试使用以下想法创建 3D 彩色条形图:this Whosebug post

首先,我使用以下代码创建一个 3D 条形图:

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()

输出如下:

现在我尝试使用来自 this Whosebug post 的代码 verbatim 为条形图着色。这是代码:

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),但错误仍然存​​在。

我查看了关于 Invalid RGBA argument(例如 this,,this and )的 Whosebug 帖子,其中 none 似乎回答了我的问题。

我想知道是什么导致了这个错误。我在 Ubuntu Mate 16.

上使用 python 的标准 Anaconda 分布

会不会是由于 python 中的最新更新,the original Whosebug post 中的解决方案已过时?

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) 同样有效。

那么结果就是

错误消息具有误导性。您收到 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()