ValueError:无效的RGBA参数:是什么导致此错误?

Ins*_*lue 5 python matplotlib rgba

我正在尝试使用来自以下堆栈的想法创建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()
Run Code Online (Sandbox Code Playgroud)

以下是输出:

在此处输入图片说明

现在,我尝试使用以下代码中的逐字逐字为这些条涂上颜色:this stackoverflow post。这是代码:

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()
Run Code Online (Sandbox Code Playgroud)

但是我得到: ValueError: Invalid RGBA argument:

现在,我无法调试,Invalid RGBA argument因为我不知道是什么导致了错误。我什至尝试使用随机颜色代替,colors = np.random.rand(91,91,4)但错误仍然存​​在。

我已经检查了关于Invalid RGBA argument(例如thisthisthisthis)的stackoverflow帖子,而这些似乎都无法回答我的问题。

我想知道什么可能导致此错误。我使用的是标准的Anaconda分配pythonUbuntu Mate 16

难道是由于python中的最新更新,原来的stackoverflow帖子中的解决方案变得过时了吗?

unu*_*tbu 7

该错误信息是令人误解的。您收到ValueError的原因是形状colors错误,而不是因为RGBA值无效。

在为每个条形上色时,颜色color应该是length的数组N,其中N是条形数。由于有8281个酒吧,

In [121]: x_data.shape
Out[121]: (8281,)
Run Code Online (Sandbox Code Playgroud)

colors应该具有形状(8281、4)。但是,相反,发布的代码生成形状数组(91、91、4):

In [123]: colors.shape
Out[123]: (91, 91, 4)
Run Code Online (Sandbox Code Playgroud)

因此,要解决此问题,请使用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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • @l'L'l 变量 `dz` 没有用,因此在不混淆读者方面将其省略会更有效。在内存方面,不先创建 2D 数组然后再创建另一个 1D 数组也更有效。然而,与创建 3D 绘图相比,这些操作是小菜一碟,因此人们不会注意到性能方​​面的任何差异。 (2认同)

Imp*_*est 6

color参数需要一个一维数组,类似于 的所有其他参数bar3d

因此,您需要更换线路 offset = dz + np.abs(dz.min())

经过

offset = z_data + np.abs(z_data.min())
Run Code Online (Sandbox Code Playgroud)

对于你的情况。dz在这里没有用(也许在链接的例子中)。
请注意,color=np.random.rand(len(z_data),4)这同样有效。

那么结果将是

在此处输入图片说明