值错误:无效的RGBA参数:是什么导致了这个错误?

29

我正在尝试使用来自以下stackoverflow帖子的想法创建一个3D彩色条形图:this stackoverflow 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()
以下是输出结果:

在此输入图片描述

现在我尝试使用来自这篇stackoverflow帖子的代码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有关的stackoverflow帖子(例如这个这个这个,以及这个),但似乎没有一个可以解决我的问题。

我想知道可能是什么导致了这个错误。我正在使用标准的Anaconda发行版,在Ubuntu Mate 16上运行python

由于Python的最近更新,可能会使得原始stackoverflow帖子中的解决方案变得过时,这可能是导致错误的原因吗?

2个回答

27

错误提示信息有误导性。你得到了一个 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


6

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

color参数期望一个1D数组,和bar3d的所有其他参数一样。

因此,您需要将这一行替换为offset = color + np.abs(color.min())

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

针对您的情况,dz在此处没有作用(可能在链接的示例中有用)。请注意,color=np.random.rand(len(z_data),4)同样可以起到作用。
然后结果将会是: enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接