
Красные круги — это трехмерные точки, нанесенные с помощью Axes3D.scatter(). У них есть 3D позиция. Числа в их bbox отображаются с помощью Axes3D.add_artist(). Они являются производными от mpl.text.Text, то есть представляют собой 2D-объекты с фиксированными координатами области просмотра. Я хочу, чтобы фигуры были выровнены по кругам, чтобы экземплярам передавались соответствующие трехмерные координаты, чтобы они могли рисовать себя в правильных координатах области просмотра.
Этот пример не имеет реальной цели. , это только для того, чтобы попрактиковаться в 3D в Matplotlib и в том, как можно выравнивать 2D- и 3D-виджеты независимо от точки зрения. Мне было трудно читать документацию Matplotlib 3D. Кажется, не существует реальной отправной точки для постепенного изучения того, как использовать набор инструментов 3D. Моя текущая попытка каким-то образом работает, но это скорее случайность, чем логический метод.
Я думаю, мне нужно переопределить метод рисования 2D-текста и спроецировать 3D-координаты в плоскость 2D-окна просмотра, но я не могу сделать это правильно.
Мне пришлось искусственно масштабировать 2D-позиции, чтобы они лучше соответствовали кругам, только для того, чтобы создать изображение выше. Другого обоснования такое масштабирование не имеет, а без него цифры вообще не соответствуют кругам. Можете ли вы помочь мне понять, какой метод правильный?
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import proj3d
class Text2d_upd(mpl.text.Text):
text_kw = dict(fontsize=12, ha='center', va='center')
bbox = dict(boxstyle='circle', pad=0.3, facecolor='turquoise', alpha=0.5)
def __init__(self, x, y, z, *args, **kwargs):
self.p = x, y, z
kwargs = kwargs | self.text_kw
super().__init__(x, y, *args, bbox=self.bbox, **kwargs)
def draw(self, renderer):
# Convert 3D coords to 2D view coords
M = self.axes.M
x, y, z = proj3d.proj_transform(*self.p, M)
# Shift artist to 2D position
k = 5.4 #
Подробнее здесь: https://stackoverflow.com/questions/791 ... -transform
Мобильная версия