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

2024-04-16 21:09:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用来自: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()

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

以下是输出:

enter image description here

现在,我尝试使用代码逐字从: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()

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

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

我已经检查过关于Invalid RGBA argument(例如thisthisthisthis)的stackoverflow帖子,但这些似乎都不能回答我的问题。

我想知道是什么导致了这个错误。我使用的是标准的Anaconda分布。

可能是由于python最近的更新,像the original stackoverflow post中的解决方案变得过时了吗?


Tags: importdatamatplotlibasnpzerosfigcm
2条回答

参数color需要一个1D数组,类似于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

错误信息是误导性的。您得到的值错误是因为colors的形状错误,而不是因为RGBA值无效。

为每个条着色时,应该是一个长度为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

相关问题 更多 >