Как добавить цвет и легенду по меткам точек один за другим в python?

#python-3.x #matplotlib

Вопрос:

Я хочу разделить и раскрасить точки, val_lab(611,3) по их меткам,pred_LAB(611,)

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = plt.axes(projection = '3d')
ax.set_xlabel('L')
ax.set_ylabel('A')
ax.set_zlabel('B')
for i in range(0, len(val_lab)):
    ax.scatter3D(
        val_lab[i,0], 
        val_lab[i,1],
        val_lab[i,2],
        s = 8,
        marker='o',
        c = pred_LAB
        #cmap = 'rainbow'
    )
#ax.legend(*points.legend_elements(), title = 'clusters')  
plt.show()
 

Проблема в том, что он показывает ошибку,

аргумент c’ содержит 611 элементов, что неприемлемо для использования с » x » размером 1, «y» размером 1.

Однако, если в наборе данных всего десять точек,он может правильно отображать фигуру, я не знаю, как решить эту проблему, кроме того, как добавить легенду этой фигуры?

Ответ №1:

В вашем решении вы хотели бы заменить c = pred_LAB на c = pred_LAB[i] . Но вам не нужно использовать цикл for для построения данных. Вы можете просто использовать следующее:

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# generate random input data
val_lab = np.random.randint(0,10,(611,3))
pred_LAB = np.random.uniform(0,1, (611,))

# plot data
fig = plt.figure()
ax = plt.axes(projection = '3d')
ax.set_xlabel('L')
ax.set_ylabel('A')
ax.set_zlabel('B')

# create one 3D scatter plot - no for loop
ax.scatter3D(
    val_lab[:,0], 
    val_lab[:,1],
    val_lab[:,2],
    s = 8,
    marker='o',
    c = pred_LAB,
    cmap = 'rainbow',
    label='my points'
)
# add legend
plt.legend()
plt.show()
 

введите описание изображения здесь

Комментарии:

1. Спасибо за ваш ответ. Я однажды попробовал этот метод без цикла for, однако я не знаю,почему он показывает ошибку, ошибку ValueError: Недопустимый аргумент RGBA: masked_array(данные=[0.275191, 0.194905, 0.496005, 0.6390076836408018], маска=Ложь, значение fill_value=’?’, dtype=объект)

2. Ошибка, на которую вы ссылаетесь, — это новая ошибка, которая только что появилась?

3. да,я использую тот же код, но возникает эта ошибка

4. У вашей ошибки могут быть разные причины. Может быть, форма цветов может быть неправильной. Другим может быть то, что вы не используете допустимые значения RGBA.

5. Итак, есть ли какой-то способ сохранить функцию for-loop…если я покажу точку по очереди, это может сработать..