Я думаю ax.text()
делает то, что вы хотите.См. здесь для нескольких примеров.
Чтобы правильно вывести хорошее (простое для чтения) размещение текста, учитывая данные, может быть непросто.Наивный подход может выглядеть следующим образом (не тестировать код):
offset = [0, 0, 0.05]
for label in y_train.unique():
idx = (y_train==label)
posX = X['width'][idx].mean() + offset[0]
posY = X['height'][idx].mean() + offset[1]
posZ = X['color_score'][idx].mean() + offset[2]
ax.text(x=posX, y=posY, z=posZ, s=label, zdir=None)
Если вы используете панд, код может выглядеть примерно так:
X['labels'] = y_train
grouping = X.groupby('labels')
for label, group in grouping:
center = group[['width', 'height', 'color_score']].mean(axis=0).values
center += np.asarray(offset)
ax.text(x=center[0], y=center[1], z=center[2], s=label, zdir=None)