Matplotlib 3D Scatter дает сбивающее с толку сообщение об ошибке - PullRequest
0 голосов
/ 18 марта 2019

Я хочу установить цвет разных рассеивателей, и здесь появляется ошибка, как показано в следующем коде:

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 Ответ

1 голос
/ 18 марта 2019

Я не могу воспроизвести вашу ошибку, используя matplotlib 3.0.1.Однако вот несколько предложений.

Во-первых, matplotlib ожидает, что значения RGB [A] будут в диапазоне 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, чего следует избегать, поскольку отображение значений будет иметь приоритет в случае, если его длина совпадает с«х» и «у».Пожалуйста, используйте двумерный массив с одной строкой, если вы действительно хотите указать одно и то же значение RGB или RGBA для всех точек.

Как ясно сказано, при передаче одного цвета вы все равно должныиспользуйте 2D-массив для определения цвета, например ax.scatter(x,y,zs=z,c=[[0,0,0]])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...