Matplotlib 3D分散提供令人困惑的错误消息

时间:2019-03-18 11:51:26

标签: python matplotlib

我想设置不同散点的颜色,并出现错误,如以下代码所示:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np


points = np.array([[1,2,3]])
labels = np.array([1])
colors = [[255, 0, 0],[0, 255, 0],[0, 0, 255], [255, 255, 0],[255, 0, 255],[0,255,255],[128,255,128]]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

for i in range(0,len(points)):
    print('point and label')
    print(points[i], labels[i])
    color = colors[labels[i]-1]
    print([0,0,0])
    ax.scatter(points[i,0], points[i,1],zs=points[i,2],c=[0,0,0]) # work
    print(color)
    ax.scatter(points[i,0], points[i,1],zs=points[i,2],c=color) # error
    print('finish')
plt.savefig('a.jpg',format='jpg')

问题在于,如果我将c中的ax.scatter设置为[0,0,0],则它可以工作。但是,如果我将其设置为从我定义的colors中选择的列表,则会报告错误。

完整的打印消息如下所示(包括错误消息):

point and label
(array([1, 2, 3]), 1)
[0, 0, 0]
[255, 0, 0]
Traceback (most recent call last):
  File "plot.py", line 47, in <module>
    ax.scatter(points[i,0], points[i,1],zs=points[i,2],c=color) # error
  File "mypath/local/lib/python2.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 2362, in scatter
    xs, ys, s=s, c=c, *args, **kwargs)
  File "mypath/local/lib/python2.7/site-packages/matplotlib/__init__.py", line 1867, in inner
    return func(ax, *args, **kwargs)
  File "mypath/local/lib/python2.7/site-packages/matplotlib/axes/_axes.py", line 4293, in scatter
    .format(c.shape, x.size, y.size))
AttributeError: 'list' object has no attribute 'shape'

我的代码有什么问题以及如何设置3D散射的颜色?

谢谢!

1 个答案:

答案 0 :(得分:1)

我无法使用matplotlib 3.0.1重现您的错误。但是,这里有一些建议。

首先,matplotlib expects RGB[A] values to be in the range 0–1而不是0–255

第二,您真的需要循环处理点吗?您的代码可以简化为对scatter的一行调用:

points = np.random.random(size=(7,3))
colors = np.array([[1, 0, 0],[0, 1, 0],[0, 0, 1], [1, 1, 0],[1, 0, 1],[0,1,1],[0.5,1,0.5]])

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(points[:,0], points[:,1], zs=points[:,2], c=colors, s=100)

enter image description here

第三,如果必须一次通过一个点,则应该收到类似以下的警告:

  

'c'参数看起来像单个数字RGB或RGBA序列,其中   应避免使用价值映射,以防万一   长度与“ x”和“ y”匹配。请使用一个二维数组   如果您确实要为所有像素指定相同的RGB或RGBA值   点。

正如明确指出的那样,当传递单一颜色时,您仍应使用2D数组指定颜色,即ax.scatter(x,y,zs=z,c=[[0,0,0]])