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()
我正在尝试使用以下想法创建 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,
我想知道是什么导致了这个错误。我在 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()