您好,我正在尝试绘制以下格式的颜色列表:

img = cv2.imread('./img/a.png')
ground = cv2.imread('./img/b.png')

descriptor = [img[ij] for ij in np.ndindex(ground.shape[:2]) if all(ground[ij])]
descriptor[0]
array([ 72,  70, 115], dtype=uint8)
我想得到一个像这样的图表:
python - 如何绘制颜色列表?-LMLPHP
为此,我使用以下方式的散点图:
fig = plt.figure()
axis = fig.add_subplot(1, 1, 1, projection="3d")
axis.scatter(descriptor[0],descriptor[0],descriptor[0], facecolors=descriptor, marker=".")
plt.show()
但是我收到以下错误:

但是如果我更改颜色列表是这样的:
descriptor = [list(img[ij]) for ij in np.ndindex(ground.shape[:2]) if all(ground[ij])]
descriptor[0]
[ 72,  70, 115]
我收到此错误:

如何像图表一样绘制列表?
谢谢
a = [np.random.randint(10,240,3) for _ in range(20)]
descriptor = a

最佳答案

给定描述符是一个二维数组,每个点包含[r,g,b]个值:

  • 您要为scatter()函数中所有3个x,y,z参数的每个点提供所有3个坐标。代替descriptor[0], descriptor[0], descriptor[0],您需要分别为x,y和z坐标的用户r,g和b值访问descriptor[:,0], descriptor[:,1], descriptor[:,2]
  • Matplotlib接受r,g,b值的元组的二维数组作为颜色,但是它们必须在[0,1]的范围内,因此color = descirptor/255

  • 这是我的代码:
    color = descriptor/255
    fig = plt.figure()
    axis = fig.add_subplot(111, projection = '3d')
    axis.scatter(descriptor[:,0],descriptor[:,1],descriptor[:,2], facecolor = color, marker = 'o')
    axis.set_xlim(0,255)
    axis.set_ylim(0,255)
    axis.set_zlim(0,255)
    
    带有以下示例数据:
    descriptor = np.array([[70,70,115],[112,255,95],[0,0,0],[255,255,255],[125,125,125],[255,0,0],[0,255,0],[0,0,255],[255,255,0],[0,255,255],[255,0,255]])
    
    输出:
    python - 如何绘制颜色列表?-LMLPHP
    编辑:给出您的示例数据
    a = [np.random.randint(10,240,3) for _ in range(20)]
    descriptor = a
    
    您需要先将a的数据类型更改为numpy数组(以使用多维索引),以便:
    descriptor = numpy.array(a)
    

    关于python - 如何绘制颜色列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62835320/

    10-11 07:37