我正在尝试使用this stackoverflow post中的想法创建3D彩色条形图。
首先,我用以下代码创建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 stackoverflow 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,this和this的stackoverflow帖子,但这些似乎都无法解决我的问题
我想知道是什么原因导致此错误。我正在Anaconda
上为python
使用标准Ubuntu Mate 16
分发。
难道是由于python中的最新更新,the original stackoverflow post中的解决方案变得过时了吗?
答案 0 :(得分:5)
该错误消息具有误导性。您收到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()
答案 1 :(得分:3)